From f117f5fb216e45796a32579c03673c1d79164037 Mon Sep 17 00:00:00 2001 From: Peter Xu Date: Wed, 9 Oct 2019 12:39:46 +0100 Subject: [PATCH 20/22] pc/q35: Disallow vfio-pci hotplug without VT-d caching mode RH-Author: Peter Xu Message-id: <20191009123947.21505-5-peterx@redhat.com> Patchwork-id: 91352 O-Subject: [RHEL-8.2.0 qemu-kvm PATCH 4/5] pc/q35: Disallow vfio-pci hotplug without VT-d caching mode Bugzilla: 1738440 RH-Acked-by: Paolo Bonzini RH-Acked-by: Auger Eric RH-Acked-by: Alex Williamson Signed-off-by: Danilo C. L. de Paula Conflicts: hw/i386/pc.c: context differs on quite a few places in pc_machine_class_init(), but none of them is really relevant to current change. Instead of bailing out when trying to hotplug a vfio-pci device with below configuration: -device intel-iommu,caching-mode=off With this we can return a warning message to the user via QMP/HMP and the VM will continue to work after failing the hotplug: (qemu) device_add vfio-pci,bus=root.3,host=05:00.0,id=vfio1 Error: Device assignment is not allowed without enabling caching-mode=on for Intel IOMMU. Reviewed-by: Eric Auger Signed-off-by: Peter Xu Message-Id: <20190916080718.3299-4-peterx@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin (cherry picked from commit c6cbc29d36fe8df078776ed715c37cebac582238) Signed-off-by: Peter Xu Signed-off-by: Danilo C. L. de Paula --- hw/i386/pc.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 9e1e6ae..d6c4050 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -2340,6 +2340,26 @@ static void x86_nmi(NMIState *n, int cpu_index, Error **errp) } } + +static bool pc_hotplug_allowed(MachineState *ms, DeviceState *dev, Error **errp) +{ + X86IOMMUState *iommu = x86_iommu_get_default(); + IntelIOMMUState *intel_iommu; + + if (iommu && + object_dynamic_cast((Object *)iommu, TYPE_INTEL_IOMMU_DEVICE) && + object_dynamic_cast((Object *)dev, "vfio-pci")) { + intel_iommu = INTEL_IOMMU_DEVICE(iommu); + if (!intel_iommu->caching_mode) { + error_setg(errp, "Device assignment is not allowed without " + "enabling caching-mode=on for Intel IOMMU."); + return false; + } + } + + return true; +} + static void pc_machine_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); @@ -2369,6 +2389,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) */ mc->async_pf_vmexit_disable = true; mc->get_hotplug_handler = pc_get_hotpug_handler; + mc->hotplug_allowed = pc_hotplug_allowed; mc->cpu_index_to_instance_props = pc_cpu_index_to_props; mc->get_default_cpu_node_id = pc_get_default_cpu_node_id; mc->possible_cpu_arch_ids = pc_possible_cpu_arch_ids; -- 1.8.3.1