【问题标题】:kernel code sleeping while holding a spinlock内核代码在持有自旋锁时休眠
【发布时间】:2014-12-12 19:03:23
【问题描述】:

假设 Linux 驱动程序代码获得了一个自旋锁,在临界区中,一个函数调用会强制在驱动程序之上运行的进程进入睡眠状态。知道持有自旋锁会禁用相关处理器上的抢占,进程是否有可能唤醒,从而允许驱动程序代码释放自旋锁?

【问题讨论】:

    标签: linux-kernel kernel linux-device-driver kernel-module


    【解决方案1】:

    不,不允许在持有自旋锁时休眠。这样做的代码有问题。

    进程被唤醒的唯一方法是,如果在另一个内核上运行的代码做了一些事情来唤醒它(这意味着是的,如果只有一个内核,它肯定会死锁)。

    【讨论】:

    • "对于没有 CONFIG_SMP 和没有 CONFIG_PREEMPT 自旋锁编译的内核根本不存在。" reference
    【解决方案2】:

    虽然自旋锁其他进程无法唤醒它,但您可以尝试使用信号量进行此类切换

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      • 2013-10-11
      • 2011-03-23
      • 2014-02-22
      相关资源
      最近更新 更多