4

私はLinuxカーネルバージョン2.6.39.1で作業しており、ブロックデバイスドライバを開発中です。この点に関し、複数のstruct bioを1つのstruct requestにまとめ、デバイスドライバによる処理のためにrequest_queueに追加します。つまり、scsi_request_fn()です。複数の構造化BIOを単一の構造体リクエストに結合するにはどうすればよいですか?

struct bioフィールドを使用して、私が作成したstruct bioを複数回リンクすると、struct bioのリンクリストが作成されました。 submit_bio()を呼び出してI/Oのブロックデバイスレイヤにbioを送信すると、コードでbio->bi_nextNULLと予想されるため、thisBUG_ON()がトリガーされます。

サービスのために複数のstruct bioを1つのstruct requestにリンクする前にリンクする方法はありますか。

答えて

0

返信いただきありがとうございます、@ctuffli。私はhereと同じような構造を使うことに決めました。基本的には、struct bio(以降は単一のstruct request)を構成するためにマージされるすべてのstruct bioへのポインタを含むstruct packet_dataを割り当てます。また、ドライバー関連の情報もこのstruct packet_dataに保存しています。次に、新しいstruct bio(「merged_bio」と呼ぶ)を割り当て、元のBIOのリストからすべてのページをコピーして、merged_bio->bi_privatestruct packet_dataを指すようにします。この最後のハックは、私が元のBIOのリストを追跡することを可能にし、また、merged_bioが正常に転送されたら、すべての個々のBIOでI/Oを終了するためにbio_endio()に電話することができます。

これが最もスマートな方法であるかどうかはわかりませんが、意図したとおりですか。 :^)

0

struct bioを複数同時にストリングする方法がわかりませんが、別の方法としてlibsasaic94xxドライバの「タスクコレクタ」実装を見てみるとよいでしょう。そこ多くのドキュメントはありませんが、libsas documentationは、一部のハードウェア(例えばAIC94XX)はホストメモリからの時間(割り込み)に1つのタスクより 多くのDMAへの能力を持っている

としてそれを説明しています。タスク コレクタモードは、ハードウェアの をサポートするHAのオプション機能です。 (繰り返しますが、それはあなたのハードウェアがそれをサポートしている場合でも 完全にオプションです。)

タスクコレクターモードでは、SAS層は、タスクの 自然の合体を行うだろうし、適切な瞬間に、それはDMAにあなたのドライバを呼び出す う単一のHAの複数のタスク 割り込み。 DMBSが1より大きい

効果的なものにlldd_max_execute_numを設定insmodの/ modprobeの ことで、これを使用したい場合があり、これは変わらないが、複数の要求は、ドライバ層に蓄積され、ブロック層(別名BIO)をすることができます一緒に提出する。

関連する問題