From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55239) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cH93D-0002G4-W6 for qemu-devel@nongnu.org; Wed, 14 Dec 2016 07:52:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cH937-0007CN-Ou for qemu-devel@nongnu.org; Wed, 14 Dec 2016 07:52:52 -0500 Received: from mx1.redhat.com ([209.132.183.28]:41480) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cH937-0007C5-FW for qemu-devel@nongnu.org; Wed, 14 Dec 2016 07:52:45 -0500 From: Maxime Coquelin Date: Wed, 14 Dec 2016 13:52:37 +0100 Message-Id: <20161214125237.20850-1-maxime.coquelin@redhat.com> Subject: [Qemu-devel] [PATCH] virtio-pci: Fix cross-version migration with older machines List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: mdroth@linux.vnet.ibm.com, stefanha@redhat.com, qemu-devel@nongnu.org, mst@redhat.com, cornelia.huck@de.ibm.com, marcel@redhat.com Cc: Maxime Coquelin , "Dr . David Alan Gilbert" 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. 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 Suggested-by: Stefan Hajnoczi Cc: Michael S. Tsirkin Cc: Cornelia Huck Cc: Marcel Apfelbaum Cc: Dr. David Alan Gilbert Signed-off-by: Maxime Coquelin --- 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 && + !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), 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",\ }, #define HW_COMPAT_2_6 \ -- 2.9.3