gpt4 book ai didi

linux-kernel - 是否可以通过 RCU 保护 _____ nf_conntrack find() 返回值?

转载 作者:太空宇宙 更新时间:2023-11-04 04:11:25 26 4
gpt4 key购买 nike

我想知道 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();

我认为如果要保护节点(h),必须使用call_rcu()而不是直接在destroy_conntrack()中释放。

最佳答案

我的问题是 h 可以被另一个进程释放 “h 安全吗?”,“如果 h 安全,它是如何工作的?”

这里是答案。

请注意,h 在所有上下文中都表示相同的含义(ct 只是由 h 计算得出)。

问。 h安全吗?

首先,必须定义“安全吗?”的含义。

一般来说,“指针是安全的”是指指针引用的地址是可访问的,不会被释放。因此,如果使用指针或指针成员,可以无违章地访问它们。

在此上下文代码中观看,

答案是“h可以被释放但没有发生违规!” (哇:哦)。

如果在 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

关于linux-kernel - 是否可以通过 RCU 保护 _____ nf_conntrack find() 返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56945504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com