#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]


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS