On Thu, 2017-05-25 at 12:21 +0800, Ming Lei wrote: > One big problem of blk_mq_quiesce_queue() is that it > can't prevent .queue_rq() in direct issue path from > being run even though hw queues are stopped by > blk_mq_quiesce_queue(). That's wrong. All what's needed to prevent that __blk_mq_try_issue_directly() calls .queue_rq() for a stopped queue is to check in __blk_mq_try_issue_directly() whether the relevant hardware queue has been stopped. That approach has the following two advantages over the approach of your patch series: - Lower code complexity and hence easier to review and to maintain. - Faster for queues for which BLK_MQ_F_BLOCKING has not been set. For non-preemptible kernels rcu_read_lock() and rcu_read_lock() are optimized out. That is not possible for percpu_ref_tryget_live() / percpu_ref_put(). Bart.