[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: CASSIOPEIA report



鈴木(康)です。
<200005181247.VAA01300@srapc342.sra.co.jp>の記事において
soda@sra.co.jpさんは書きました。

  | > 2) 割り込み処理ルーチンを動かすときに 割り込みレベル(IPL)をそもそも設定
  | > していないように見えます。
  | > 
  | > たとえば、
  | > 	_spllower(MIPS_SOFT_INT_MASK_0);
  | > 	softclock();
  | > 
  | > とか
  | >          _spllower(MIPS_SOFT_INT_MASK_0|MIPS_SOFT_INT_MASK_1);
  | >          DO_SIR(SIR_NET, netintr());
  | > 
  | > とかになっていないと他の割り込み(正確には INTR0?)が入らず、
  | > 割り込み処理は走り切ることになると思います。
  | 
  | はい。こちらのバグは、現在の MIPS port 全般にあります。

リプライもらえて嬉しいです。また的外れなことを書いてしまったかと...
不安になっていました。

  | (あと、cpu_intr() の先頭で、MIPS_INT_SR_IE を enable してないのも問題。)
  | 
  | a. cpu_intr の最初で MIPS_INT_SR_IE を enable する。

locore_mips3.S では、
        mtc0    zero, MIPS_COP_0_STATUS         # Reset exl, trap possible.
        jal     _C_LABEL(cpu_intr)
        nop
こうなっているので、ビットを立てないといけないということですね。

  | b. 各割り込みハンドラを走らせる前に、それぞれ適切に _spllower() する。

ですね。

  | c. cpu_intr() で、全部の割り込みを一度に処理するのではなく、
  |    一回の cpu_intr() では、最も優先順位の高い、割り込み level を
  |    一度処理するだけで抜ける。
  |    (これを行わずに b. を実現すると、負荷が高い時に、多重割り込みが
  |     かかりすぎて、kernel stack overflow の危険があると思います。)

IPL を high level から、段々にレベルを落としていくようにさえしておけば、
_spllower() する レベル 以上は多重割り込みされないと思います。

この前提で stack overflow の危険があるとすると、
stack のほうを大きくすべきなのではないでしょうか?

  | あと、ソフトウェア割り込みソースを、ssir という変数に設定するのは、
  | race condition の元なので、やめた方が良いと思います。
  | もし ssir のような単一の変数に割り込みソースを設定するのであれば、
  | ssir に触る最も高いハードウェア割り込み優先順位の spl で、
  | ssir を保護してやる必要があります。
  | cpu_intr() で ssir を触った後に _clrsoftintr(MIPS_SOFT_INT_MASK_1); 
  | しているのも問題で、これは ssir を触る前に実行した方が安全でしょう。
  | ssir という一つの変数に設定するよりは、むしろ、ソフトウェア割り込みレ
  | ベル毎に変数を用意した方が良いと思います。
  | splnet() で保護しないと危険じゃないかと思います。

なるほど。チェックしてみます。

  | > 1) vr の root に
  | >  
  | > vr_intr_establish(VR_INTR1, vrrtc_intr, sc);
  | > vr_intr_establish(VR_INTR0, vrip_intr, self);
  | > 
  | > の2 つのベクタが登録されているわけですが、
  | > 
  | > 1回の割り込みで、どちらかしか1回しか実行されないように見えます。
  | > 2つの割り込みが pending されたとき lost するんじゃないでしょうか?
  | 
  | 良く分かってませんが、こっちの問題はないんじゃないかな。
  | 割り込みハンドラの中でそれなりにアクションを起こさない限り、
  | 割り込みはかかったままになっているんじゃないでしょうか?

同じく良く分かってませんが、

software interrupt の cause bit は 明示的に落としているんですが、
hardware interrupt の cause bit を 落としているとこが見つからなかったので、
自動的に消滅するのかなと思いました。

$ grep "mtc0.*CAUSE" ../mips/mips/*.S
../mips/mips/locore.S:  mtc0    v0, MIPS_COP_0_CAUSE     # store back
../mips/mips/locore.S:  mtc0    v0, MIPS_COP_0_CAUSE     # store back
../mips/mips/locore.S:  mtc0    zero, MIPS_COP_0_CAUSE   # clear SOFT_INT bits

--
					鈴木 康司 @NECソリューションズ
					suz@hpc.bs1.fc.nec.co.jp
					TEL 042-333-6465