blk-mq: Wake tasks entering queue on dying
authorKeith Busch <keith.busch@intel.com>
Thu, 8 Jan 2015 15:53:56 +0000 (08:53 -0700)
committerJens Axboe <axboe@fb.com>
Thu, 8 Jan 2015 15:53:56 +0000 (08:53 -0700)
When the queue is set to dying, wake up tasks that are waiting on frozen
queue so they realize it is dying and abandon their request.

Signed-off-by: Keith Busch <keith.busch@intel.com>
Modified by me to add a code comment on the need for the wakeup.

Signed-off-by: Jens Axboe <axboe@fb.com>
block/blk-mq.c

index cbd2a55d69b80285f4a526b75ab0c006ed755c4f..aefed96369dd5f9e764d46efa156ea743ff7febe 100644 (file)
@@ -160,6 +160,13 @@ void blk_mq_wake_waiters(struct request_queue *q)
        queue_for_each_hw_ctx(q, hctx, i)
                if (blk_mq_hw_queue_mapped(hctx))
                        blk_mq_tag_wakeup_all(hctx->tags, true);
+
+       /*
+        * If we are called because the queue has now been marked as
+        * dying, we need to ensure that processes currently waiting on
+        * the queue are notified as well.
+        */
+       wake_up_all(&q->mq_freeze_wq);
 }
 
 bool blk_mq_can_queue(struct blk_mq_hw_ctx *hctx)