问题标签 [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.
c++ - 使用 CMake 编译 lib-urcu 的未定义参考
我将不胜感激有关如何解决以下问题的任何建议:
我的 CMakeLists.txt:
带有 liburcu 的部分是从https://github.com/markusa/netsniff-ng_filter/tree/master/src/cmake/modules复制的。
我检查了 LIBURCU_INCLUDE_DIR 和 LIBURCU_LIBRARY,它们似乎是正确的。
谢谢!
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)。
linux-kernel - 对于 Linux RCU,在宽限期内,新写入器是否有可能更新新数据?
我是 Linux 新手,正在学习 RCU 部分。我看到操作期间有一个宽限期。只是想知道一些新作家是否想在宽限期内更新数据,有可能吗?我想有两种方法:
在宽限期内,它带有写锁
RCU 可以在 RCU 上工作,这意味着它在旧 RCU 上创建一个新 RCU,等待新 RCU 完成,然后旧 RCU 进入宽限期结束。
哪种方式适用于 Linux?
c - rcu_assign_pointer() 可以在 rcu_read_lock() 和 rcu_read_unlock() 之间使用吗?
一开始,我有一个 CPU 内核作为写入器来写入共享数据,一个内核作为读取器来读取共享数据。
我需要读者写回一些数据来共享数据。
我知道rcu_read_lock()
/rcu_read_unlock()
用于读者获取共享数据。但是我不确定读者写回共享数据会不会造成什么问题?
在阅读器中:
此代码有效吗?
java - 安装 RCU 以配置 Oracle 身份和管理
我想配置 OIM < Oracle Identity and Access Management ,所以我按照以下说明进行操作:
- fmw_12.2.1.3.0_infrastructure.jar的安装
- fmw_12.2.1.3.0_soa_quickstart.jar的安装
- fmw_12.2.1.3.0_idm.jar的安装
到现在一切都安装成功了,但关键是当我想创建一个存储库时,RCU,在给它数据库详细信息后,我只看到“AS Common Shemas”,实际上我也必须看到SOA Suit和DM Schemas,但我看不到他们打勾。图片显示了正确的形式。我看不到下面的 2 个组件。(SOA 套装和 DM 模式)
为什么会出现问题?我附上了链接以进一步澄清它。我将不胜感激,如果有人可以帮助我,请。</p>
networking - 为什么内核函数:get_next_corpse 在找到一个 nf_conn 后会增加计数器?
我正在阅读内核源代码并尝试了解 ip conntrack 的机制。如何理解函数 get_next_corpse 增加发现要清理的 nf_conn 结构的计数器。
既然发现ct被清理了,为什么还需要atomic_inc(&ct->ct_general.use)呢?
linux - gcc 显示“需要本地字大小的存储/加载以实现原子性”以调用 `hlist_nulls_add_head_rcu`
我想打电话hlist_nulls_add_head_rcu
来管理我的列表,但是 gcc 给出了很多错误消息,如下所示:
我认为最有用的信息是第一条:</p>
hlist_nulls_add_head_rcu
然后在我的模块中调用的语句是:
参数类型正确,可能调用方式错误。有谁知道如何使用hlist_nulls_add_head_rcu
?
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 编译):
c - 在 local_bh_disable()/local_bh_enable() 中使用 rcu_dereference() 是否安全?
-functionlocal_bh_disable
改变每个 cpu(在 x86 和最近的内核的情况下)__preempt_count
或current_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_disable
local_bh_enable
PS 在我的情况下,我无法更改local_bh_disable
调用 eg的代码rcu_read_lock_bh
,因此我的代码在 bh 已禁用的情况下运行。还使用了通常的 RCU API。因此,它充满了rcu_read_lock
嵌套在local_bh_disable
.