qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-block] [PATCH 15/18] block: only call aio_poll on the current


From: Paolo Bonzini
Subject: Re: [Qemu-block] [PATCH 15/18] block: only call aio_poll on the current thread's AioContext
Date: Mon, 17 Oct 2016 10:04:59 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.3.0


On 16/10/2016 18:40, Stefan Hajnoczi wrote:
> >  void bdrv_wakeup(BlockDriverState *bs)
> >  {
> > +    if (bs->wakeup) {
> > +        aio_bh_schedule_oneshot(qemu_get_aio_context(), dummy_bh_cb, NULL);
> > +    }
> >  }
> 
> Why use a dummy BH instead of aio_notify()?

Originally I used aio_bh_schedule_oneshot() because aio_notify() is not
enough for aio_poll() to return true.  It's also true that I am not
using anymore the result of aio_poll, though.

Since this is not a fast path and it's not very much stressed by
qemu-iotests, I think it's better if we can move towards making
aio_notify() more or less an internal detail.  If you prefer
aio_notify(), however, I can look into that as well.

Thanks,

Paolo

>> >  void bdrv_dec_in_flight(BlockDriverState *bs)
>> > diff --git a/include/block/block.h b/include/block/block.h
>> > index ba4318b..72d5d8e 100644
>> > --- a/include/block/block.h
>> > +++ b/include/block/block.h
>> > @@ -343,9 +343,27 @@ void bdrv_drain_all(void);
>> >  #define bdrv_poll_while(bs, cond) ({                       \
>> >      bool waited_ = false;                                  \
>> >      BlockDriverState *bs_ = (bs);                          \
>> > -    while ((cond)) {                                       \
>> > -        aio_poll(bdrv_get_aio_context(bs_), true);         \
>> > -        waited_ = true;                                    \
>> > +    AioContext *ctx_ = bdrv_get_aio_context(bs_);          \
>> > +    if (aio_context_in_iothread(ctx_)) {                   \
>> > +        while ((cond)) {                                   \
>> > +            aio_poll(ctx_, true);                          \
>> > +            waited_ = true;                                \
>> > +        }                                                  \
>> > +    } else {                                               \
>> > +        assert(qemu_get_current_aio_context() ==           \
>> > +               qemu_get_aio_context());                    \
> The assumption is that IOThread #1 will never call bdrv_poll_while() on
> IOThread #2's AioContext.  I believe that is true today.  Is this what
> you had in mind?
> 
> Please add a comment since it's not completely obvious from the assert
> expression.
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]