*参照元 [#v5011524] #backlinks *説明 [#baeb79cc] -パス: [[linux-2.6.33/block/blk-core.c]] -FIXME: これは何? --説明 **引数 [#m55511ff] -struct request_queue *q -- --[[linux-2.6.33/request_queue]] **返り値 [#df4d8d45] -なし **参考 [#d3c87d21] -unplug_work の初期化をしている関数 --[[linux-2.6.33/blk_alloc_queue_node()]] -unplug_work は blk_unplug_work() を実行するように初期化されている。 -FIXME: 特殊なケースもあるかもしれないので、あれば追加。 --[[linux-2.6.33/blk_unplug_work()]] *実装 [#k3944f6f] /** * __blk_run_queue - run a single device queue * @q: The queue to run * * Description: * See @blk_run_queue. This variant must be called with the queue lock * held and interrupts disabled. * */ void __blk_run_queue(struct request_queue *q) { blk_remove_plug(q); - --[[linux-2.6.33/blk_remove_plub()]] if (unlikely(blk_queue_stopped(q))) return; - --[[linux-2.6.33/unlikely()]] - --[[linux-2.6.33/blk_queue_stopped()]] if (elv_queue_empty(q)) return; - --[[linux-2.6.33/elv_queue_empty()]] /* * Only recurse once to avoid overrunning the stack, let the unplug * handling reinvoke the handler shortly if we already got there. */ if (!queue_flag_test_and_set(QUEUE_FLAG_REENTER, q)) { q->request_fn(q); queue_flag_clear(QUEUE_FLAG_REENTER, q); -request_fn は request_fn_proc 型 - --[[linux-2.6.33/request_fn_proc]] - --[[linux-2.6.33/QUEUE_FLAG_REENTER]] - --[[linux-2.6.33/queue_flag_test_and_set()]] - --[[linux-2.6.33/queue_flag_clear()]] } else { queue_flag_set(QUEUE_FLAG_PLUGGED, q); kblockd_schedule_work(q, &q->unplug_work); -unplug_work は work_struct 型 --[[linux-2.6.33/work_struct]] - --[[linux-2.6.33/QUEUE_FLAG_PLUGGED]] - --[[linux-2.6.33/queue_flag_set()]] - --[[linux-2.6.33/kblockd_schedule_work()]] } } EXPORT_SYMBOL(__blk_run_queue); -ライセンスに関係なくシンボルを公開する。 --[[linux-2.6.33/EXPORT_SYMBOL()]] *コメント [#a92d7491]