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>
master
Paolo Bonzini 2022-12-16 10:39:32 +01:00
parent 9d3f8b3247
commit eaaaf8abdc
6 changed files with 25 additions and 15 deletions

View File

@ -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)
'''''''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''''''''''''''''''''''''''

View File

@ -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
------------------------ ------------------------

View File

@ -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;

View File

@ -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;
} }

View File

@ -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 */

View File

@ -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));