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.

Reply via email to