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_lock_acquire是用来给lockdep机制服务的, lockdep是一个做死锁检测的东西.
RCU读侧是真无锁, 不用担心.
我没有细看过rcu的实现,不过从命名上来说 read-copy-update 这种机制读应当是不加锁的,参考 kernel.org 的 whatisRCU 这篇说明,rcu_read_lock 应该只是做了个标记,表示这块内存正在被另一个 reader 读取,即使另一个 writer 执行了 update ,在其他 reader 执行 unlock 之前也不应该被释放。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。