]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
block: call rq_qos_exit() after queue is frozen
authorMing Lei <ming.lei@redhat.com>
Wed, 24 Oct 2018 13:18:09 +0000 (21:18 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 1 Dec 2019 08:17:06 +0000 (09:17 +0100)
[ Upstream commit c57cdf7a9e51d97a43e29b8f4a04157875104000 ]

rq_qos_exit() removes the current q->rq_qos, this action has to be
done after queue is frozen, otherwise the IO queue path may never
be waken up, then IO hang is caused.

So fixes this issue by moving rq_qos_exit() after queue is frozen.

Cc: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
block/blk-core.c
block/blk-sysfs.c

index 074ae9376189b346e0eef9487eef6863a5a348d8..ea33d6abdcfc9e8543df0c9c5c5f735b3c4c2f9e 100644 (file)
@@ -784,6 +784,9 @@ void blk_cleanup_queue(struct request_queue *q)
         * prevent that q->request_fn() gets invoked after draining finished.
         */
        blk_freeze_queue(q);
+
+       rq_qos_exit(q);
+
        spin_lock_irq(lock);
        queue_flag_set(QUEUE_FLAG_DEAD, q);
        spin_unlock_irq(lock);
index bab47a17b96f4b2dc786d81b4a7d4c88435b821c..8286640d4d663fe51a207421f5a4190ee2d9bfb8 100644 (file)
@@ -997,8 +997,6 @@ void blk_unregister_queue(struct gendisk *disk)
        kobject_del(&q->kobj);
        blk_trace_remove_sysfs(disk_to_dev(disk));
 
-       rq_qos_exit(q);
-
        mutex_lock(&q->sysfs_lock);
        if (q->request_fn || (q->mq_ops && q->elevator))
                elv_unregister_queue(q);