3

ネットワークに接続されたハードディスク用のデバイス ドライバを作成しようとしています。リクエストキューをロック/ロック解除する適切な方法は何ですか?どこで?

明確にするために:

  1. を使用してキューを作成し、作成しblk_init_queueたリクエスト ハンドラ関数とロック (セマフォ) をその関数に渡しました。
  2. 私のリクエストハンドラ関数は次のようになります:

    struct request *req;
    int ret;
    while ((req = blk_fetch_request(q)) != NULL) {
         ret = rb_transfer(req);
    }
    
  3. Myrb_transferは、リクエストを処理するために新しいカーネル スレッドを開始します。

  4. リクエストが処理され、データ転送が完了するblk_end_request_curと、そのリクエストで呼び出されます。

さて、私の質問は、上記のループでリクエスト キューへのアクセスを保護する方法です。そして一般的にドライバーでは?

私はこのようなことを試しました:

struct request *req;
int ret;
while ((req = blk_fetch_request(q)) != NULL) {
     spin_lock(&lock);
     ret = rb_transfer(req);
     spin_unlock(&lock);
}

しかし、これは失敗し、カーネルのロックアップを引き起こしました。

他のアイデアはありますか?

4

1 に答える 1