diff mbox series

[1/2] block-backend: add drained_poll

Message ID 20210601055728.90849-2-slp@redhat.com (mailing list archive)
State New, archived
Headers show
Series nbd/server: Quiesce server on drained section | expand

Commit Message

Sergio Lopez June 1, 2021, 5:57 a.m. UTC
Allow block backends to poll their devices/users to check if they have
been quiesced when entering a drained section.

This will be used in the next patch to wait for the NBD server to be
completely quiesced.

Suggested-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Sergio Lopez <slp@redhat.com>
---
 block/block-backend.c          | 7 ++++++-
 include/sysemu/block-backend.h | 4 ++++
 2 files changed, 10 insertions(+), 1 deletion(-)

Comments

Kevin Wolf June 1, 2021, 3:59 p.m. UTC | #1
Am 01.06.2021 um 07:57 hat Sergio Lopez geschrieben:
> Allow block backends to poll their devices/users to check if they have
> been quiesced when entering a drained section.
> 
> This will be used in the next patch to wait for the NBD server to be
> completely quiesced.
> 
> Suggested-by: Kevin Wolf <kwolf@redhat.com>
> Signed-off-by: Sergio Lopez <slp@redhat.com>
> ---
>  block/block-backend.c          | 7 ++++++-
>  include/sysemu/block-backend.h | 4 ++++
>  2 files changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/block/block-backend.c b/block/block-backend.c
> index de5496af66..163ca05b97 100644
> --- a/block/block-backend.c
> +++ b/block/block-backend.c
> @@ -2393,8 +2393,13 @@ static void blk_root_drained_begin(BdrvChild *child)
>  static bool blk_root_drained_poll(BdrvChild *child)
>  {
>      BlockBackend *blk = child->opaque;
> +    int ret = 0;

It's really a bool.

>      assert(blk->quiesce_counter);
> -    return !!blk->in_flight;
> +
> +    if (blk->dev_ops && blk->dev_ops->drained_poll) {
> +        ret = blk->dev_ops->drained_poll(blk->dev_opaque);
> +    }
> +    return ret || !!blk->in_flight;
>  }

Doesn't make a difference for correctness, of course, so whether you
change it or not:

Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Sergio Lopez June 1, 2021, 4:32 p.m. UTC | #2
On Tue, Jun 01, 2021 at 05:59:10PM +0200, Kevin Wolf wrote:
> Am 01.06.2021 um 07:57 hat Sergio Lopez geschrieben:
> > Allow block backends to poll their devices/users to check if they have
> > been quiesced when entering a drained section.
> > 
> > This will be used in the next patch to wait for the NBD server to be
> > completely quiesced.
> > 
> > Suggested-by: Kevin Wolf <kwolf@redhat.com>
> > Signed-off-by: Sergio Lopez <slp@redhat.com>
> > ---
> >  block/block-backend.c          | 7 ++++++-
> >  include/sysemu/block-backend.h | 4 ++++
> >  2 files changed, 10 insertions(+), 1 deletion(-)
> > 
> > diff --git a/block/block-backend.c b/block/block-backend.c
> > index de5496af66..163ca05b97 100644
> > --- a/block/block-backend.c
> > +++ b/block/block-backend.c
> > @@ -2393,8 +2393,13 @@ static void blk_root_drained_begin(BdrvChild *child)
> >  static bool blk_root_drained_poll(BdrvChild *child)
> >  {
> >      BlockBackend *blk = child->opaque;
> > +    int ret = 0;
> 
> It's really a bool.

I'll fix this in v2.

Thanks,
Sergio.

> >      assert(blk->quiesce_counter);
> > -    return !!blk->in_flight;
> > +
> > +    if (blk->dev_ops && blk->dev_ops->drained_poll) {
> > +        ret = blk->dev_ops->drained_poll(blk->dev_opaque);
> > +    }
> > +    return ret || !!blk->in_flight;
> >  }
> 
> Doesn't make a difference for correctness, of course, so whether you
> change it or not:
> 
> Reviewed-by: Kevin Wolf <kwolf@redhat.com>
>
Eric Blake June 1, 2021, 9:24 p.m. UTC | #3
On Tue, Jun 01, 2021 at 05:59:10PM +0200, Kevin Wolf wrote:
> > +++ b/block/block-backend.c
> > @@ -2393,8 +2393,13 @@ static void blk_root_drained_begin(BdrvChild *child)
> >  static bool blk_root_drained_poll(BdrvChild *child)
> >  {
> >      BlockBackend *blk = child->opaque;
> > +    int ret = 0;
> 
> It's really a bool.
> 
> >      assert(blk->quiesce_counter);
> > -    return !!blk->in_flight;
> > +
> > +    if (blk->dev_ops && blk->dev_ops->drained_poll) {
> > +        ret = blk->dev_ops->drained_poll(blk->dev_opaque);
> > +    }
> > +    return ret || !!blk->in_flight;
> >  }
> 
> Doesn't make a difference for correctness, of course, so whether you
> change it or not:
> 
> Reviewed-by: Kevin Wolf <kwolf@redhat.com>

Likewise, with that cosmetic change,
Reviewed-by: Eric Blake <eblake@redhat.com>
diff mbox series

Patch

diff --git a/block/block-backend.c b/block/block-backend.c
index de5496af66..163ca05b97 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -2393,8 +2393,13 @@  static void blk_root_drained_begin(BdrvChild *child)
 static bool blk_root_drained_poll(BdrvChild *child)
 {
     BlockBackend *blk = child->opaque;
+    int ret = 0;
     assert(blk->quiesce_counter);
-    return !!blk->in_flight;
+
+    if (blk->dev_ops && blk->dev_ops->drained_poll) {
+        ret = blk->dev_ops->drained_poll(blk->dev_opaque);
+    }
+    return ret || !!blk->in_flight;
 }
 
 static void blk_root_drained_end(BdrvChild *child, int *drained_end_counter)
diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
index 880e903293..9992072e18 100644
--- a/include/sysemu/block-backend.h
+++ b/include/sysemu/block-backend.h
@@ -66,6 +66,10 @@  typedef struct BlockDevOps {
      * Runs when the backend's last drain request ends.
      */
     void (*drained_end)(void *opaque);
+    /*
+     * Is the device drained?
+     */
+    bool (*drained_poll)(void *opaque);
 } BlockDevOps;
 
 /* This struct is embedded in (the private) BlockBackend struct and contains