spin_lock()
それはどのようにそしてどのように実行されたかに依存するでしょうspin_lock_irqsave()
。
たとえば、ロックが同じCPUによってすでにロックされているかどうかを判断し、ロックされている場合はカウンターをインクリメントすることができます。次に(ロックが解除されたときに)カウンタをデクリメントし、カウンタがゼロになった場合にのみロックを解除します。そうすれば、同じCPUがロックを複数回取得でき、デッドロックが発生することはありません。
spin_lock_irqsave()
また、IRQを無効にするだけで、実際にはロックを取得しないもの(たとえば、spin_lock()
事前に呼び出されたと想定/予期するもの)になる可能性もあります。この場合、ロック&x
は、IRQが無効にされた/無効にされたという事実を保存/追跡するのに便利な場所である可能性があります(spin_unlock()
フラグをチェックし、無効になっている場合はIRQを再度有効にします)。
spin_lock_irqsave()
ただし、 2番目のパラメーター()が必要な理由は考えられませんvals
。
もう1つの可能性は、これらの関数の名前が誤解を招きやすく、実際に行っていることとはまったく関係がないことです。例えば; spin_lock()
関数はピザを注文し、関数spin_lock_irqsave()
はサッカーの結果を表示する場合があります。
基本的に、これらの関数に関する情報は名前以外にないため、それらが何をするか(またはデッドロックがあるかどうか)を判断することは不可能です。