(マルチコア システムで) カーネル モジュール関数を一度に 1 つのコアだけで実行したい場合、何を使用すればよいですか? つまり、2 つのコアが同時に同じ機能を実行しないようにします。つまり、コアの 1 つは、もう 1 つのコアが関数の実行を完了するまで待機する必要があります。
ミューテックス?スピンロック?他の何か?
(マルチコア システムで) カーネル モジュール関数を一度に 1 つのコアだけで実行したい場合、何を使用すればよいですか? つまり、2 つのコアが同時に同じ機能を実行しないようにします。つまり、コアの 1 つは、もう 1 つのコアが関数の実行を完了するまで待機する必要があります。
ミューテックス?スピンロック?他の何か?
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 でウェイクアップする可能性があります。また、スピンロックは、コードが他のコアによって実行されないようにします。これは、Documentation/spinlock.txt ( https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/spinlocks.txt )の Linux カーネル ツリーで十分に文書化されています。
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