On Thu, 2017-08-31 at 12:01 +0800, Ming Lei wrote:
> On Wed, Aug 30, 2017 at 05:11:00PM +0000, Bart Van Assche wrote:
> > On Sun, 2017-08-27 at 00:33 +0800, Ming Lei wrote:
> > [ ... ]
> > Shouldn't blk_mq_sched_dispatch_requests() set BLK_MQ_S_DISPATCH_BUSY just 
> > after
> > the following statement because this statement makes the dispatch list 
> > empty?
> 
> Actually that is what I did in V1.
> 
> I changed to this way because setting the BUSY flag here will increase
> the race window a bit, for example, if one request is added to ->dispatch
> just after it is flushed(), the check on the BUSY bit won't catch this
> case. Then we can avoid to check both the bit and 
> list_empty_careful(&hctx->dispatch)
> in blk_mq_sched_dispatch_requests(), so code becomes simpler and more
> readable if we set the flag simply from the beginning.

Hello Ming,

My understanding is that blk_mq_sched_dispatch_requests() will only work
correctly if the code that sets the DISPATCH_BUSY flag does that after having
inserted one or more elements in the dispatch list. Although x86 CPUs do not
reorder store operations I think that the functions that set the DISPATCH_BUSY
flag need a memory barrier these two store operations. I'm referring to the
blk_mq_sched_bypass_insert(), blk_mq_dispatch_wait_add() and
blk_mq_hctx_notify_dead() functions.

> > > +          * too small, no need to worry about performance
> > 
> >                    ^^^
> > The word "too" seems extraneous to me in this sentence.
> 
> Maybe 'extremely' is better, or just remove it?

If the word "too" would be removed I think the comment is still clear.

Thanks,

Bart.

Reply via email to