mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 12:57:53 +00:00
block: mark queue init done at the end of blk_register_queue
Mark queue init done when everything is done well in blk_register_queue(), so that wbt_enable_default() can be run quickly without any RCU period involved since adding rq qos requires to freeze queue. Also no any side effect by delaying to mark queue init done. Reported-by: Yi Zhang <yi.zhang@redhat.com> Cc: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Ming Lei <ming.lei@redhat.com> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Tested-by: Yi Zhang <yi.zhang@redhat.com> Link: https://lore.kernel.org/r/20210609015822.103433-3-ming.lei@redhat.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
2cafe29a8d
commit
a72c374f97
1 changed files with 15 additions and 14 deletions
|
@ -866,20 +866,6 @@ int blk_register_queue(struct gendisk *disk)
|
||||||
"%s is registering an already registered queue\n",
|
"%s is registering an already registered queue\n",
|
||||||
kobject_name(&dev->kobj));
|
kobject_name(&dev->kobj));
|
||||||
|
|
||||||
/*
|
|
||||||
* SCSI probing may synchronously create and destroy a lot of
|
|
||||||
* request_queues for non-existent devices. Shutting down a fully
|
|
||||||
* functional queue takes measureable wallclock time as RCU grace
|
|
||||||
* periods are involved. To avoid excessive latency in these
|
|
||||||
* cases, a request_queue starts out in a degraded mode which is
|
|
||||||
* faster to shut down and is made fully functional here as
|
|
||||||
* request_queues for non-existent devices never get registered.
|
|
||||||
*/
|
|
||||||
if (!blk_queue_init_done(q)) {
|
|
||||||
blk_queue_flag_set(QUEUE_FLAG_INIT_DONE, q);
|
|
||||||
percpu_ref_switch_to_percpu(&q->q_usage_counter);
|
|
||||||
}
|
|
||||||
|
|
||||||
blk_queue_update_readahead(q);
|
blk_queue_update_readahead(q);
|
||||||
|
|
||||||
ret = blk_trace_init_sysfs(dev);
|
ret = blk_trace_init_sysfs(dev);
|
||||||
|
@ -938,6 +924,21 @@ int blk_register_queue(struct gendisk *disk)
|
||||||
ret = 0;
|
ret = 0;
|
||||||
unlock:
|
unlock:
|
||||||
mutex_unlock(&q->sysfs_dir_lock);
|
mutex_unlock(&q->sysfs_dir_lock);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SCSI probing may synchronously create and destroy a lot of
|
||||||
|
* request_queues for non-existent devices. Shutting down a fully
|
||||||
|
* functional queue takes measureable wallclock time as RCU grace
|
||||||
|
* periods are involved. To avoid excessive latency in these
|
||||||
|
* cases, a request_queue starts out in a degraded mode which is
|
||||||
|
* faster to shut down and is made fully functional here as
|
||||||
|
* request_queues for non-existent devices never get registered.
|
||||||
|
*/
|
||||||
|
if (!blk_queue_init_done(q)) {
|
||||||
|
blk_queue_flag_set(QUEUE_FLAG_INIT_DONE, q);
|
||||||
|
percpu_ref_switch_to_percpu(&q->q_usage_counter);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(blk_register_queue);
|
EXPORT_SYMBOL_GPL(blk_register_queue);
|
||||||
|
|
Loading…
Reference in a new issue