*参照元 [#we59b860] #backlinks *注意 [#g861fc5e] -より新しいバージョンがあります。 --[[linux-2.6.33/blk_unplug_timeout()]] *説明 [#e66c037e] -パス: [[linux-2.6.25/block/blk-core.c]] -unplug 用タイマーの期限が来ると呼び出される関数である。 --ブロックデバイス用のワークキューに、unplug 用の関数を 追加するだけ。 **引数 [#i2bf5ea8] -unsigned long data --タイマー作成時に渡したデータである。 このタイマーの場合は、struct request_queue へのポインタをキャストした値が 渡される。 --[[linux-2.6.25/request_queue]] **返り値 [#beeca879] -なし **参考 [#g9a4fc28] -タイマーに登録した関数はソフトウェア割り込みの コンテキストで実行される。 --ユーザコンテキストは存在しない。 --スリープはできない。 --カレントプロセッサのソフトウェア割り込みは禁止されている。 --ハードウェア割り込みは許可されている。 *実装 [#v05c10b6] void blk_unplug_timeout(unsigned long data) { struct request_queue *q = (struct request_queue *)data; blk_add_trace_pdu_int(q, BLK_TA_UNPLUG_TIMER, NULL, q->rq.count[READ] + q->rq.count[WRITE]); - --[[linux-2.6.25/blk_add_trace_pdu_int()]] 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]] } *コメント [#nbc64a09]