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