【发布时间】:2016-01-18 21:28:29
【问题描述】:
根据http://www.phoronix.com/scan.php?page=news_item&px=queue-spinlocks-linux-4.2 的文章,从 4.2 版本开始,Linux 内核将具有队列自旋锁。但是在4.4版本中,我通过spin_lock的实现,发现他们在kernel/locking/spinlock.c中实现了这样的自旋锁:
void __lockfunc __raw_##op##_lock(locktype##_t *lock) \
{ \
for (;;) { \
preempt_disable(); \
if (likely(do_raw_##op##_trylock(lock))) \
break; \
preempt_enable(); \
\
if (!(lock)->break_lock) \
(lock)->break_lock = 1; \
while (!raw_##op##_can_lock(lock) && (lock)->break_lock)\
arch_##op##_relax(&lock->raw_lock); \
} \
(lock)->break_lock = 0; \
} \
在do_raw_spin_trylock 中有一个cmpxchg,所以基本上它只是一个 TATAS 自旋锁。
但是,当我深入挖掘时,我发现do_raw_spin_lock 将进入一个函数queued_spin_trylock 并且lock 变量的类型变为qspinlock。那么队列旋转在哪里?它是隐藏在某个地方还是只是等待未来的实施?
要在源代码中搜索标识符,这里是工具:http://lxr.free-electrons.com/
【问题讨论】:
标签: linux-kernel spinlock