qemu-block
[Top][All Lists]
Advanced

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

Re: [Qemu-block] [PATCH v2 11/11] block: Block "device IO" during bdrv_d


From: Fam Zheng
Subject: Re: [Qemu-block] [PATCH v2 11/11] block: Block "device IO" during bdrv_drain and bdrv_drain_all
Date: Wed, 13 May 2015 19:08:43 +0800
User-agent: Mutt/1.5.23 (2014-03-12)

On Wed, 05/13 12:26, Paolo Bonzini wrote:
> 
> 
> On 13/05/2015 19:28, Fam Zheng wrote:
> > We don't want new requests from guest, so block the operation around the
> > nested poll.
> > 
> > Signed-off-by: Fam Zheng <address@hidden>
> > ---
> >  block/io.c | 12 ++++++++++++
> >  1 file changed, 12 insertions(+)
> > 
> > diff --git a/block/io.c b/block/io.c
> > index 1ce62c4..d369de3 100644
> > --- a/block/io.c
> > +++ b/block/io.c
> > @@ -289,9 +289,15 @@ static bool bdrv_drain_one(BlockDriverState *bs)
> >   */
> >  void bdrv_drain(BlockDriverState *bs)
> >  {
> > +    Error *blocker = NULL;
> > +
> > +    error_setg(&blocker, "bdrv_drain in progress");
> > +    bdrv_op_block(bs, BLOCK_OP_TYPE_DEVICE_IO, blocker);
> >      while (bdrv_drain_one(bs)) {
> >          /* Keep iterating */
> >      }
> > +    bdrv_op_unblock(bs, BLOCK_OP_TYPE_DEVICE_IO, blocker);
> > +    error_free(blocker);
> >  }
> >  
> >  /*
> > @@ -311,6 +317,9 @@ void bdrv_drain_all(void)
> >      /* Always run first iteration so any pending completion BHs run */
> >      bool busy = true;
> >      BlockDriverState *bs = NULL;
> > +    Error *blocker = NULL;
> > +
> > +    error_setg(&blocker, "bdrv_drain_all in progress");
> >  
> >      while ((bs = bdrv_next(bs))) {
> >          AioContext *aio_context = bdrv_get_aio_context(bs);
> > @@ -319,6 +328,7 @@ void bdrv_drain_all(void)
> >          if (bs->job) {
> >              block_job_pause(bs->job);
> >          }
> > +        bdrv_op_block(bs, BLOCK_OP_TYPE_DEVICE_IO, blocker);
> >          aio_context_release(aio_context);
> >      }
> >  
> > @@ -343,8 +353,10 @@ void bdrv_drain_all(void)
> >          if (bs->job) {
> >              block_job_resume(bs->job);
> >          }
> > +        bdrv_op_unblock(bs, BLOCK_OP_TYPE_DEVICE_IO, blocker);
> >          aio_context_release(aio_context);
> >      }
> > +    error_free(blocker);
> >  }
> >  
> >  /**
> > 
> 
> I think this isn't enough.  It's the callers of bdrv_drain and
> bdrv_drain_all that need to block before drain and unblock before
> aio_context_release.

Which callers do you mean? qmp_transaction is covered in this series.

Fam



reply via email to

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