我想知道nf_conntrack_find_get()
RCU 在 linux 内核中真正保护 ct 指针。
Read-Copy-Update(RCU) 可以在节点更新时保护访问(读取)节点 rcu_read_side 临界区。但是,这并不意味着保护节点。
nf_conntrack_find_get()
打电话___nf_conntrack_find
。
__nf_conntrack_find
返回h
(rcu 药水)。
但是另一个进程可以访问相同的 h 和free(h)
.
在这个时候,最终我认为 ct 不受保护。
h
用于计算偏移并获取 ct 指针。
我们可以思考h
还是ct
安全?
下面是代码..
/net/netfilter/nf_conntrack_core.c:
__nf_conntrack_find_get() {
rcu_read_lock();
h = ____nf_conntrack_find(net, zone, tuple, hash);
if (h) {
// RCU can't protect free h. only ensures to read old copy.
// If another processor free same h, h is freed.
// is really h available next line?
ct = nf_ct_tuplehash_to_ctrack(h);
....
}
}
rcu_read_unlock();
我认为如果要保护 node(h),必须使用call_rcu()
而不是直接 free in destroy_conntrack()
。