block: call rq_qos_exit() after queue is frozen
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>
This commit is contained in:
parent
698b53b311
commit
c57cdf7a9e
|
@ -785,6 +785,9 @@ void blk_cleanup_queue(struct request_queue *q)
|
||||||
* prevent that q->request_fn() gets invoked after draining finished.
|
* prevent that q->request_fn() gets invoked after draining finished.
|
||||||
*/
|
*/
|
||||||
blk_freeze_queue(q);
|
blk_freeze_queue(q);
|
||||||
|
|
||||||
|
rq_qos_exit(q);
|
||||||
|
|
||||||
spin_lock_irq(lock);
|
spin_lock_irq(lock);
|
||||||
queue_flag_set(QUEUE_FLAG_DEAD, q);
|
queue_flag_set(QUEUE_FLAG_DEAD, q);
|
||||||
spin_unlock_irq(lock);
|
spin_unlock_irq(lock);
|
||||||
|
|
|
@ -1007,8 +1007,6 @@ void blk_unregister_queue(struct gendisk *disk)
|
||||||
kobject_del(&q->kobj);
|
kobject_del(&q->kobj);
|
||||||
blk_trace_remove_sysfs(disk_to_dev(disk));
|
blk_trace_remove_sysfs(disk_to_dev(disk));
|
||||||
|
|
||||||
rq_qos_exit(q);
|
|
||||||
|
|
||||||
mutex_lock(&q->sysfs_lock);
|
mutex_lock(&q->sysfs_lock);
|
||||||
if (q->request_fn || (q->mq_ops && q->elevator))
|
if (q->request_fn || (q->mq_ops && q->elevator))
|
||||||
elv_unregister_queue(q);
|
elv_unregister_queue(q);
|
||||||
|
|
Loading…
Reference in a new issue