簡體   English   中英

是否可以通過RCU保護___ nf_conntrack_find()返回值?

[英]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指針。

我們可以認為hct是安全的嗎?

下面是代碼。

/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。 該內存位置可以隨時自由重用。

因此,節點始終具有相同的偏移量。 我們甚至可以將其釋放。

當然,必須保護一些限制。(內存屏障,原子操作,使用引用計數,檢查重用節點...)

您可以在下面的鏈接中閱讀更多詳細信息和限制

https://github.com/westerndigitalcorporation/RISC-V-Linux/blob/master/linux/Documentation/RCU/rculist_nulls.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM