Mutex | Spinlock | ???在LKM

时间:2013-08-10 16:07:18

标签: c linux kernel kernel-module

如果(在多核系统上)我想要使核心模块功能一次仅由一个核运行,我应该使用什么?换句话说,避免两个核心同时运行相同的功能;也就是说,其中一个核心应该等待另一个核心完成运行该功能。

互斥?自旋锁?还有别的吗?

2 个答案:

答案 0 :(得分:3)

你需要使用spinlock()的变体,即raw_spin_lock_irqsave(),raw_spin_lock_irqrestore()(https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/spinlock.h#n188),而不是mutex()因为它们可以睡眠,所以它们可能会唤醒其他一些CPU。并且spinlock将确保您的代码不会被其他内核执行。在Documentation / spinlock.txt(https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/spinlocks.txt)的Linux内核树中已经有很好的文档记录。

答案 1 :(得分:3)

由于rakib已经建议使用自旋锁,我将更多地解释如何使用自旋锁。

设置自旋锁之后,例如

static DEFINE_SPINLOCK(your_lock);

您可以使用spin_lock_irqsave / spin_lock_irqrestore简单地包装函数的内容,例如:

static void function_to_protect()
{
    unsigned int flags;
    spin_lock_irqsave(&your_lock, flags);
    /* function body here */
    spin_lock_ireqrestore(&your_lock, flags);
}

如果您确定中断处理程序不会触及您的锁定,您可以选择使用较轻的权重函数spin_lock和spin_unlock并省略flags变量。

参考:https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/spinlocks.txt