PCIeブロックデバイスドライバーを使用してファイルを読み書きするときに、本当に理解できないエラーが発生します。swiotlb_unmap_sg_attrs()で問題が発生しているようです。これは、ポインターのNULL逆参照を行っているようsg
ですが、これがどこから来ているのかわかりません。scatterlist
自分で使用しているのはデバイス情報の一部として割り当てられているためです。構造化され、ドライバーが実行する限り存続します。
問題に対応するためのスタックトレースがあります。正確な詳細は少し異なる傾向がありますが、常にでクラッシュしswiotlb_unmap_sq_attrs()
ます。
IO関数の周りのロックを処理する方法がわからないため、ロックの問題が発生している可能性が高いと思います。関数が呼び出されたときにロックはすでに保持されていrequest
ます。完了するには(MSI)IRQが必要なため、IO関数自体が呼び出される前にロックを解放します。IRQハンドラーは、IO関数が待機している「ステータス」値を更新します。IO関数が戻ったら、ロックを元に戻し、キュー処理の要求に戻ります。
クラッシュは次の間に発生しblk_fetch_request()
ます。
if (!__blk_end_request(req, res, bytes)){
printk(KERN_ERR "%s next request\n", DRIVER_NAME);
req = blk_fetch_request(q);
} else {
printk(KERN_ERR "%s same request\n", DRIVER_NAME);
}
ここでbytes
、要求ハンドラーによって、IOの全長(各スキャッター・ギャザー・セグメントの合計長)になるように更新されます。