softirq 処理はいつ行われるのか †softirq に登録 (open_softirq()) した関数が raise_softirq(), raise_softirq_irqoff() で実行保留状態になった後、実行される状況は次の表のとおりです。tasklet, timer とも softirq に登録した関数の処理として実装されているので、これらが実行される状況だとも言えます。
○: 処理する。×: 処理しない。-: 組み合わせ上の空き。 [*1] CONFIG_IRQ_FORCED_THREADING が定義されて構築された kernel に起動パラメータ threadirqs が付加されている場合は、ksoftirqd で softirq 処理が行われます。CONFIG_IRQ_FORCED_THREADING が定義されていないか、定義されて構築された kernel に起動パラメータ threadirqs が付加されていない場合は、softirq 処理に時間が掛かった場合、処理しきれない分を ksoftirqd にて処理します。 [*2] 割り込み処理の最後または、呼び出したコンテキスト中で制限時間 MAX_SOFTIRQ_TIME または、繰り返し制限回数 MAX_SOFTIRQ_RESTART 以内に終わらなければ、ksoftirqd thread で処理されます。 [*3] in_interrupt() が真の場合、実行されません。in_interrupt() は irq_count() で (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK | NMI_MASK)) という実装がされています。ハードウエア割り込みの許可禁止関数、softirq の許可禁止関数を操作した結果による許禁止状態も in_interrupt() の結果に反映されています。 [*4] irq_exit() 内で直前にある preempt_count_sub() にて割り込み処理中状態から脱出する(カウンタを減じる)処理があります。殆どの状況で (!in_interrupt()) が真になります。 ksoftirqd はいつ働く †softirq 処理のために ksoftirqd thread が用意されています。ksoftirqd, softirq_threads 変数で状態を保持しています。ps uaxww コマンドでプロセスリストを表示すると ksoftirqd/0, ksoftirqd/1, ... のような名前で CPU の数と同じ数だけ並ぶ kernel thread です。
|
747
748
749
750
751
752
| - | | | | ! |
|
softirq 処理が ksoftirqd で行われるのは threadirqs kernel parameter 未指定(または無効)で低負荷状態では稀です。ksoftirqd が使われる条件は __do_softirq() に実装されています。
割り込み処理の最後で softirq を処理する時間は 2ms (MAX_SOFTIRQ_TIME), softirq 処理中に新たに保留状態になった softirq を処理し尽くす様に繰り返す回数は 10 回 (MAX_SOFTIRQ_RESTART) になっています。これを超えた場合は、ksoftirqd thread の中で実行されることになります。コメントを読むと、経験的に決まった値のようです。割り込み応答時間を短くしたいならば、調整の余地がありそうな定数でしょう。
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
| - | | | | | | | | | | | ! |
|
__do_softirq() 関数中にある h->action(h); が softirq 処理関数呼び出しです。保留している softirq 処理が残り続けると restart: ラベルを回るループが回ります。ループは MAX_SOFTIRQ_TIME, MAX_SOFTIRQ_RESTART で回る回数が制限され、制限に達すると wakeup_softirqd() が呼ばれ残りは ksoftirqd thread で行われます。
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
| - | | | | | | | | - | | | ! | | | | | | | | | | | | | | | | - | | | | | | | | | | | | | - | | | | ! | | ! | | | | | - | | | | | ! | | | | | | ! |
|