|
SolarisのUSBシリアルがSMP環境でフリーズする問題に対応するパッチを作成しました。
免責
このドライバーで発生するいかなる損害も補償しません。自己責任で使用して下さい。
バグの原因
usbser_tx_cbコールバック内でport_rq_threadと処理が重なった場合、port_wq_threadを起こさないケースがあります。このため書き込みがストールしてしまいます。
これはシングルプロセッサではまず発生しません。
しかしマルチプロセッサ環境ではport_rq_threadとport_wq_threadが同時に動くため、かなりの確率で発生するものと思われます。
疑問点
STREAMSのマニュアル(man srv)を読むと、サービス関数内ですべてのメッセージを処理しろと書かれています。
Once the STREAMS scheduler calls a srv() routine, it must
process all messages on its queue.
しかし、usbser_wsrv内ではqueueの中身を処理せず、port_wq_threadを起こすだけでreturnしてしまいます。
これで問題は起きないのでしょうか?STREAMSについてはあまり良く知らないため、これで良いのかどうか判断出来ません。
どなたかご教授願います。
|
忙しくてこの数日間、ブログを拝見してなかったのですが、いつの間に!凄いです!
これで昔年の恨みが解決しそう(笑)
試してみますね。
2008/8/25(月) 午後 11:11 [ 瀧 / 紅呪 ]