-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
packaging: apply qemu v5.1 stable fixes
Qemu v5.1 was released with an affending commit 9b3a35ec82 (virtio: verify that legacy support is not accidentally on). As a result, it breaks commandline compatiblilities for old qemu users. Upstream qemu has fixed it but no release has been put out yet. Let's apply these fixes by hand for now. Refs: https://www.mail-archive.com/qemu-devel@nongnu.org/msg729556.html Depends-on: github.com/kata-containers/tests#2945 Signed-off-by: Peng Tao <bergwolf@hyper.sh>
- Loading branch information
Showing
4 changed files
with
325 additions
and
0 deletions.
There are no files selected for viewing
143 changes: 143 additions & 0 deletions
143
...kaging/qemu/patches/5.1.x/0002-virtio-skip-legacy-support-check-on-machine-types-le.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
From d55f518248f263bb8d0852f98e47102ea09d4f89 Mon Sep 17 00:00:00 2001 | ||
From: Stefano Garzarella <sgarzare@redhat.com> | ||
Date: Mon, 21 Sep 2020 14:25:03 +0200 | ||
Subject: [PATCH 1/4] virtio: skip legacy support check on machine types less | ||
than 5.1 | ||
|
||
Commit 9b3a35ec82 ("virtio: verify that legacy support is not accidentally | ||
on") added a check that returns an error if legacy support is on, but the | ||
device does not support legacy. | ||
|
||
Unfortunately some devices were wrongly declared legacy capable even if | ||
they were not (e.g vhost-vsock). | ||
|
||
To avoid migration issues, we add a virtio-device property | ||
(x-disable-legacy-check) to skip the legacy error, printing a warning | ||
instead, for machine types < 5.1. | ||
|
||
Cc: qemu-stable@nongnu.org | ||
Fixes: 9b3a35ec82 ("virtio: verify that legacy support is not accidentally on") | ||
Suggested-by: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||
Suggested-by: Cornelia Huck <cohuck@redhat.com> | ||
Reviewed-by: Cornelia Huck <cohuck@redhat.com> | ||
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> | ||
Message-Id: <20200921122506.82515-2-sgarzare@redhat.com> | ||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||
--- | ||
hw/core/machine.c | 1 + | ||
hw/s390x/virtio-ccw.c | 15 ++++++++++++--- | ||
hw/virtio/virtio-pci.c | 14 ++++++++++++-- | ||
hw/virtio/virtio.c | 7 +++++++ | ||
include/hw/virtio/virtio.h | 2 ++ | ||
5 files changed, 34 insertions(+), 5 deletions(-) | ||
|
||
diff --git a/hw/core/machine.c b/hw/core/machine.c | ||
index 9b02fb2..d7f4a0d 100644 | ||
--- a/hw/core/machine.c | ||
+++ b/hw/core/machine.c | ||
@@ -44,6 +44,7 @@ GlobalProperty hw_compat_5_0[] = { | ||
{ "vmport", "x-signal-unsupported-cmd", "off" }, | ||
{ "vmport", "x-report-vmx-type", "off" }, | ||
{ "vmport", "x-cmds-v2", "off" }, | ||
+ { "virtio-device", "x-disable-legacy-check", "true" }, | ||
}; | ||
const size_t hw_compat_5_0_len = G_N_ELEMENTS(hw_compat_5_0); | ||
|
||
diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c | ||
index 8d140dc..4582e94 100644 | ||
--- a/hw/s390x/virtio-ccw.c | ||
+++ b/hw/s390x/virtio-ccw.c | ||
@@ -1122,9 +1122,18 @@ static void virtio_ccw_device_plugged(DeviceState *d, Error **errp) | ||
} | ||
|
||
if (!virtio_ccw_rev_max(dev) && !virtio_legacy_allowed(vdev)) { | ||
- error_setg(errp, "Invalid value of property max_rev " | ||
- "(is %d expected >= 1)", virtio_ccw_rev_max(dev)); | ||
- return; | ||
+ /* | ||
+ * To avoid migration issues, we allow legacy mode when legacy | ||
+ * check is disabled in the old machine types (< 5.1). | ||
+ */ | ||
+ if (virtio_legacy_check_disabled(vdev)) { | ||
+ warn_report("device requires revision >= 1, but for backward " | ||
+ "compatibility max_revision=0 is allowed"); | ||
+ } else { | ||
+ error_setg(errp, "Invalid value of property max_rev " | ||
+ "(is %d expected >= 1)", virtio_ccw_rev_max(dev)); | ||
+ return; | ||
+ } | ||
} | ||
|
||
if (virtio_get_num_queues(vdev) > VIRTIO_QUEUE_MAX) { | ||
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c | ||
index 02790e3..36524a5 100644 | ||
--- a/hw/virtio/virtio-pci.c | ||
+++ b/hw/virtio/virtio-pci.c | ||
@@ -1597,8 +1597,18 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp) | ||
|
||
if (legacy) { | ||
if (!virtio_legacy_allowed(vdev)) { | ||
- error_setg(errp, "device is modern-only, use disable-legacy=on"); | ||
- return; | ||
+ /* | ||
+ * To avoid migration issues, we allow legacy mode when legacy | ||
+ * check is disabled in the old machine types (< 5.1). | ||
+ */ | ||
+ if (virtio_legacy_check_disabled(vdev)) { | ||
+ warn_report("device is modern-only, but for backward " | ||
+ "compatibility legacy is allowed"); | ||
+ } else { | ||
+ error_setg(errp, | ||
+ "device is modern-only, use disable-legacy=on"); | ||
+ return; | ||
+ } | ||
} | ||
if (virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM)) { | ||
error_setg(errp, "VIRTIO_F_IOMMU_PLATFORM was supported by" | ||
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c | ||
index 3a3d012..a2edb4f 100644 | ||
--- a/hw/virtio/virtio.c | ||
+++ b/hw/virtio/virtio.c | ||
@@ -3304,6 +3304,11 @@ bool virtio_legacy_allowed(VirtIODevice *vdev) | ||
} | ||
} | ||
|
||
+bool virtio_legacy_check_disabled(VirtIODevice *vdev) | ||
+{ | ||
+ return vdev->disable_legacy_check; | ||
+} | ||
+ | ||
hwaddr virtio_queue_get_desc_addr(VirtIODevice *vdev, int n) | ||
{ | ||
return vdev->vq[n].vring.desc; | ||
@@ -3713,6 +3718,8 @@ static Property virtio_properties[] = { | ||
DEFINE_VIRTIO_COMMON_FEATURES(VirtIODevice, host_features), | ||
DEFINE_PROP_BOOL("use-started", VirtIODevice, use_started, true), | ||
DEFINE_PROP_BOOL("use-disabled-flag", VirtIODevice, use_disabled_flag, true), | ||
+ DEFINE_PROP_BOOL("x-disable-legacy-check", VirtIODevice, | ||
+ disable_legacy_check, false), | ||
DEFINE_PROP_END_OF_LIST(), | ||
}; | ||
|
||
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h | ||
index 28cf3b9..b7ece7a 100644 | ||
--- a/include/hw/virtio/virtio.h | ||
+++ b/include/hw/virtio/virtio.h | ||
@@ -101,6 +101,7 @@ struct VirtIODevice | ||
bool use_started; | ||
bool started; | ||
bool start_on_kick; /* when virtio 1.0 feature has not been negotiated */ | ||
+ bool disable_legacy_check; | ||
VMChangeStateEntry *vmstate; | ||
char *bus_name; | ||
uint8_t device_endian; | ||
@@ -394,5 +395,6 @@ static inline bool virtio_device_disabled(VirtIODevice *vdev) | ||
} | ||
|
||
bool virtio_legacy_allowed(VirtIODevice *vdev); | ||
+bool virtio_legacy_check_disabled(VirtIODevice *vdev); | ||
|
||
#endif | ||
-- | ||
1.8.3.1 |
73 changes: 73 additions & 0 deletions
73
tools/packaging/qemu/patches/5.1.x/0003-vhost-vsock-pci-force-virtio-version-1.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
From 6209070503989cf4f28549f228989419d4f0b236 Mon Sep 17 00:00:00 2001 | ||
From: Stefano Garzarella <sgarzare@redhat.com> | ||
Date: Mon, 21 Sep 2020 14:25:04 +0200 | ||
Subject: [PATCH 2/4] vhost-vsock-pci: force virtio version 1 | ||
|
||
Commit 9b3a35ec82 ("virtio: verify that legacy support is not | ||
accidentally on") added a safety check that requires to set | ||
'disable-legacy=on' on vhost-vsock-pci device: | ||
|
||
$ ./qemu-system-x86_64 ... -device vhost-vsock-pci,guest-cid=5 | ||
qemu-system-x86_64: -device vhost-vsock-pci,guest-cid=5: | ||
device is modern-only, use disable-legacy=on | ||
|
||
virtio-vsock was introduced after the release of VIRTIO 1.0 | ||
specifications, so it should be 'modern-only'. | ||
In addition Cornelia verified that forcing a legacy mode on | ||
vhost-vsock-pci device using x86-64 host and s390x guest, so with | ||
different endianness, produces strange behaviours. | ||
|
||
This patch forces virtio version 1 and removes the 'transitional_name' | ||
property removing the need to specify 'disable-legacy=on' on | ||
vhost-vsock-pci device. | ||
|
||
To avoid migration issues, we force virtio version 1 only when | ||
legacy check is enabled in the new machine types (>= 5.1). | ||
|
||
As the transitional device name is not commonly used, we do not | ||
provide compatibility handling for it. | ||
|
||
Cc: qemu-stable@nongnu.org | ||
Reported-by: Qian Cai <caiqian@redhat.com> | ||
Reported-by: Qinghua Cheng <qcheng@redhat.com> | ||
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1868449 | ||
Suggested-by: Cornelia Huck <cohuck@redhat.com> | ||
Reviewed-by: Cornelia Huck <cohuck@redhat.com> | ||
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> | ||
Message-Id: <20200921122506.82515-3-sgarzare@redhat.com> | ||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||
--- | ||
hw/virtio/vhost-vsock-pci.c | 10 +++++++++- | ||
1 file changed, 9 insertions(+), 1 deletion(-) | ||
|
||
diff --git a/hw/virtio/vhost-vsock-pci.c b/hw/virtio/vhost-vsock-pci.c | ||
index e56067b..205da8d 100644 | ||
--- a/hw/virtio/vhost-vsock-pci.c | ||
+++ b/hw/virtio/vhost-vsock-pci.c | ||
@@ -44,6 +44,15 @@ static void vhost_vsock_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp) | ||
{ | ||
VHostVSockPCI *dev = VHOST_VSOCK_PCI(vpci_dev); | ||
DeviceState *vdev = DEVICE(&dev->vdev); | ||
+ VirtIODevice *virtio_dev = VIRTIO_DEVICE(vdev); | ||
+ | ||
+ /* | ||
+ * To avoid migration issues, we force virtio version 1 only when | ||
+ * legacy check is enabled in the new machine types (>= 5.1). | ||
+ */ | ||
+ if (!virtio_legacy_check_disabled(virtio_dev)) { | ||
+ virtio_pci_force_virtio_1(vpci_dev); | ||
+ } | ||
|
||
qdev_realize(vdev, BUS(&vpci_dev->bus), errp); | ||
} | ||
@@ -73,7 +82,6 @@ static void vhost_vsock_pci_instance_init(Object *obj) | ||
static const VirtioPCIDeviceTypeInfo vhost_vsock_pci_info = { | ||
.base_name = TYPE_VHOST_VSOCK_PCI, | ||
.generic_name = "vhost-vsock-pci", | ||
- .transitional_name = "vhost-vsock-pci-transitional", | ||
.non_transitional_name = "vhost-vsock-pci-non-transitional", | ||
.instance_size = sizeof(VHostVSockPCI), | ||
.instance_init = vhost_vsock_pci_instance_init, | ||
-- | ||
1.8.3.1 |
57 changes: 57 additions & 0 deletions
57
tools/packaging/qemu/patches/5.1.x/0004-vhost-user-vsock-pci-force-virtio-version-1.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
From 27eda699f59d430c33fc054a36a17251992e70dc Mon Sep 17 00:00:00 2001 | ||
From: Stefano Garzarella <sgarzare@redhat.com> | ||
Date: Mon, 21 Sep 2020 14:25:05 +0200 | ||
Subject: [PATCH 3/4] vhost-user-vsock-pci: force virtio version 1 | ||
|
||
Commit 9b3a35ec82 ("virtio: verify that legacy support is not | ||
accidentally on") added a safety check that requires to set | ||
'disable-legacy=on' on vhost-user-vsock-pci device: | ||
|
||
$ ./qemu-system-x86_64 ... \ | ||
-chardev socket,id=char0,reconnect=0,path=/tmp/vhost4.socket \ | ||
-device vhost-user-vsock-pci,chardev=char0 | ||
qemu-system-x86_64: -device vhost-user-vsock-pci,chardev=char0: | ||
device is modern-only, use disable-legacy=on | ||
|
||
virtio-vsock was introduced after the release of VIRTIO 1.0 | ||
specifications, so it should be 'modern-only'. | ||
|
||
This patch forces virtio version 1 and removes the 'transitional_name' | ||
property, as done for vhost-vsock-pci, removing the need to specify | ||
'disable-legacy=on' on vhost-user-vsock-pci device. | ||
|
||
Cc: qemu-stable@nongnu.org | ||
Suggested-by: Cornelia Huck <cohuck@redhat.com> | ||
Reviewed-by: Cornelia Huck <cohuck@redhat.com> | ||
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> | ||
Message-Id: <20200921122506.82515-4-sgarzare@redhat.com> | ||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||
--- | ||
hw/virtio/vhost-user-vsock-pci.c | 4 +++- | ||
1 file changed, 3 insertions(+), 1 deletion(-) | ||
|
||
diff --git a/hw/virtio/vhost-user-vsock-pci.c b/hw/virtio/vhost-user-vsock-pci.c | ||
index 763f899..72a9619 100644 | ||
--- a/hw/virtio/vhost-user-vsock-pci.c | ||
+++ b/hw/virtio/vhost-user-vsock-pci.c | ||
@@ -41,6 +41,9 @@ static void vhost_user_vsock_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp) | ||
VHostUserVSockPCI *dev = VHOST_USER_VSOCK_PCI(vpci_dev); | ||
DeviceState *vdev = DEVICE(&dev->vdev); | ||
|
||
+ /* unlike vhost-vsock, we do not need to care about pre-5.1 compat */ | ||
+ virtio_pci_force_virtio_1(vpci_dev); | ||
+ | ||
qdev_realize(vdev, BUS(&vpci_dev->bus), errp); | ||
} | ||
|
||
@@ -69,7 +72,6 @@ static void vhost_user_vsock_pci_instance_init(Object *obj) | ||
static const VirtioPCIDeviceTypeInfo vhost_user_vsock_pci_info = { | ||
.base_name = TYPE_VHOST_USER_VSOCK_PCI, | ||
.generic_name = "vhost-user-vsock-pci", | ||
- .transitional_name = "vhost-user-vsock-pci-transitional", | ||
.non_transitional_name = "vhost-user-vsock-pci-non-transitional", | ||
.instance_size = sizeof(VHostUserVSockPCI), | ||
.instance_init = vhost_user_vsock_pci_instance_init, | ||
-- | ||
1.8.3.1 |
52 changes: 52 additions & 0 deletions
52
tools/packaging/qemu/patches/5.1.x/0005-vhost-vsock-ccw-force-virtio-version-1.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
From a6704a34cf02add13964149e0de6453ae62bd9db Mon Sep 17 00:00:00 2001 | ||
From: Stefano Garzarella <sgarzare@redhat.com> | ||
Date: Mon, 21 Sep 2020 14:25:06 +0200 | ||
Subject: [PATCH 4/4] vhost-vsock-ccw: force virtio version 1 | ||
|
||
virtio-vsock was introduced after the release of VIRTIO 1.0 | ||
specifications, so it should be 'modern-only'. | ||
|
||
This patch forces virtio version 1 as done for vhost-vsock-pci. | ||
|
||
To avoid migration issues, we force virtio version 1 only when | ||
legacy check is enabled in the new machine types (>= 5.1). | ||
|
||
Cc: qemu-stable@nongnu.org | ||
Suggested-by: Cornelia Huck <cohuck@redhat.com> | ||
Reviewed-by: Cornelia Huck <cohuck@redhat.com> | ||
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> | ||
Message-Id: <20200921122506.82515-5-sgarzare@redhat.com> | ||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||
--- | ||
hw/s390x/vhost-vsock-ccw.c | 12 ++++++++++++ | ||
1 file changed, 12 insertions(+) | ||
|
||
diff --git a/hw/s390x/vhost-vsock-ccw.c b/hw/s390x/vhost-vsock-ccw.c | ||
index 0822ecc..246416a 100644 | ||
--- a/hw/s390x/vhost-vsock-ccw.c | ||
+++ b/hw/s390x/vhost-vsock-ccw.c | ||
@@ -40,9 +40,21 @@ static void vhost_vsock_ccw_class_init(ObjectClass *klass, void *data) | ||
static void vhost_vsock_ccw_instance_init(Object *obj) | ||
{ | ||
VHostVSockCCWState *dev = VHOST_VSOCK_CCW(obj); | ||
+ VirtioCcwDevice *ccw_dev = VIRTIO_CCW_DEVICE(obj); | ||
+ VirtIODevice *virtio_dev; | ||
|
||
virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), | ||
TYPE_VHOST_VSOCK); | ||
+ | ||
+ virtio_dev = VIRTIO_DEVICE(&dev->vdev); | ||
+ | ||
+ /* | ||
+ * To avoid migration issues, we force virtio version 1 only when | ||
+ * legacy check is enabled in the new machine types (>= 5.1). | ||
+ */ | ||
+ if (!virtio_legacy_check_disabled(virtio_dev)) { | ||
+ ccw_dev->force_revision_1 = true; | ||
+ } | ||
} | ||
|
||
static const TypeInfo vhost_vsock_ccw_info = { | ||
-- | ||
1.8.3.1 |