raw_spinlock是什么意思?

4

我正在研究 raw_spinlock 结构体,它在 /usr/src/linux/include/linux/spinlock_types.h 中:

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_lockmagicowner_cpu*owner是什么意思呢?


请格式化您的问题以增加获得答案的机会。 - TheMeaningfulEngineer
1个回答

2

自旋锁

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

请参见Documentation/locking/spinlocks.txt

raw_spinlock

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

请参见LWN上的这篇文章

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

这样可以同时实现两个目标:

  • 避免频繁的锁定/解锁;
  • 避免长时间持有锁,防止其他人获取锁。

也请参见这篇文章

magicownerowner_cpu

当设置了CONFIG_SPINLOCK_DEBUG时,这些字段将被启用,并有助于检测常见的错误:

  • magic在创建自旋锁时设置为某个随机选择的常量(SPINLOCK_MAGIC,即0xdead4ead
  • ownerspin_lock()中设置为当前进程;
  • owner_cpuspin_lock()中设置为当前CPU ID。

spin_unlock() 检查是否在调用 spin_lock() 时进程和 CPU 与当前相同。

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

请参见kernel/locking/spinlock_debug.c


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接