#author("2017-08-12T22:49:21+09:00","default:afuruta","afuruta") * softirq 処理はいつ行われるのか [#i85da92c] |イベント・呼び出し|CENTER:処理が行われる所|>|>|h |~|CENTER:呼び出し元|CENTER:irq 処理の最後|CENTER:ksoftirqd|h |割り込み発生&br;(&ogdefs(irq_exit());)|CENTER:×|CENTER:○&sup([*1]);|CENTER:○&sup([*1]);| |&ogdefs(do_softirq());|CENTER:×: &ogdefs(in_interrupt());&sup([*2]);&br;○: (!&ogdefs(in_interrupt());)|CENTER:×|CENTER:×: &ogdefs(in_interrupt());&sup([*2]);&br;○: (!&ogdefs(in_interrupt());)| |&ogdefs(raise_softirq());&br;&ogdefs(raise_softirq_irqoff());|CENTER:×|CENTER:×|CENTER:× &ogdefs(in_interrupt());&sup([*2]);&br;○ (!&ogdefs(in_interrupt());)| ○: 処理する。×: 処理しない。 &sup([*1]); &ogrefs(CONFIG_IRQ_FORCED_THREADING); が定義されて構築された kernel に起動パラメータ &ogdefs(threadirqs,setup_forced_irqthreads); が付加されている場合は、ksoftirqd で softirq 処理が行われます。&ogrefs(CONFIG_IRQ_FORCED_THREADING); が定義されていないか、定義されて構築された kernel に起動パラメータ &ogdefs(threadirqs,setup_forced_irqthreads); が付加されていない場合は、softirq 処理に時間が掛かった場合、処理しきれない分を ksoftirqd にて処理する。 &sup([*2]); 割り込み処理中なので、いずれ割り込みの処理の終わりになります。そして softirq は処理されます。 ** ksoftirqd はいつ働く [#hf00b1ba] softirq 処理のために ksoftirqd thread が用意されています。&ogrefs(ksoftirqd,ksoftirqd,softirq.c);, &ogdefs(softirq_threads); 変数で状態を保持しています。&span(ConsoleIn){ps uaxww}; コマンドでプロセスリストを表示すると ksoftirqd/0, ksoftirqd/1, ... のような名前で CPU の数と同じ数だけ並ぶ kernel thread です。 #code(c,/softirq_threads/../^};$/,ogfileone:/kernel/softirq.c); softirq 処理が ksoftirqd で行われるのは &ogdefs(threadirqs,setup_forced_irqthreads); kernel parameter 未指定で低負荷状態では稀です。ksoftirqd が使われる条件は &ogdefs(__do_softirq()); に実装されています。 #code(c,/restart:/../wakeup_softirqd()/,end+=1,ogfileone:/kernel/softirq.c);