Browse Source

KVM: remove support for kernel-irqchip=off

-machine kernel-irqchip=off is broken for many guest OSes; kernel-irqchip=split
is the replacement that works, so remove the deprecated support for the former.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Paolo Bonzini 2 years ago
parent
commit
eaaaf8abdc

+ 0 - 7
docs/about/deprecated.rst

@@ -58,13 +58,6 @@ and will cause a warning.
 The replacement for the ``nodelay`` short-form boolean option is ``nodelay=on``
 The replacement for the ``nodelay`` short-form boolean option is ``nodelay=on``
 rather than ``delay=off``.
 rather than ``delay=off``.
 
 
-Userspace local APIC with KVM (x86, since 6.0)
-''''''''''''''''''''''''''''''''''''''''''''''
-
-Using ``-M kernel-irqchip=off`` with x86 machine types that include a local
-APIC is deprecated.  The ``split`` setting is supported, as is using
-``-M kernel-irqchip=off`` with the ISA PC machine type.
-
 hexadecimal sizes with scaling multipliers (since 6.0)
 hexadecimal sizes with scaling multipliers (since 6.0)
 ''''''''''''''''''''''''''''''''''''''''''''''''''''''
 ''''''''''''''''''''''''''''''''''''''''''''''''''''''
 
 

+ 10 - 0
docs/about/removed-features.rst

@@ -616,6 +616,16 @@ x86 ``Icelake-Client`` CPU (removed in 7.1)
 There isn't ever Icelake Client CPU, it is some wrong and imaginary one.
 There isn't ever Icelake Client CPU, it is some wrong and imaginary one.
 Use ``Icelake-Server`` instead.
 Use ``Icelake-Server`` instead.
 
 
+System accelerators
+-------------------
+
+Userspace local APIC with KVM (x86, removed 8.0)
+''''''''''''''''''''''''''''''''''''''''''''''''
+
+``-M kernel-irqchip=off`` cannot be used on KVM if the CPU model includes
+a local APIC.  The ``split`` setting is supported, as is using ``-M
+kernel-irqchip=off`` when the CPU does not have a local APIC.
+
 System emulator machines
 System emulator machines
 ------------------------
 ------------------------
 
 

+ 1 - 1
hw/i386/amd_iommu.c

@@ -1368,7 +1368,7 @@ static MemTxResult amdvi_mem_ir_write(void *opaque, hwaddr addr,
         return MEMTX_ERROR;
         return MEMTX_ERROR;
     }
     }
 
 
-    apic_get_class()->send_msi(&to);
+    apic_get_class(NULL)->send_msi(&to);
 
 
     trace_amdvi_mem_ir_write(to.address, to.data);
     trace_amdvi_mem_ir_write(to.address, to.data);
     return MEMTX_OK;
     return MEMTX_OK;

+ 2 - 2
hw/i386/intel_iommu.c

@@ -396,7 +396,7 @@ static void vtd_generate_interrupt(IntelIOMMUState *s, hwaddr mesg_addr_reg,
 
 
     trace_vtd_irq_generate(msi.address, msi.data);
     trace_vtd_irq_generate(msi.address, msi.data);
 
 
-    apic_get_class()->send_msi(&msi);
+    apic_get_class(NULL)->send_msi(&msi);
 }
 }
 
 
 /* Generate a fault event to software via MSI if conditions are met.
 /* Generate a fault event to software via MSI if conditions are met.
@@ -3529,7 +3529,7 @@ static MemTxResult vtd_mem_ir_write(void *opaque, hwaddr addr,
         return MEMTX_ERROR;
         return MEMTX_ERROR;
     }
     }
 
 
-    apic_get_class()->send_msi(&to);
+    apic_get_class(NULL)->send_msi(&to);
 
 
     return MEMTX_OK;
     return MEMTX_OK;
 }
 }

+ 1 - 1
include/hw/i386/apic_internal.h

@@ -226,6 +226,6 @@ static inline int apic_get_bit(uint32_t *tab, int index)
     return !!(tab[i] & mask);
     return !!(tab[i] & mask);
 }
 }
 
 
-APICCommonClass *apic_get_class(void);
+APICCommonClass *apic_get_class(Error **errp);
 
 
 #endif /* QEMU_APIC_INTERNAL_H */
 #endif /* QEMU_APIC_INTERNAL_H */

+ 11 - 4
target/i386/cpu-sysemu.c

@@ -247,12 +247,16 @@ void x86_cpu_machine_reset_cb(void *opaque)
     cpu_reset(CPU(cpu));
     cpu_reset(CPU(cpu));
 }
 }
 
 
-APICCommonClass *apic_get_class(void)
+APICCommonClass *apic_get_class(Error **errp)
 {
 {
     const char *apic_type = "apic";
     const char *apic_type = "apic";
 
 
     /* TODO: in-kernel irqchip for hvf */
     /* TODO: in-kernel irqchip for hvf */
-    if (kvm_apic_in_kernel()) {
+    if (kvm_enabled()) {
+        if (!kvm_apic_in_kernel()) {
+            error_setg(errp, "KVM does not support userspace APIC");
+            return NULL;
+        }
         apic_type = "kvm-apic";
         apic_type = "kvm-apic";
     } else if (xen_enabled()) {
     } else if (xen_enabled()) {
         apic_type = "xen-apic";
         apic_type = "xen-apic";
@@ -266,10 +270,13 @@ APICCommonClass *apic_get_class(void)
 void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
 void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
 {
 {
     APICCommonState *apic;
     APICCommonState *apic;
-    ObjectClass *apic_class = OBJECT_CLASS(apic_get_class());
+    APICCommonClass *apic_class = apic_get_class(errp);
 
 
-    cpu->apic_state = DEVICE(object_new_with_class(apic_class));
+    if (!apic_class) {
+        return;
+    }
 
 
+    cpu->apic_state = DEVICE(object_new_with_class(OBJECT_CLASS(apic_class)));
     object_property_add_child(OBJECT(cpu), "lapic",
     object_property_add_child(OBJECT(cpu), "lapic",
                               OBJECT(cpu->apic_state));
                               OBJECT(cpu->apic_state));
     object_unref(OBJECT(cpu->apic_state));
     object_unref(OBJECT(cpu->apic_state));