开发者社区> 问答> 正文

Linux Rcu到底有没有锁?

3.14内核代码

rcu机制不是宣称无锁吗?
但是rcu_lock_acquire那句是个锁吗?怎么解释呢?求解惑
<include/linux/rcupdate.h>
806 static inline void rcu_read_lock(void)
807 {
808         __rcu_read_lock();
809         __acquire(RCU); 
810         rcu_lock_acquire(&rcu_lock_map);
811         rcu_lockdep_assert(rcu_is_watching(),
812                            "rcu_read_lock() used illegally while idle");
813 }

同文件 line 313 rcu_lock_acquire 定义如下
313 #ifdef CONFIG_DEBUG_LOCK_ALLOC
314 
315 static inline void rcu_lock_acquire(struct lockdep_map *map)
316 {
317 lock_acquire(map, 0, 0, 2, 1, NULL, _THIS_IP_);
318 }

lock_acquire的reference:
<kernel/locking/lockdep.h>
318 /*
319 * Acquire a lock.
320 *
321 * Values for "read":
322 *
323 * 0: exclusive (write) acquire
324 * 1: read-acquire (no recursion allowed)
325 * 2: read-acquire with same-instance recursion allowed
326 *
327 * Values for check:
328 *
329 * 0: disabled
330 * 1: simple checks (freeing, held-at-exit-time, etc.)
331 * 2: full validation
332 */
333 extern void lock_acquire(struct lockdep_map *lock, unsigned int subclass,
334 int trylock, int read, int check,
335 struct lockdep_map *nest_lock, unsigned long ip);
336 
337 extern void lock_release(struct lockdep_map *lock, int nested,
338 unsigned long ip);

展开
收起
a123456678 2016-06-28 11:52:47 2276 0
2 条回答
写回答
取消 提交回答
  • rcu_lock_acquire是用来给lockdep机制服务的, lockdep是一个做死锁检测的东西.

    RCU读侧是真无锁, 不用担心.

    2019-07-17 19:48:10
    赞同 展开评论 打赏
  • 我没有细看过rcu的实现,不过从命名上来说 read-copy-update 这种机制读应当是不加锁的,参考 kernel.org 的 whatisRCU 这篇说明,rcu_read_lock 应该只是做了个标记,表示这块内存正在被另一个 reader 读取,即使另一个 writer 执行了 update ,在其他 reader 执行 unlock 之前也不应该被释放。

    2019-07-17 19:48:10
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载