- 追加された行はこの色です。
- 削除された行はこの色です。
#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]