Now nvme_stop_queues quiesce all queues one by one. Every queue must wait a grace period(rcu or srcu). If the controller has a large amount of namespaces, the total waiting time is very long. Test result: the total waiting time is more than 20 seconds when the controller has 256 namespace. This set improves the quiesce time when using a large set of namespaces, which also improves I/O failover time in a multipath environment. We improve for both non-blocking tagset and blocking tagset introducing blk_mq_[un]quiesce_tagset which works on all request queues over a given tagset in parallel (which is the case in nvme). Changes from v2: - replace call_srcu to start_poll_synchronize_srcu - rename the flag name to make it accurate. - move unquiescing queue outside from nvme_set_queue_dying - add mutex to ensure that all queues are quiesced after set the NVME_CTRL_STOPPED. Changes from v1: - improvement is based on tagset rather than namesapces Chao Leng (2): blk-mq: add tagset quiesce interface nvme: use blk_mq_[un]quiesce_tagset block/blk-mq.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++ drivers/nvme/host/core.c | 57 +++++++++++++++--------------------- drivers/nvme/host/nvme.h | 3 +- include/linux/blk-mq.h | 2 ++ include/linux/blkdev.h | 3 ++ 5 files changed, 106 insertions(+), 35 deletions(-) -- 2.16.4