RCU基本的接收,参考https://www.ibm.com/developerworks/cn/linux/l-rcu/
下面主要分析几个问题:
1. 多个cpu,多写者条件下,这个如何防止错乱 ?
struct fib_table *fib_new_table(struct net *net, u32 id)
{
struct fib_table *tb;
unsigned int h;
if (id == 0)
id = RT_TABLE_MAIN;
tb = fib_get_table(net, id);
if (tb)
return tb;
tb = fib_hash_table(id);
if (!tb)
return NULL;
h = id & (FIB_TABLE_HASHSZ - 1);
hlist_add_head_rcu(&tb->tb_hlist,
&net->ipv4.fib_table_hash[h]);
return tb;
}
这个问题,原因部分查明:fib_new_table 大部分是被rtnl_register注册的函数调用的,这些函数之间有锁机制。路由netlink收到报文处理函数处理如下
static void rtnetlink_rcv(struct sk_buff *skb)
{
rtnl_lock();
netlink_rcv_skb(skb, &rtnetlink_rcv_msg);
rtnl_unlock();
}
阅读(1819) | 评论(0) | 转发(0) |