raw_spinlock是什么意思?

时间:2015-08-27 17:42:35

标签: linux linux-kernel synchronization kernel spinlock

我正在研究raw_spinlock中的typedef struct raw_spinlock { arch_spinlock_t raw_lock; #ifdef CONFIG_GENERIC_LOCKBREAK unsigned int break_lock; #endif #ifdef CONFIG_DEBUG_SPINLOCK unsigned int magic, owner_cpu; void *owner; #endif #ifdef CONFIG_DEBUG_LOCK_ALLOC struct lockdep_map dep_map; #endif } raw_spinlock_t; 结构:

raw_lock

我认为dep_map适用于依赖于体系结构的锁定,而break_lock是一种避免死锁的数据结构,但magicowner_cpu是什么,*owner--ignore-installed是什么意思?

1 个答案:

答案 0 :(得分:2)

spinlock

spinlock是内核代码中自旋锁的公共API。

请参阅Documentation/locking/spinlocks.txt

raw_spinlock

raw_spinlock是普通自旋锁的实际实现。在非RT内核上,spinlock只是raw_spinlock的包装器。在RT内核上,spinlock并不总是使用raw_spinlock

请参阅LWN上的this article

arch_spinlock

arch_spinlock是自旋锁实现的特定于平台的部分。 raw_spinlock通常与平台无关,并将低级操作委派给arch_spinlock

lockdep_map

lockdep_map是锁定正确性验证器的依赖关系图。

请参阅Documentation/locking/lockdep-design.txt

break_lock

在SMP内核上,当一个CPU上的spin_lock()在另一个CPU上保持锁定时开始循环时,它会将此标志设置为1。另一个持有锁的CPU可以使用spin_is_contended()定期检查此标记,然后调用spin_unlock()

这允许同时归档两个目标:

  • 避免频繁锁定/解锁;
  • 避免长时间保持锁定,防止他人获得锁定。

另见this article

magicownerowner_cpu

设置CONFIG_SPINLOCK_DEBUG时会启用这些字段并帮助检测常见错误:

  • magic设置为创建自旋锁时随机选择的常量(SPINLOCK_MAGIC0xdead4ead
  • owner设置为spin_lock();
  • 中的当前流程
  • owner_cpu设置为spin_lock()中的当前CPU ID。

spin_unlock()检查当前进程和CPU与调用spin_lock()时的进程和CPU相同时调用它。

spin_lock()检查magic是否等于SPINLOCK_MAGIC,以确保调用者传递指向正确初始化螺旋锁的指针,并且(希望)没有发生内存损坏。

请参阅kernel/locking/spinlock_debug.c