spin lock による排他制御

使い分けと詳細なドキュメントは Documentation/locking/spinlocks.txt, Documentation/DocBook/kernel-locking/index.html にあります。

spin lock の種類

lockunlockハードウエア割り込みsoftirqプリエンプション
spin_lock_irqsave()spin_unlock_irqrestore()退避 - 復旧
禁止 - 許可
禁止 - 許可[*1]禁止 - 許可[*2]
spin_lock_irq()spin_unlock_irq()禁止 - 許可禁止 - 許可[*1]禁止 - 許可[*2]
spin_lock()spin_unlock()そのままそのまま禁止 - 許可[*2]
spin_lock_bh()spin_unlock_bh()そのまま禁止 - 許可[*2]禁止 - 許可[*2]

[*1] ハードウエア割り込み禁止に連動しています。

[*2] カウンタを up/down しています。カウンタが初期値(多くの場合 0)より大きければ禁止、初期値に一致すれば許可となります。

どのコンテキストでも使える spin_lock_irqsave() と spin_unlock_irqrestore()

数多く有る spin lock のうちどのコンテキストでも使える spin_lock_irqsave(), spin_unlock_irqrestore() を主に使っています。spin_lock_irqsave() spin_unlock_irqrestore() は状況によってはしなくても良い割り込み許可フラグの保存・復帰を無条件にします。無駄な処理かもしれません。それでも、実行時間の無駄よりは、spin_lock_irqsave(), spin_unlock_irqrestore() を呼び出した元のコンテキストが何か留意しながらコードを書くより安全な方法を選んでいます。

spin_lock_irqsave()

spin_lock_irqsave() を呼び出し、関数から戻ってくると次の様な状態になっています。

spin_unlock_restore()

spin_unlock_irqrestore() を呼び出し、関数から戻ってくると次の様な状態になっています。

spin_lock_irqsave() と spin_unlock_irqrestore() の注意点

spin_lock_irqsave(), spin_unlock_irqrestore() の注意点を列挙します。


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS