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