Thread (35 messages) 35 messages, 3 authors, 2017-05-31

Re: [PATCH v2 0/8] blk-mq: fix & improve queue quiescing

From: Ming Lei <hidden>
Date: 2017-05-28 11:11:13

On Sat, May 27, 2017 at 09:32:02PM +0000, Bart Van Assche wrote:
On Sat, 2017-05-27 at 22:21 +0800, Ming Lei wrote:
quoted
There are some issues in current blk_mq_quiesce_queue():

    - in case of direct issue or BLK_MQ_S_START_ON_RUN, dispatch won't
    be prevented after blk_mq_quiesce_queue() is returned.
    - in theory, new RCU read-side critical sections may begin while
    synchronize_rcu() was waiting, and end after returning from 
    synchronize_rcu(), then dispatch still may be run after
    synchronize_rcu() returns
Hello Ming,
Hello Bart,
I disagree with the second part of your statement. blk_mq_quiesce_queue()
You can find the similar description from line 158 to line 180.
of Documentation/RCU/whatisRCU.txt.

For example, there may be schedule preempt or irq handling between
checking stopped flag(false) and the RCU read-side critical sections, and
synchronize_*rcu() may return before running this RCU read-side critical
sections. That is why we have to move the check into RCU read-side
critical sections.
stops all hardware queues before calling synchronize_*rcu().
blk_mq_sched_dispatch_requests() is called with an RCU lock held and checks
whether a hctx has been stopped before calling .queue_rq(). That is
sufficient to prevent blk_mq_try_issue_directly() to trigger a .queue_rq()
call.
Our case should be very similar with example "6.  ANALOGY WITH READER-WRITER
LOCKING" in Documentation/RCU/whatisRCU.txt.

Thanks,
Ming
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help