- 论坛徽章:
- 36
|
这里有有这样一个问题,我现在 2.6.24 的源码中看到在向用户空间输出 conntrack 信息的时候:- static void *ct_seq_start(struct seq_file *seq, loff_t *pos)
- {
- read_lock_bh(&nf_conntrack_lock);
- return ct_get_idx(seq, *pos);
- }
- static void ct_seq_stop(struct seq_file *s, void *v)
- {
- read_unlock_bh(&nf_conntrack_lock);
- }
复制代码 在 start 和 stop 进行了加锁和解锁,而 seq_read 的实现中是有 copy_to_user 调用的,这个调用有可能引起 sleep。这个 sleep 对读写锁没有影响吧,如果使用 spinlock 的话,内核就会抱怨。
因此,最新内核的 conntrack 在使用 spinlock 作为全局锁之后,其对应的 seq_start 和 seq_stop 实现改变了:
92static void *ct_seq_start(struct seq_file *seq, loff_t *pos)
93 __acquires(RCU)
94{
95 rcu_read_lock();
96 return ct_get_idx(seq, *pos);
97}
98
99static void *ct_seq_next(struct seq_file *s, void *v, loff_t *pos)
100{
101 (*pos)++;
102 return ct_get_next(s, v);
103}
104
105static void ct_seq_stop(struct seq_file *s, void *v)
106 __releases(RCU)
107{
108 rcu_read_unlock();
109}
改成使用 rcu 了。 |
|