[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: CASSIOPEIA report
> 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 する。
b. 各割り込みハンドラを走らせる前に、それぞれ適切に _spllower() する。
c. cpu_intr() で、全部の割り込みを一度に処理するのではなく、
一回の cpu_intr() では、最も優先順位の高い、割り込み level を
一度処理するだけで抜ける。
(これを行わずに b. を実現すると、負荷が高い時に、多重割り込みが
かかりすぎて、kernel stack overflow の危険があると思います。)
とする必要があるように思います。
あと、ソフトウェア割り込みソースを、ssir という変数に設定するのは、
race condition の元なので、やめた方が良いと思います。
もし ssir のような単一の変数に割り込みソースを設定するのであれば、
ssir に触る最も高いハードウェア割り込み優先順位の spl で、
ssir を保護してやる必要があります。
cpu_intr() で ssir を触った後に _clrsoftintr(MIPS_SOFT_INT_MASK_1);
しているのも問題で、これは ssir を触る前に実行した方が安全でしょう。
ssir という一つの変数に設定するよりは、むしろ、ソフトウェア割り込みレ
ベル毎に変数を用意した方が良いと思います。
それから、mips/mips/trap.c:netintr() で、netisr を触っている部分も、
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 するんじゃないでしょうか?
良く分かってませんが、こっちの問題はないんじゃないかな。
割り込みハンドラの中でそれなりにアクションを起こさない限り、
割り込みはかかったままになっているんじゃないでしょうか?
--
soda