下川です.

At Wed, 31 Oct 2007 23:54:21 +0900,
Mitsuru IWASAKI wrote:
> > レポートした時点に近い10/26 00:00:00 GMT時点のcurrentにあてて
> > 試してみました。結果はマルチになる前にpanicしてしまいました。
> 
> 申し訳ないです、ちょっと急ぎすぎましたね。今度はどうでしょう?
> 
> http://people.freebsd.org/~iwasaki/ciss/ciss_periodic_thread-20071031.patch

codeを斜め読みしだけなので, 間違ってるかもしれませんが,
気になった点をいくつか指摘させてください.

1. lock の範囲

witnessを黙らせるために, ciss_synch_request() を call するとき
のみ lock を持ってますが, これだけで十分でしょうか?
ciss_get_request() も ciss_dequeue_free() あたりで, tailq を
いじっているので, lock を持ってないと, tailq を壊す可能性が
あると思います. ちなみに callout version では, callout_init_mtx()
しているので, lock は持っています.

ふつうこの手の thread を実装する場合には,
ciss_periodic_thread() の先頭で mutex を取得します.
そして, 仕事が終ったら, tsleep() しないで msleep() して lock
を解放しておやすみします.

2. kproc_exit と detach

これは, ちょっとややこしい話で, kldunload と, hot unplug
とかしないと表面化しない話ですが,
ciss_detach() するときに, kproc が exit するのをちゃんと
見届けてあげないと, page fault 等がおこります.
periodic_thread は, 大抵 sleep しているわけで, その間に
kldunload とかされてると, driver の code が kernel space
からいなくなってしまい, 起きたときには, ここはどこ状態になります.
なので, detach するきには, thread を起して, exit するまで
待たないといけません.

ciss_periodic_thread()にも, ciss_kill_notify_thread() 相当
のものが必要です.

3. kproc 必要?
私の印象ですが, nop送るだけなら, わざわざ, kproc 作る必要が
あるかなと思います. 同期 request を使うから sleep しなくて
はいけないのであって, 普通に非同期 request して,
callback で, struct ciss_reqest を解放する位で良いような
気がします.

/\ Hidetoshi Shimokawa
\/  [メールアドレス保護]

メールによる返信