[[PageNavi(internal24-navi)]]
{{{ comment
h2w-title:割り込み処理とソフト割り込み処理の排他メカニズム
}}}
== 割り込み処理とソフト割り込み処理の排他メカニズム == #SECTION07571000000000000000
下記フラグを利用して、割り込み処理、ソフト割り込み処理の排他が行われている。
{{{
unsigned int global_irq_lock;
unsigned int global_bh_lock;
struct {
unsigned int __local_irq_count;
unsigned int __local_bh_count;
:
} irq_stat[NR_CPUS]
}}}
まず、各フラグの利用方法(どこで設定され、どこから参照されるか)に関して説明する。
* global_irq_lock ... 全割り込み禁止フラグ
* ● 全割り込み禁止(__global_cli()関数)時に設定する。 __global_sti()関数で解除。
* 割り込みハンドラ起動(handle_IRQ_event関数)時に、 上記変数がクリアされるのを待ちビジーウェイト(irq_enter)する。
* 旧BHハンドラ(bh_action関数)では、上記フラグが セットされているとき(hardirq_trylock関数)は起動をスキップする。
* 他CPUからの全割り込み禁止要求時(__global_cti()関数) その他のCPUでの割り込み禁止処理が終了(__global_sti()関数) するのをビジーウェイトする。
* local_irq_count ... ローカルCPU上で動作している割り込みハンドラのネスト数
* ● 割り込みハンドラ起動(handle_IRQ_event関数)時にカウントアップ (irq_enter関数). 終了時にカウントダウン(irq_exit)する。
* ソフト割り込みハンドラ(do_softirq関数)では、上記フラグが セットされているとき(in_interupt関数)は起動をスキップする。 ローカルCPU上で割り込みハンドラが動いているときは起動しない。
* 旧BHハンドラ(bh_action関数)では、上記フラグが セットされているとき(hardirq_trylock関数)は起動をスキップする。
* 他CPUからの全割り込み禁止(__global_cti()関数)を行う場合、 全てのCPUの上記変数がクリアされるまで終了を待ち合わせる。
* global_bh_lock ... 旧BHハンドラ実行中を示すフラグ
* ● 旧BHハンドラ起動時(bh_action関数)設定、処理後解除する。 (spin_trylock(global_bh_lock)処理)
* 旧BHハンドラ起動するときに、別の他CPU上で動作していたら (上記フラグが既に立っていたら)処理をスキップする。
* local_bh_count ... ローカルCPU上で動作しているソフト割り込みハンドラ実行中を示すフラグ
* ● ソフト割り込み(do_softirq)起動時カウントアップ (local_bh_disable関数)し、終了時にカウントダウン (local_bh_enable関数)する。
* ソフト割り込みハンドラ(do_softirq関数)では、上記フラグが セットされているとき(in_interupt関数)は起動をスキップする。 同じCPU上でソフト割り込みハンドラがネストすることを避ける。
* プロセッサ間割り込み(smp_call_function)処理中もBHハンドラの 起動を抑制するためにカウントアップする。
* 他CPUからの全割り込み禁止(__global_cti関数)でソフト 割り込みハンドラ終了を待ち合わせるために参照。
これらの動きをまとめると、
1. __global_cliによる割り込み禁止状態と割り込みハンドラ または旧BHハンドラはシステム上に共存できない。
1. 割り込みハンドラと旧BHハンドラはシステム上に共存できる。 ただし割り込みハンドラを優先的に動作させる。
1. 旧BHハンドラはシステム上に一つだけ存在できる。
1. ソフト割り込みハンドラは、上記のものと完全に独立して動作。 ただし割り込みハンドラを優先的に動作させる。
[[Embed(internal24-images:img128.gif)]]
----
''(NIS)HirokazuTakahashi [[BR]]2000年12月09日 (土) 23時55分06秒 JST''1
[[PageNavi(internal24-navi)]]