Il ven 7 apr 2023, 22:04 Eric Blake <ebl...@redhat.com> ha scritto:

> On Fri, Apr 07, 2023 at 05:33:03PM +0200, Paolo Bonzini wrote:
> > The introduction of the graph lock is causing blk_get_geometry, a hot
> function
> > used in the I/O path, to create a coroutine.  However, the only part
> that really
> > needs to run in coroutine context is the call to
> bdrv_co_refresh_total_sectors,
> > which in turn only happens in the rare case of host CD-ROM devices.
> >
> > So, write by hand the three wrappers on the path from
> blk_co_get_geometry to
> > bdrv_co_refresh_total_sectors, so that the coroutine wrapper is only
> created
> > if bdrv_nb_sectors actually calls bdrv_refresh_total_sectors.
> >
> > Reported-by: Stefan Hajnoczi <stefa...@redhat.com>
> > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com>
> > ---
> >  block.c                           | 22 ++++++++++++++++++++++
> >  block/block-backend.c             | 27 +++++++++++++++++++++++++++
> >
> >  include/sysemu/block-backend-io.h |  5 ++---
> >  4 files changed, 52 insertions(+), 4 deletions(-)
> >
> > diff --git a/block.c b/block.c
> > index dbbc8de30c24..3390efd18cf6 100644
> > --- a/block.c
> > +++ b/block.c
> > @@ -5859,6 +5859,28 @@ int64_t coroutine_fn
> bdrv_co_nb_sectors(BlockDriverState *bs)
> >      return bs->total_sectors;
> >  }
> >
> > +/*
> > + * This wrapper is written by hand because this function is in the hot
> I/O path,
> > + * via blk_get_geometry.
> > + */
> > +int64_t coroutine_mixed_fn bdrv_nb_sectors(BlockDriverState *bs)
> > +{
> > +    BlockDriver *drv = bs->drv;
> > +    IO_CODE();
> > +
> > +    if (!drv)
> > +        return -ENOMEDIUM;
> > +
> > +    if (!bs->bl.has_variable_length) {
> > +        int ret = bdrv_refresh_total_sectors(bs, bs->total_sectors);
>
> Is this logic backwards?  Why are we only refreshing the total sectors
> when we don't have variable length?
>

Yes, it is backwards.

Paolo


> > +        if (ret < 0) {
> > +            return ret;
> > +        }
> > +    }
> > +
> > +    return bs->total_sectors;
> > +}
> > +
>
> --
> Eric Blake, Principal Software Engineer
> Red Hat, Inc.           +1-919-301-3266
> Virtualization:  qemu.org | libvirt.org
>
>

Reply via email to