Chinaunix首页 | 论坛 | 博客
  • 博客访问: 94458
  • 博文数量: 19
  • 博客积分: 1471
  • 博客等级: 上尉
  • 技术积分: 272
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-09 19:48
文章分类

全部博文(19)

文章存档

2011年(2)

2010年(17)

分类: LINUX

2010-07-09 20:09:22

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) |
0

上一篇:Netfilter 分析

下一篇:e1000驱动分析

给主人留下些什么吧!~~