#freeze *参照元 [#zc356025] #backlinks *説明 [#bd35b1d6] -パス: [[linux-2.6.25/block/blk-core.c]] -ブロックデバイスのリクエストキューを再開させる。 再開させるとリクエスト関数が呼び出されるようになる。 --必ずリクエストキューのロックを保持した状態で呼び出すこと。 その他 -関数の実装ではリクエスト関数実行中に、さらにもう一度リクエスト関数を 実行すること(再入)を「一回だけ」許可している。 --ただしリクエストキューのロックを保持しているから外からは呼べない? ---再入は不可能か?? --リクエスト関数自身がこの関数を呼び出す(再帰)可能性はある。 ---リクエスト関数内で stop 〜 start を行う場合? 再帰の可能性に注意しないとデッドロックしてしまう。 **引数 [#yb7e39f3] -struct request_queue *q --再開させるリクエストキューを指定する。 --[[linux-2.6.25/request_queue]] **返り値 [#of9378ea] -なし **参考 [#y70081a1] -なし *実装 [#w5868ea8] /** * blk_start_queue - restart a previously stopped queue * @q: The &struct request_queue in question * * Description: * blk_start_queue() will clear the stop flag on the queue, and call * the request_fn for the queue if it was in a stopped state when * entered. Also see blk_stop_queue(). Queue lock must be held. **/ void blk_start_queue(struct request_queue *q) { WARN_ON(!irqs_disabled()); -割り込みが無効になっていない場合は警告を発する。 --[[linux-2.6.25/WARN_ON()]] --[[linux-2.6.25/irqs_disabled()]] clear_bit(QUEUE_FLAG_STOPPED, &q->queue_flags); -リクエストキューが停止している場合は、停止フラグをクリアする。 --[[linux-2.6.25/clear_bit()]] /* * one level of recursion is ok and is much faster than kicking * the unplug handling */ if (!test_and_set_bit(QUEUE_FLAG_REENTER, &q->queue_flags)) { -リクエストキューに再入フラグがセットされていないことを確認する。 --[[linux-2.6.25/test_and_set_bit()]] ---コメント曰く「再入(リエントラント)は一回だけ OK、だって unplug を スケジュールするより速いじゃん!」とのこと。 ---英語が recursive(再帰)になっているが、なぜ?再入可能ではあるが、 リクエストキューのロックを保持しているから実質再帰しか有り得ない という意味か? q->request_fn(q); -キューに登録されているリクエスト処理関数を呼び出す clear_bit(QUEUE_FLAG_REENTER, &q->queue_flags); -再入ビットをクリアする。 } else { -既に一度再帰していたらこちらに来る。 --無限に再帰するとまずい(カーネルスタック(1ページ分しかない) があふれる)ので、防止しているのだろう。たぶん blk_plug_device(q); -キューを plug(栓をして塞ぐ)する。 -リクエストキューを plug(栓をして塞ぐこと)する。 --[[linux-2.6.25/blk_plug_device()]] kblockd_schedule_work(&q->unplug_work); -リクエストキューを unplug(栓を取り去る)する関数を ワークキューにスケジュールする。 --通常の I/O スケジューラの場合は blk_unplug_work が呼び出される。 --CFQ(Completely Fair Queuing)を選択している場合、 cfq_kick_queue が呼び出される。 --[[linux-2.6.25/kblockd_schedule_work()]] ---[[linux-2.6.25/blk_unplug_work()]] ---[[linux-2.6.25/cfq_kick_queue()]] ---[[linux-memo/CFQ]] } } EXPORT_SYMBOL(blk_start_queue); -関数をエクスポートする。 --[[linux-2.6.25/EXPORT_SYMBOL()]] *コメント [#ud97624c]