X-Git-Url: http://git.cascardo.info/?a=blobdiff_plain;f=block%2Fblk-sysfs.c;h=521ae9089c50c704af07d643cd7cf3729e259327;hb=1b5a5f59e3435337bede67b9255bbb1d39fc4827;hp=17f5c84ce7bfb588a5a34bc244a7ac38067b4391;hpb=da01e61428aa2b5c424fddc11178498462d8c77f;p=cascardo%2Flinux.git diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 17f5c84ce7bf..521ae9089c50 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -551,12 +551,19 @@ int blk_register_queue(struct gendisk *disk) return -ENXIO; /* - * Initialization must be complete by now. Finish the initial - * bypass from queue allocation. + * 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)) { queue_flag_set_unlocked(QUEUE_FLAG_INIT_DONE, q); blk_queue_bypass_end(q); + if (q->mq_ops) + blk_mq_finish_init(q); } ret = blk_trace_init_sysfs(dev);