如果(在多核系统上)我想要使核心模块功能一次仅由一个核运行,我应该使用什么?换句话说,避免两个核心同时运行相同的功能;也就是说,其中一个核心应该等待另一个核心完成运行该功能。
互斥?自旋锁?还有别的吗?
答案 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