5

Linuxカーネルバージョン2.6.39.1に取り組んでおり、ブロックデバイスドライバーを開発しています。この点で、複数struct bioのsを1つに結合し、デバイスドライバーで処理するために-にstruct request追加します。request_queuescsi_request_fn()

->bi_nextのフィールドを使用して、作成したstruct bio複数struct bioのをリンクしてみました。これにより、のリンクリストが作成されましたstruct biosubmit_bio()I / O用にブロックデバイスレイヤーにバイオを送信するように呼び出すと、コードがを想定しているため、これ BUG_ON()がトリガーbio->bi_nextされますNULL

サービスのために下位レイヤーに送信する前struct bioに、複数のを1つにリンクする方法はありますか?struct request

4

2 に答える 2

1

複数をつなぎ合わせる方法はわかりませんが、 libsasstruct bioの「タスクコレクター」の実装と別のアプローチのaic94xxドライバーを確認することをお勧めします。ドキュメントはあまりありませんが、libsasのドキュメントでは次のように説明されています。

一部のハードウェア(aic94xxなど)には、ホストメモリから一度に複数のタスク(割り込み)をDMAする機能があります。タスクコレクターモードは、ハードウェアでこれをサポートするHAのオプション機能です。(繰り返しになりますが、ハードウェアがサポートしている場合でも、完全にオプションです。)

タスクコレクターモードでは、SASレイヤーはタスクの自然な 合体を行い、適切なタイミングで、単一のHA割り込みで複数のタスクをDMAするためにドライバーを呼び出します。DMBSは、insmod/modprobeがlldd_max_execute_numを1より大きい値に設定することでこれを使用したい場合があります。

事実上、これによりブロックレイヤー(別名BIO)は変更されませんが、複数のリクエストがドライバーレイヤーに蓄積され、一緒に送信されます。

于 2011-07-12T20:50:53.980 に答える
1

返信ありがとうございます、@ctuffli。ここで説明したものと同様の構造を使用することにしました。基本的に、 1つのシングル(後で1つのシングル)を形成するためにマージする必要があるstruct packet_dataすべてのへのポインターを含むaを割り当てます。また、ドライバー関連の情報もここに保存しています。次に、新しい(「merged_bio」と呼びます)を割り当て、元のBIOのリストからすべてのページをコピーしてから、をポイントします。この最後のハックにより、元のBIOのリストを追跡し、が正常に転送されたら、すべての個々のBIOのI/Oを終了するように呼び出すことができます。struct biostruct biostruct requeststruct packet_datastruct biomerged_bio->bi_privatestruct packet_databio_endio()merged_bio

これがこれを行う最も賢い方法かどうかはわかりませんが、私が意図したとおりに機能します。:^)

于 2011-07-19T02:33:05.373 に答える