1つのプロセッサで、同じスレッドで、最初にraw_spin_lock()が呼び出され、次にhrtimerが開始され、再びraw_spin_lock()に戻ってそこでスピンします。hrtimer割り込みハンドラ関数では、raw_spin_unlock()が呼び出されます。
これによりデッドロックが発生しますか?raw_spin_lock()でスピンすると、割り込みが無効になりますか?
1つのプロセッサで、同じスレッドで、最初にraw_spin_lock()が呼び出され、次にhrtimerが開始され、再びraw_spin_lock()に戻ってそこでスピンします。hrtimer割り込みハンドラ関数では、raw_spin_unlock()が呼び出されます。
これによりデッドロックが発生しますか?raw_spin_lock()でスピンすると、割り込みが無効になりますか?
raw_spin_lock_irq()
raw_spin_lock_irqsave()
ローカル割り込みを無効にしますが、他の CPU での割り込みは引き続き発生する可能性があります。raw_spin_lock()
ではない。
ローカル割り込みを有効にしてスピン ロックを不用意に使用すると、割り込みハンドラが既に保持されているスピン ロックをロックしようとすると、デッドロックが発生する可能性があります。同じ理由で、私が言及した関数はどれも再入可能ではありません。ロックの所有者がロックを解除することはできません。ただし、この場合は ISR がロックを解放するため、デッドロックは問題になりません。
また、スピンロックを使用してこのような珍しい方法で達成しようとしているように見えることを行うように設計された完了変数も確認する必要があると思います。これを参照し、wait_on_completion(_interruptible)(_timeout)()
ここで関数も参照してください。
スピン ロックの詳細については、こちらを参照してください。