ネットワークに接続されたハードディスク用のデバイス ドライバを作成しようとしています。リクエストキューをロック/ロック解除する適切な方法は何ですか?どこで?
明確にするために:
- を使用してキューを作成し、作成し
blk_init_queue
たリクエスト ハンドラ関数とロック (セマフォ) をその関数に渡しました。 私のリクエストハンドラ関数は次のようになります:
struct request *req; int ret; while ((req = blk_fetch_request(q)) != NULL) { ret = rb_transfer(req); }
My
rb_transfer
は、リクエストを処理するために新しいカーネル スレッドを開始します。リクエストが処理され、データ転送が完了する
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);
}
しかし、これは失敗し、カーネルのロックアップを引き起こしました。
他のアイデアはありますか?