diff mbox series

[66/77] virtio: verify that legacy support is not accidentally on

Message ID 20200903205935.27832-67-mdroth@linux.vnet.ibm.com
State New
Headers show
Series Patch Round-up for stable 5.0.1, freeze on 2020-09-10 | expand

Commit Message

Michael Roth Sept. 3, 2020, 8:59 p.m. UTC
From: Cornelia Huck <cohuck@redhat.com>

If a virtio device does not have legacy support, make sure that
it is actually off, and bail out if not.

For virtio-pci, this means that any device without legacy support
that has been specified to modern-only (or that has been forced
to it) will work.

For virtio-ccw, this duplicates the check that is currently done
prior to realization for any device that explicitly specified no
support for legacy.

This catches devices that have not been fenced properly.

Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Message-Id: <20200707105446.677966-3-cohuck@redhat.com>
Cc: qemu-stable@nongnu.org
Acked-by: Halil Pasic <pasic@linux.ibm.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
(cherry picked from commit 9b3a35ec8236933ab958a4c3ad883163f1ca66e7)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
 hw/s390x/virtio-ccw.c  | 6 ++++++
 hw/virtio/virtio-pci.c | 4 ++++
 2 files changed, 10 insertions(+)

Comments

Cornelia Huck Sept. 7, 2020, 12:18 p.m. UTC | #1
On Thu,  3 Sep 2020 15:59:24 -0500
Michael Roth <mdroth@linux.vnet.ibm.com> wrote:

> From: Cornelia Huck <cohuck@redhat.com>
> 
> If a virtio device does not have legacy support, make sure that
> it is actually off, and bail out if not.
> 
> For virtio-pci, this means that any device without legacy support
> that has been specified to modern-only (or that has been forced
> to it) will work.
> 
> For virtio-ccw, this duplicates the check that is currently done
> prior to realization for any device that explicitly specified no
> support for legacy.
> 
> This catches devices that have not been fenced properly.
> 
> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
> Message-Id: <20200707105446.677966-3-cohuck@redhat.com>
> Cc: qemu-stable@nongnu.org
> Acked-by: Halil Pasic <pasic@linux.ibm.com>
> Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> (cherry picked from commit 9b3a35ec8236933ab958a4c3ad883163f1ca66e7)
> Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
> ---
>  hw/s390x/virtio-ccw.c  | 6 ++++++
>  hw/virtio/virtio-pci.c | 4 ++++
>  2 files changed, 10 insertions(+)

I don't think we want to backport this (and the previous patch) to
stable. (Actually, my original patch didn't have the stable tag.)

This has flushed out several devices (mem, vsock, iommu) that should be
modern only, but weren't; unfortunately, this also breaks existing
command line invocations. We *might* consider including this together
with patches that force those devices to modern only, but I see only
the patch for virtio-mem has reached master yet.
diff mbox series

Patch

diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
index 64f928fc7d..c069719429 100644
--- a/hw/s390x/virtio-ccw.c
+++ b/hw/s390x/virtio-ccw.c
@@ -1119,6 +1119,12 @@  static void virtio_ccw_device_plugged(DeviceState *d, Error **errp)
         dev->max_rev = 0;
     }
 
+    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;
+    }
+
     if (virtio_get_num_queues(vdev) > VIRTIO_QUEUE_MAX) {
         error_setg(errp, "The number of virtqueues %d "
                    "exceeds virtio limit %d", n,
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 4cb784389c..2ca266e1cb 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1565,6 +1565,10 @@  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;
+        }
         if (virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM)) {
             error_setg(errp, "VIRTIO_F_IOMMU_PLATFORM was supported by"
                        " neither legacy nor transitional device");