最近は、カーネルの内部ネットワーク コード、特にRPSコードについて勉強しています。ご存知のように、それについては多くの機能があります。ただし、やなどのSMP キュー処理に関するいくつかの機能に焦点を当てています。enqueue_to_backlog
process_backlog
enqueue_to_backlog
-と-の 2 つの関数を使用して、2 つのコア (または単一のコア) 間の同期について疑問に思いprocess_backlog
ます。
その関数では、A core(A) は、spin_lock
パケットをキューに入れinput_pkt_queue
、 core(B) の napi をスケジュールするために、他の core(B) の を保持します。また、A Core(B)は、core(B)へのspin_lock
スプライシングと napi スケジュールを単独で削除するための も保持します。input_pkt_queue
process_queue
spin_lock
キューの処理中に2つのコアが同じキューに相互にアクセスするのを防ぐために保持する必要があることはわかっています。
しかし、なぜ(または)spin_lock
で呼び出されるのか理解できません。割り込み(TH)が現在のコンテキスト(softirq、BH)をプリエンプトする場合、割り込みコンテキスト(TH)によるキューまたはコア(B)へのアクセスはないと思います。local_irq_disable
local_irq_save
rps_lock
- もちろん、napi struct は TH によって napi のスケジューリングのためにアクセスできますが、パケットをキューイングするまで irq を無効に保持します- では、なぜspin_lock
irq disable で呼び出されるのか疑問に思います。
タスクレットなどの他の BH で現在のコンテキスト (napi、softirq) をプリエンプトすることは不可能だと思います。本当ですか?そして、local_irq_disable がすべてのコアの irq を無効にするのか、それとも現在のコアの irq だけを無効にするのかを知りたいですか? 実は、カーネル開発に関する本を読んだことがありますが、プリエンプションについて十分に理解していないと思います。
spin_lock
rps プロシージャが を使用する理由を説明しlocal_irq_disable
ますか?