[Lkst-develop] lkstの現状の問題と解決案

Back to archive index

Masami HIRAMATSU hiram****@sdl*****
2002年 7月 2日 (火) 15:46:21 JST


日立の平松です。

lkst-1.2リリース直後ですが、現状新たに見つかった問題点と改善策
(修正中のものも含まれます)を明らかにしておきたいと思います。
#すこし長めになってしまいました。

(1)lkst_evhandler_register が 与えたIDのイベントハンドラを
 上書き登録してしまう。このため、デフォルトのイベントハンドラ
が登録されているIDに上書きしてしまうことができる。
改善策)lkst_evhandler_registerの仕様変更、lkst_evhandler_unregister
    lkst_evhandler_get_idの2つのAPIの追加を行う。
    registerに関しては、・システム予約IDへの変更不可、・IDの自動割当
    ・名前の重複禁止、の3点を中心に行います。
    また、これまでNULLを登録することでevhandlerを削除してきましたが
    専用のunregister関数を使うように変更します。
    また、ハンドラに付けた名前からIDを引いてこれるようにget_idを
    追加します。
    この変更についてはこちらで修正済ですが、APIの変更に関して
    何か問題等ありますでしょうか。

(2)バッファオーバーライト判定にバグの可能性。
(3)バッファ解放時に(ロックを取っていないので)アクセスバイオレーションを
 起こす可能性がある。
改善案)LKSTでは、CPU毎に書き込みバッファを持っているので、イベント取得
    時にロックを極力省けるのですが、バッファリードやバッファの操作に
    関しては担当していないCPUからの操作が入ってしまうことになり、上
    記のような問題が発生します。そこで、これらのバッファ操作に関しては、
    操作を行うプロセスを対象バッファを持つCPU上にmigrateして実行し、
    ロックをとらなくてもすむようにしたいと考えています。
    具体的には以下のように考えています。
(2)
・リードプロセス(ほとんどの場合lkstlogd)は、set_rmodによって対象CPUに
migrateし
 リードコマンドを発行する。
・読み出しと書き込みが同一CPUのカーネルタスク上で行われるため、オーバー
リード・
 オーバーライト判定をしなくてもよい。
(3)
・ カレントバッファでないか調べ、defunctフラグ(atomic)を立て(これは解放
プロセ
ス中のバッファに、シフトインしないようにするためである)、再びカレント
バッファ
でないか調べる。2度目の確認で失敗したらdefunctフラグを倒してエラーで戻る。
(このプロセスは、バッファの解放、リストやリングからはずすときにも使われる)
・その後 バッファ解放プロセスは、cpus_allowedフラグを使ってバッファを使
うCPUへ
スケジュールされるのを待ち、解放する。
・シフトプロセスはdefunctフラグがたっていなければシフトする。

(4)デーモンにSIGTERMを送ったときにバッファを二度読んでしまう。
改善策)オーバーリードの判定とsignalの判定がうまく働かないために生じる現
象ですが、
    上記のようにオーバーリード判定が不要になれば自然に治るのではないかと
    思われます。
    また、もう一つの案として、SIGTERMを送ると同時にバッファシフトさ
せると
    いう方法が考えられています。

以上です。
ご意見いただけるとありがたいです。

-- 
平松 雅巳(Masami HIRAMATSU)

(株)日立製作所 システム開発研究所 第3部 304ユニット
E-mail: hiram****@sdl*****
(外線)044-959-0258
(内線)8-69-3346




Lkst-develop メーリングリストの案内
Back to archive index