问题标签 [rcu]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
61 浏览

operating-system - 在 RCU 锁中读取旧版本或新版本都可以吗?

我有一个关于 RCU 锁的问题。

据我所知,RCU 允许一些读者(在宽限期之前开始并在宽限期结束)拥有旧版本或新版本。

查找所附图像。

在此处输入图像描述

因此,在黄色部分之前开始并在黄色部分内结束的读者可以读取更新(删除)的值或旧值。

但是,我的问题是为什么读者可以有不确定的价值?我认为所有的读者都应该有确定的价值,这意味着它不应该是旧价值或新价值。

我错过了什么吗?

谢谢。

0 投票
1 回答
197 浏览

c++ - 使用 CMake 编译 lib-urcu 的未定义参考

我将不胜感激有关如何解决以下问题的任何建议:

我的 CMakeLists.txt:

带有 liburcu 的部分是从https://github.com/markusa/netsniff-ng_filter/tree/master/src/cmake/modules复制的。

我检查了 LIBURCU_INCLUDE_DIR 和 LIBURCU_LIBRARY,它们似乎是正确的。

谢谢!

0 投票
1 回答
71 浏览

linux-kernel - 通过清除高位来准备内核地址?

Linux中是否有某种机制通过将高16位归零来毒化地址?

我正在调试 Intel x86-64 机器上的内核崩溃。导致崩溃的指令尝试访问以下地址0x880139f3da00

hash_buckets表有效:

将高位字设置为0xffff使地址有效并返回有效的数据结构:

结构由 RCU 操作更新(例如,很可能由这些 in 更新neigh_flush_dev())。那么,地址以这种方式变得无效的原因可能是什么?

我可以排除硬件缺陷(在两台机器上和不同的地址上看到)。系统运行 CentOS 7,内核 3.10.0-514.6.1.el7.centos.plus.x86_64 到 3.10.0-514.21.2.el7.centos.plus.x86_64。

更新

从另一个故障转储中,我看到skb一个 IPv6 数据包

写入前 0x8 字节时会崩溃

这可以解释为什么两个字节被覆盖(16 - 14)。

0 投票
1 回答
459 浏览

linux-kernel - 对于 Linux RCU,在宽限期内,新写入器是否有可能更新新数据?

我是 Linux 新手,正在学习 RCU 部分。我看到操作期间有一个宽限期。只是想知道一些新作家是否想在宽限期内更新数据,有可能吗?我想有两种方法:

  1. 在宽限期内,它带有写锁

  2. RCU 可以在 RCU 上工作,这意味着它在旧 RCU 上创建一个新 RCU,等待新 RCU 完成,然后旧 RCU 进入宽限期结束。

哪种方式适用于 Linux?

0 投票
1 回答
497 浏览

c - rcu_assign_pointer() 可以在 rcu_read_lock() 和 rcu_read_unlock() 之间使用吗?

一开始,我有一个 CPU 内核作为写入器来写入共享数据,一个内核作为读取器来读取共享数据。
我需要读者写回一些数据来共享数据。
我知道rcu_read_lock()/rcu_read_unlock()用于读者获取共享数据。但是我不确定读者写回共享数据会不会造成什么问题?

在阅读器中:

此代码有效吗?

0 投票
1 回答
80 浏览

java - 安装 RCU 以配置 Oracle 身份和管理

我想配置 OIM < Oracle Identity and Access Management ,所以我按照以下说明进行操作:

  1. fmw_12.2.1.3.0_infrastructure.jar的安装
  2. fmw_12.2.1.3.0_soa_quickstart.jar的安装
  3. fmw_12.2.1.3.0_idm.jar的安装

到现在一切都安装成功了,但关键是当我想创建一个存储库时,RCU,在给它数据库详细信息后,我只看到“AS Common Shemas”,实际上我也必须看到SOA SuitDM Schemas,但我看不到他们打勾。图片显示了正确的形式。我看不到下面的 2 个组件。(SOA 套装和 DM 模式)

为什么会出现问题?我附上了链接以进一步澄清它。我将不胜感激,如果有人可以帮助我,请。</p>

0 投票
1 回答
52 浏览

networking - 为什么内核函数:get_next_corpse 在找到一个 nf_conn 后会增加计数器?

我正在阅读内核源代码并尝试了解 ip conntrack 的机制。如何理解函数 get_next_corpse 增加发现要清理的 nf_conn 结构的计数器。

既然发现ct被清理了,为什么还需要atomic_inc(&ct->ct_general.use)呢?

0 投票
1 回答
327 浏览

