Commit 3ec717b7 authored by Shaohua Li's avatar Shaohua Li Committed by Jens Axboe

block: don't delay blk_run_queue_async

Let's check a scenario:
1. blk_delay_queue(q, SCSI_QUEUE_DELAY);
2. blk_run_queue_async();
the second one will became a noop, because q->delay_work already has
WORK_STRUCT_PENDING_BIT set, so the delayed work will still run after
SCSI_QUEUE_DELAY. But blk_run_queue_async actually hopes the delayed
work runs immediately.

Fix this by doing a cancel on potentially pending delayed work
before queuing an immediate run of the workqueue.
Signed-off-by: default avatarShaohua Li <shaohua.li@intel.com>
Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
parent 9937a5e2
...@@ -316,8 +316,10 @@ EXPORT_SYMBOL(__blk_run_queue); ...@@ -316,8 +316,10 @@ EXPORT_SYMBOL(__blk_run_queue);
*/ */
void blk_run_queue_async(struct request_queue *q) void blk_run_queue_async(struct request_queue *q)
{ {
if (likely(!blk_queue_stopped(q))) if (likely(!blk_queue_stopped(q))) {
__cancel_delayed_work(&q->delay_work);
queue_delayed_work(kblockd_workqueue, &q->delay_work, 0); queue_delayed_work(kblockd_workqueue, &q->delay_work, 0);
}
} }
EXPORT_SYMBOL(blk_run_queue_async); EXPORT_SYMBOL(blk_run_queue_async);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment