All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Cornelia Huck <cornelia.huck@de.ibm.com>
Cc: Maxime Coquelin <maxime.coquelin@redhat.com>,
	mdroth@linux.vnet.ibm.com, stefanha@redhat.com,
	qemu-devel@nongnu.org, marcel@redhat.com,
	"Dr . David Alan Gilbert" <dgilbert@redhat.com>
Subject: Re: [Qemu-devel] [PATCH] virtio-pci: Fix cross-version migration with older machines
Date: Wed, 14 Dec 2016 15:16:13 +0200	[thread overview]
Message-ID: <20161214151332-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20161214141210.22d12962.cornelia.huck@de.ibm.com>

On Wed, Dec 14, 2016 at 02:12:10PM +0100, Cornelia Huck wrote:
> On Wed, 14 Dec 2016 13:52:37 +0100
> Maxime Coquelin <maxime.coquelin@redhat.com> wrote:
> 
> > This patch fixes a cross-version migration regression introduced
> > by commit d1b4259f ("virtio-bus: Plug devices after features are
> > negotiated").
> > 
> > The problem is encountered when host's vhost backend does not support
> > VIRTIO_F_VERSION_1, and migration is initiated from a v2.7 or prior
> > machine with virtio-pci modern capabilities enabled to a v2.8 machine.
> 
> Wait, machine versions or qemu versions?
> 
> > 
> > In this case, modern capabilities get exposed to the guest by the source,
> > whereas the target will detect version 1 is not supported so will only
> > expose legacy capabilities.
> > 
> > The problem is fixed by introducing a new "x-modern-broken" property,
> > which is set in v2.7 and prior compatibility modes. Doing this, v2.7
> > machine keeps its broken behaviour (enabling modern while version is
> > not supported), and newer machines will behave correctly.
> > 
> > Reported-by: Michael Roth <mdroth@linux.vnet.ibm.com>
> > Suggested-by: Stefan Hajnoczi <stefanha@redhat.com>
> > Cc: Michael S. Tsirkin <mst@redhat.com>
> > Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
> > Cc: Marcel Apfelbaum <marcel@redhat.com>
> > Cc: Dr. David Alan Gilbert <dgilbert@redhat.com>
> > Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> > ---
> > 
> > I'm not sure about the property name, let me know if you have better ideas.
> > I didn't tested migration yet, but I wanted to share the patch while I test it.
> > I tested booting v2.8 and v2.7 machines with !VERSION_1 and get expected result:
> >  - v2.8: Virtio-pci probe succeed
> >  - v2.7: Virtio-pci probe fails
> > 
> > Thanks,
> > Maxime
> > 
> >  hw/virtio/virtio-pci.c | 4 +++-
> >  hw/virtio/virtio-pci.h | 1 +
> >  include/hw/compat.h    | 4 ++++
> >  3 files changed, 8 insertions(+), 1 deletion(-)
> > 
> > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> > index 521ba0b..93f6b54 100644
> > --- a/hw/virtio/virtio-pci.c
> > +++ b/hw/virtio/virtio-pci.c
> > @@ -1580,7 +1580,8 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
> >       * Virtio capabilities present without
> >       * VIRTIO_F_VERSION_1 confuses guests
> >       */
> > -    if (!virtio_has_feature(vdev->host_features, VIRTIO_F_VERSION_1)) {
> > +    if (!proxy->modern_broken &&
> 
> What you are de facto doing here is ignoring the features supported by
> the backend. Call this ->ignore_backend_features or so?
> 
> > +            !virtio_has_feature(vdev->host_features, VIRTIO_F_VERSION_1)) {
> >          virtio_pci_disable_modern(proxy);
> > 
> >          if (!legacy) {
> > @@ -1852,6 +1853,7 @@ static Property virtio_pci_properties[] = {
> >                      VIRTIO_PCI_FLAG_DISABLE_PCIE_BIT, false),
> >      DEFINE_PROP_BIT("page-per-vq", VirtIOPCIProxy, flags,
> >                      VIRTIO_PCI_FLAG_PAGE_PER_VQ_BIT, false),
> > +    DEFINE_PROP_BOOL("x-modern-broken", VirtIOPCIProxy, modern_broken, false),
> 
> What about "x-ignore-backend-features"?

It's just the capability that ignores that backend is legacy.

x-cap-ignore-backend-legacy

?

> >      DEFINE_PROP_END_OF_LIST(),
> >  };
> > 
> > diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h
> > index b2a996f..1dca223 100644
> > --- a/hw/virtio/virtio-pci.h
> > +++ b/hw/virtio/virtio-pci.h
> > @@ -153,6 +153,7 @@ struct VirtIOPCIProxy {
> >      int config_cap;
> >      uint32_t flags;
> >      bool disable_modern;
> > +    bool modern_broken;
> >      OnOffAuto disable_legacy;
> >      uint32_t class_code;
> >      uint32_t nvectors;
> > diff --git a/include/hw/compat.h b/include/hw/compat.h
> > index 0f06e11..fe11723 100644
> > --- a/include/hw/compat.h
> > +++ b/include/hw/compat.h
> > @@ -18,6 +18,10 @@
> >          .driver   = "intel-iommu",\
> >          .property = "x-buggy-eim",\
> >          .value    = "true",\
> > +    },{\
> > +        .driver   = "virtio-pci",\
> > +        .property = "x-modern-broken",\
> > +        .value    = "on",\
> 
> This unfortunately has the same problem wrt -global propagation as the
> other virtio-pci compat props (unexpeced overrides). There's basically
> zero chance, however, that somebody will want to set this property
> manually (unline disable-legacy/disable-modern), and there's a patch
> targeting 2.8.1, so I think we can live with it. (Alternatively, you
> would need to set this property on all possible virtio-pci devices.)

YEs.

> >      },
> > 
> >  #define HW_COMPAT_2_6 \

  reply	other threads:[~2016-12-14 13:16 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-14 12:52 [Qemu-devel] [PATCH] virtio-pci: Fix cross-version migration with older machines Maxime Coquelin
2016-12-14 13:12 ` Cornelia Huck
2016-12-14 13:16   ` Michael S. Tsirkin [this message]
2016-12-14 13:21     ` Cornelia Huck
2016-12-14 13:29       ` Maxime Coquelin
2016-12-14 13:45         ` Stefan Hajnoczi
2016-12-14 13:13 ` Michael S. Tsirkin
2016-12-14 13:31 ` Marcel Apfelbaum
2016-12-14 15:08 ` Michael Roth
2016-12-14 15:15   ` Michael S. Tsirkin
2016-12-14 15:20     ` Maxime Coquelin
2016-12-14 16:02     ` Michael Roth
2016-12-14 16:53       ` Michael Roth
2016-12-14 16:56         ` Michael Roth
2016-12-14 16:57           ` Maxime Coquelin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161214151332-mutt-send-email-mst@kernel.org \
    --to=mst@redhat.com \
    --cc=cornelia.huck@de.ibm.com \
    --cc=dgilbert@redhat.com \
    --cc=marcel@redhat.com \
    --cc=maxime.coquelin@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.