block: mark queue init done at the end of blk_register_queue
authorMing Lei <ming.lei@redhat.com>
Wed, 9 Jun 2021 01:58:22 +0000 (09:58 +0800)
committerJens Axboe <axboe@kernel.dk>
Wed, 16 Jun 2021 14:41:50 +0000 (08:41 -0600)
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>
block/blk-sysfs.c

index f89e2fc..370d83c 100644 (file)
@@ -866,20 +866,6 @@ int blk_register_queue(struct gendisk *disk)
                  "%s is registering an already registered queue\n",
                  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);
 
        ret = blk_trace_init_sysfs(dev);
@@ -938,6 +924,21 @@ int blk_register_queue(struct gendisk *disk)
        ret = 0;
 unlock:
        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;
 }
 EXPORT_SYMBOL_GPL(blk_register_queue);