thebeanogamer / rpms / qemu-kvm

Forked from rpms/qemu-kvm 5 months ago
Clone
ed5979
From cadcc1c6a001622d971c86d44925516905e3d104 Mon Sep 17 00:00:00 2001
ed5979
From: Jason Wang <jasowang@redhat.com>
ed5979
Date: Thu, 23 Feb 2023 14:59:21 +0800
ed5979
Subject: [PATCH 8/8] intel-iommu: fail DEVIOTLB_UNMAP without dt mode
ed5979
ed5979
RH-Author: Laurent Vivier <lvivier@redhat.com>
ed5979
RH-MergeRequest: 157: intel-iommu: fail DEVIOTLB_UNMAP without dt mode
ed5979
RH-Bugzilla: 2156876
ed5979
RH-Acked-by: Eric Auger <eric.auger@redhat.com>
ed5979
RH-Acked-by: Peter Xu <peterx@redhat.com>
ed5979
RH-Acked-by: MST <mst@redhat.com>
ed5979
RH-Commit: [1/1] eb9dbae6140ef4ba10d90b9e66abd75540f6892d (lvivier/qemu-kvm-centos)
ed5979
ed5979
Without dt mode, device IOTLB notifier won't work since guest won't
ed5979
send device IOTLB invalidation descriptor in this case. Let's fail
ed5979
early instead of misbehaving silently.
ed5979
ed5979
Reviewed-by: Laurent Vivier <lvivier@redhat.com>
ed5979
Tested-by: Laurent Vivier <lvivier@redhat.com>
ed5979
Tested-by: Viktor Prutyanov <viktor@daynix.com>
ed5979
Buglink: https://bugzilla.redhat.com/2156876
ed5979
Signed-off-by: Jason Wang <jasowang@redhat.com>
ed5979
Message-Id: <20230223065924.42503-3-jasowang@redhat.com>
ed5979
Reviewed-by: Peter Xu <peterx@redhat.com>
ed5979
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
ed5979
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
ed5979
(cherry picked from commit 09adb0e021207b60a0c51a68939b4539d98d3ef3)
ed5979
ed5979
Conflict in hw/i386/intel_iommu.c because of missing commit:
ed5979
ed5979
    4ce27463ccce ("intel-iommu: fail MAP notifier without caching mode")
ed5979
---
ed5979
 hw/i386/intel_iommu.c | 8 ++++++++
ed5979
 1 file changed, 8 insertions(+)
ed5979
ed5979
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
ed5979
index a08ee85edf..d2983f40d3 100644
ed5979
--- a/hw/i386/intel_iommu.c
ed5979
+++ b/hw/i386/intel_iommu.c
ed5979
@@ -3179,6 +3179,7 @@ static int vtd_iommu_notify_flag_changed(IOMMUMemoryRegion *iommu,
ed5979
 {
ed5979
     VTDAddressSpace *vtd_as = container_of(iommu, VTDAddressSpace, iommu);
ed5979
     IntelIOMMUState *s = vtd_as->iommu_state;
ed5979
+    X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(s);
ed5979
 
ed5979
     /* TODO: add support for VFIO and vhost users */
ed5979
     if (s->snoop_control) {
ed5979
@@ -3186,6 +3187,13 @@ static int vtd_iommu_notify_flag_changed(IOMMUMemoryRegion *iommu,
ed5979
                          "Snoop Control with vhost or VFIO is not supported");
ed5979
         return -ENOTSUP;
ed5979
     }
ed5979
+    if (!x86_iommu->dt_supported && (new & IOMMU_NOTIFIER_DEVIOTLB_UNMAP)) {
ed5979
+        error_setg_errno(errp, ENOTSUP,
ed5979
+                         "device %02x.%02x.%x requires device IOTLB mode",
ed5979
+                         pci_bus_num(vtd_as->bus), PCI_SLOT(vtd_as->devfn),
ed5979
+                         PCI_FUNC(vtd_as->devfn));
ed5979
+        return -ENOTSUP;
ed5979
+    }
ed5979
 
ed5979
     /* Update per-address-space notifier flags */
ed5979
     vtd_as->notifier_flags = new;
ed5979
-- 
ed5979
2.39.1
ed5979