linux - gcc 显示“需要本地字大小的存储/加载以实现原子性”以调用 `hlist_nulls_add_head_rcu`

我想打电话hlist_nulls_add_head_rcu来管理我的列表,但是 gcc 给出了很多错误消息,如下所示:

我认为最有用的信息是第一条:</p>

hlist_nulls_add_head_rcu然后在我的模块中调用的语句是:

参数类型正确,可能调用方式错误。有谁知道如何使用hlist_nulls_add_head_rcu

0 投票
1 回答
275 浏览

c - 无锁栈实现思路——目前已失效

我想出了一个想法,我正在尝试实现一个不依赖引用计数来解决 ABA 问题的无锁堆栈,并且还可以正确处理内存回收。它在概念上类似于 RCU,并且依赖于两个功能:将列表条目标记为已删除,以及跟踪遍历列表的读者。前者很简单,它只是使用指针的 LSB。后者是我在实现无限制无锁堆栈的方法上的“聪明”尝试。

基本上,当任何线程尝试遍历列表时,一个原子计数器 (list.entries) 会递增。当遍历完成时,第二个计数器 (list.exits) 会增加。

节点分配由 push 处理,释放由 pop 处理。

push 和 pop 操作与朴素的无锁堆栈实现非常相似,但必须遍历标记为要删除的节点才能到达未标记的条目。因此,推送基本上很像链表插入。

pop 操作类似地遍历列表,但它使用 atomic_fetch_or 在遍历时将节点标记为已删除,直到到达未标记的节点。

在遍历 0 个或多个标记节点的列表后,正在弹出的线程将尝试对堆栈的头部进行 CAS。至少有一个线程并发弹出会成功,在此之后所有进入堆栈的读取器将不再看到以前标记的节点。

成功更新列表的线程然后加载原子 list.entries,并且基本上自旋加载 atomic.exits,直到该计数器最终超过 list.entries。这应该意味着列表的“旧”版本的所有读者都已完成。然后线程简单地释放它从列表顶部交换的标记节点列表。

所以 pop 操作的含义应该是(我认为)不存在 ABA 问题,因为在所有使用它们的并发读者完成之前,被释放的节点不会返回到可用的指针池中,显然内存回收问题出于同样的原因,也会被处理。

所以无论如何,这是理论上的,但我仍然对实现摸不着头脑,因为它目前不起作用(在多线程情况下)。似乎我在免费问题之后得到了一些写作,但我在发现问题时遇到了麻烦,或者我的假设可能有缺陷并且它不起作用。

任何关于概念和调试代码方法的见解都将不胜感激。

这是我当前的(损坏的)代码(使用 gcc -D_GNU_SOURCE -std=c11 -Wall -O0 -g -pthread -o list list.c 编译):

0 投票
1 回答
390 浏览

c - 在 local_bh_disable()/local_bh_enable() 中使用 rcu_dereference() 是否安全?

-functionlocal_bh_disable改变每个 cpu(在 x86 和最近的内核的情况下)__preempt_countcurrent_thread_info()->preempt_count其他。

无论如何,这给了我们一个宽限期,所以我们可以假设在rcu_read_lock()里面做是多余的local_bh_disable()。确实:在早期的内核中,我们可以看到local_bh_disable()用于 RCU,rcu_dereference()随后在例如dev_queue_xmit-function 内部被调用。后来local_bh_disable()被替换为rcu_read_lock_bh(),最终变得比调用更复杂一些local_bh_disable()。现在看起来像这样:

还有足够多的文章描述 RCU API。在这里我们可以看到:

您是否需要将 NMI 处理程序、hardirq 处理程序和禁用抢占的代码段(无论是通过 preempt_disable()、local_irq_save()、local_bh_disable() 还是其他机制)视为显式 RCU 读取器?如果是这样,RCU-sched 是唯一适合您的选择。

这告诉我们在这种情况下使用RCU Sched API,所以rcu_dereference_sched()应该有所帮助。从这个综合表中我们可以意识到rcu_dereference()应该只在rcu_read_lock/ rcu_read_unlock-markers 内部使用。

但是,还不够清楚。我可以在/ -markersrcu_dereference()内部使用(在现代内核的情况下)而不担心会出现任何问题吗?local_bh_disablelocal_bh_enable

PS 在我的情况下,我无法更改local_bh_disable调用 eg的代码rcu_read_lock_bh,因此我的代码在 bh 已禁用的情况下运行。还使用了通常的 RCU API。因此,它充满了rcu_read_lock嵌套在local_bh_disable.