首页 > Linux Rcu到底有没有锁?

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);


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

【热门文章】
【热门文章】