Chinaunix
标题:
linux中conntrack 使用rcu锁的问题
[打印本页]
作者:
lunixwh
时间:
2015-01-15 14:57
标题:
linux中conntrack 使用rcu锁的问题
linux中ct的遍历使用了锁,但是释放却没有用call_rcu 和 sync_rcu(简写),而rcu_read_lock rcu_read_unlock是用于开抢占和关抢占的,
问题1:那么我释放ct用引用计数,不用rcu的两个函数,那么为啥遍历还用加rcu锁呢?
问题2:rcu_dereference 这个用于加内存屏障什么的,为甚要用时也要加rcu_read_lock锁呢?
问题3:3.17的linux内核,ct在confirm时为什么加local_bh_disable,插入hash表时有加hash锁啊?
求推荐关于锁的文章或者资料,不胜感激!!!
作者:
breakCU
时间:
2015-01-15 17:03
我的理解:
问题1:这个可以参考一下skb释放,是一个道理。
问题2:这两个保护的对象不同
问题3:同2,表需要保护,插入的元素也需要保护。
作者:
lunixwh
时间:
2015-01-15 17:25
回复
2#
breakCU
感谢你回答问题,但你能说出点原理性的根据吗
作者:
breakCU
时间:
2015-01-15 18:08
原理啊,就是同步呗。为了同步就这么干了。
lunixwh 发表于 2015-01-15 17:25
回复 2# breakCU
作者:
lunixwh
时间:
2015-01-15 18:35
回复
4#
breakCU
你还是出去溜达溜达吧
作者:
breakCU
时间:
2015-01-15 19:21
呵呵,我只是不想打那么多字了,自己去找你认为的原理。
lunixwh 发表于 2015-01-15 18:35
回复 4# breakCU
作者:
goter
时间:
2015-01-18 22:58
linux中ct的遍历使用了锁,但是释放却没有用call_rcu 和 sync_rcu(简写),而rcu_read_lock rcu_read_unlock是用于开抢占和关抢占的,
问题1:那么我释放ct用引用计数,不用rcu的两个函数,那么为啥遍历还用加rcu锁呢?
释放时候不需要用call_rcu和sync,因为ct是从slab分配的(而且有SLAB_DESTROY_BY_RCU标记),
ct对应的内存不会真的被释放,只会被下一个新分配的ct继续使用,而__nf_conntrack_find_get对重复使用的内存有判断。
PS,问问题要有问问题的态度,即使别人可能没有解决你的问题。就这样了,你自己揣摩去吧,能不能搞明白就看你自己了。
作者:
lunixwh
时间:
2015-01-24 15:32
回复
7#
goter
你说ct内存没释放就是早早有个内存池,用完了还回去不释放,我理解,但我疑惑的是不用call_rcu的函数那么我还用read_lock干什么,这个就是确定临界区的,完全只互斥写端就可以了。
第二个问题你怎么看?
我觉得楼上那个人就是个不求甚解的人,一下午回复问题这么快,还是上班时间,又不是好好回答问题,纯粹跟我吓扯淡。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2