提交 66d1c4c1 编写于 作者: M Maxime Coquelin 提交者: Stefan Hajnoczi

virtio-pci: Fix cross-version migration with older machines

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-ignore-backend-features"
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: NMichael Roth <mdroth@linux.vnet.ibm.com>
Reviewed-by: NMarcel Apfelbaum <marcel@redhat.com>
Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: NMichael S. Tsirkin <mst@redhat.com>
Tested-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
Signed-off-by: NMaxime Coquelin <maxime.coquelin@redhat.com>
Message-id: 20161214163035.3297-1-maxime.coquelin@redhat.com
Suggested-by: NStefan Hajnoczi <stefanha@redhat.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
Cc: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: NMarcel Apfelbaum <marcel@redhat.com>
Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
Tested-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
Signed-off-by: NMaxime Coquelin <maxime.coquelin@redhat.com>
Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
上级 d70678a5
...@@ -1580,7 +1580,8 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp) ...@@ -1580,7 +1580,8 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
* Virtio capabilities present without * Virtio capabilities present without
* VIRTIO_F_VERSION_1 confuses guests * VIRTIO_F_VERSION_1 confuses guests
*/ */
if (!virtio_has_feature(vdev->host_features, VIRTIO_F_VERSION_1)) { if (!proxy->ignore_backend_features &&
!virtio_has_feature(vdev->host_features, VIRTIO_F_VERSION_1)) {
virtio_pci_disable_modern(proxy); virtio_pci_disable_modern(proxy);
if (!legacy) { if (!legacy) {
...@@ -1852,6 +1853,8 @@ static Property virtio_pci_properties[] = { ...@@ -1852,6 +1853,8 @@ static Property virtio_pci_properties[] = {
VIRTIO_PCI_FLAG_DISABLE_PCIE_BIT, false), VIRTIO_PCI_FLAG_DISABLE_PCIE_BIT, false),
DEFINE_PROP_BIT("page-per-vq", VirtIOPCIProxy, flags, DEFINE_PROP_BIT("page-per-vq", VirtIOPCIProxy, flags,
VIRTIO_PCI_FLAG_PAGE_PER_VQ_BIT, false), VIRTIO_PCI_FLAG_PAGE_PER_VQ_BIT, false),
DEFINE_PROP_BOOL("x-ignore-backend-features", VirtIOPCIProxy,
ignore_backend_features, false),
DEFINE_PROP_END_OF_LIST(), DEFINE_PROP_END_OF_LIST(),
}; };
......
...@@ -153,6 +153,7 @@ struct VirtIOPCIProxy { ...@@ -153,6 +153,7 @@ struct VirtIOPCIProxy {
int config_cap; int config_cap;
uint32_t flags; uint32_t flags;
bool disable_modern; bool disable_modern;
bool ignore_backend_features;
OnOffAuto disable_legacy; OnOffAuto disable_legacy;
uint32_t class_code; uint32_t class_code;
uint32_t nvectors; uint32_t nvectors;
......
...@@ -18,6 +18,10 @@ ...@@ -18,6 +18,10 @@
.driver = "intel-iommu",\ .driver = "intel-iommu",\
.property = "x-buggy-eim",\ .property = "x-buggy-eim",\
.value = "true",\ .value = "true",\
},{\
.driver = "virtio-pci",\
.property = "x-ignore-backend-features",\
.value = "on",\
}, },
#define HW_COMPAT_2_6 \ #define HW_COMPAT_2_6 \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册