![](/img/trans.png)
[英]nf_conntrack_helper_register of unregistred port reutrn error
[英]is possble protecting ___nf_conntrack_find() return value by RCU?
我想知道nf_conntrack_find_get()
真正通過Linux內核中的RCU保護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()
而不是在destroy_conntrack()
中直接釋放destroy_conntrack()
。
我的問題是,可以釋放h另一個進程,然后釋放“ h安全嗎?”,“如果h安全,它如何工作?”
這里是答案。
請注意,h在所有上下文中都具有相同的含義ct(ct僅由h計算)。
問:安全嗎?
首先,必須定義什么是“安全嗎”?
通常,“指針是安全的”是指可以訪問而不是釋放指針引用的地址。 因此,如果使用指針或指針成員,則可以在不沖突的情況下訪問它們。
在這種情況下觀看代碼
答案是“ h可以被釋放,但不會發生違反!” (哇:O)。
如果在destroy_conntrack()中使用call_rcu(),則h無法釋放util寬限期。 但ct可直接在destroy_conntrack()中釋放。
如何在沒有call_rcu()的情況下保護ct。(即使未發生沖突)。
訣竅是使用hlist_nulls(SLAB_TYPESAFE_BY_RCU)。
ct個節點位於SLAB_TYPESAFE_BY_RCU。 該內存位置可以隨時自由重用。
因此,節點始終具有相同的偏移量。 我們甚至可以將其釋放。
當然,必須保護一些限制。(內存屏障,原子操作,使用引用計數,檢查重用節點...)
您可以在下面的鏈接中閱讀更多詳細信息和限制
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.