【问题标题】:How Linux implement the 'queue spin lock'?Linux 如何实现“队列自旋锁”?
【发布时间】: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


    【解决方案1】:

    您正在查看的代码是这种情况的#else:

    #if !defined(CONFIG_GENERIC_LOCKBREAK) || defined(CONFIG_DEBUG_LOCK_ALLOC)
    /*
     * The __lock_function inlines are taken from
     * include/linux/spinlock_api_smp.h
     */
    #else
    ...
    

    默认情况下,在 x86 上,CONFIG_GENERIC_LOCKBREAK 未定义,因此编译器不会编译该代码(即在#else 子句中)。锁定ifdefs 的迷宫有很多潜在的路径。所采用的确切路径取决于您的架构以及您在.config 中所做的任何自定义选择。

    【讨论】:

    • 我知道,但是换一种定义,__raw_spin_lock 调用do_raw_spin_lock,基本上是一样的行为,对吧?我仍然没有看到队列在哪里。
    • include/linux/spinlock.h 中查看do_raw_spin_lock。调用arch_spin_lock,其中一种实现在include/asm-generic/qspinlock.h
    • 好的,我明白了。我不知道为什么 LXR 没有把这里的do_raw_spin_lock 当作一个定义,所以我错过了它......非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-12-29
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2020-03-27
    相关资源
    最近更新 更多