現在私が使用しているカーネルには3つのspin_lock関数があります。
- スピンロック
- スピンロック割り込み
- スピンロック割り込み保存
私はそのうちの2つだけを扱う貢献(Linuxドキュメントを含む)だけを見つけました。
回答や説明は不明瞭または矛盾する可能性があり、説明が間違っているというコメントも含めることができます。このため、概要を把握することは困難です。
割り込みコンテキストでは、単純なspin_lock()がデッドロックを引き起こす可能性があるなど、いくつかの基本は私には明らかです。しかし、このトピックの完全な説明を提供していただきありがとうございます。
理解すべき事項:
- いつどのバージョンを使用する必要がありますか、いつ使用しないでください。
- より安全なバージョンを使用する必要はありませんが、パフォーマンスが低下しない場合はいつですか?
- 特定の状況で特定のバージョンを使用するのはなぜですか?
ベストアンサー1
第5章に簡単な説明があります。並行性と競争条件Linuxデバイスドライバ、第3版
void spin_lock(spinlock_t *lock);
void spin_lock_irqsave(spinlock_t *lock, unsigned long flags);
void spin_lock_irq(spinlock_t *lock);
spin_lock_irqsave
スピンロックを取得する前に割り込みを無効にします(ローカルプロセッサでのみ)。以前の割り込みステータスはに保存されますflags
。プロセッサが他の割り込みを無効にしたことがないと確信している場合(つまり、スピンロックが解除されたときに割り込みを有効にする必要があると確信している場合)、トレースフラグなしspin_lock_irq
で使用できます。
spin_lock_irq*
割り込みコンテキストでスピンロックを維持したい場合は、これらの機能が重要です。その理由は、スピンロックがローカルCPUによって保持され、ローカルCPUがスピンロックをロックしようとする割り込みを処理するとデッドロックが発生するためです。