On 2011-10-11 19:03, Lai Jiangshan wrote: > From: Kenji Kaneshige <kaneshige.kenji@xxxxxxxxxxxxxx> > > Currently, NMI interrupt is blindly sent to all the vCPUs when NMI > button event happens. This doesn't properly emulate real hardware on > which NMI button event triggers LINT1. Because of this, NMI is sent to > the processor even when LINT1 is maskied in LVT. For example, this > causes the problem that kdump initiated by NMI sometimes doesn't work > on KVM, because kdump assumes NMI is masked on CPUs other than CPU0. > > With this patch, inject-nmi request is handled as follows. > > - When in-kernel irqchip is disabled, inject LINT1 instead of NMI > interrupt. > - When in-kernel irqchip is enabled, send nmi event to kernel as the > current code does. LINT1 should be emulated in kernel. > > (laijs) changed from v1: > use KVM_CAP_LAPIC_NMI > adjust the pic_deliver_nmi() API > > Signed-off-by: Kenji Kaneshige <kaneshige.kenji@xxxxxxxxxxxxxx> > Tested-by: Lai Jiangshan <laijs@xxxxxxxxxxxxxx> > --- > hw/apic.c | 26 ++++++++++++++++++++++++++ > hw/apic.h | 1 + > monitor.c | 6 +++++- > 3 files changed, 32 insertions(+), 1 deletions(-) > > diff --git a/hw/apic.c b/hw/apic.c > index 69d6ac5..76e8208 100644 > --- a/hw/apic.c > +++ b/hw/apic.c > @@ -205,6 +205,32 @@ void apic_deliver_pic_intr(DeviceState *d, int level) > } > } > > +void apic_deliver_nmi(DeviceState *d) > +{ > + APICState *s = DO_UPCAST(APICState, busdev.qdev, d); > + > +#ifdef KVM_CAP_LAPIC_NMI Unneeded #ifdef, x86 has this defined unconditionally. > + static int kernel_lapic_nmi; Some enum with symbolic states would be more readable. > + > + if (kernel_lapic_nmi == 0) { > + if (!kvm_enabled() || !kvm_irqchip_in_kernel() || > + !kvm_check_extension(kvm_state, KVM_CAP_LAPIC_NMI)) { This is wrong: If we run with in-kernel irqchip on an old kernel without KVM_CAP_LAPIC_NMI, we still must not call into the user space APIC model. As explained in some other mail, we could then emulate the missing kernel feature by reading out the current in-kernel APIC state, testing if LINT1 is unmasked, and then delivering the NMI directly. Jan
Attachment:
signature.asc
Description: OpenPGP digital signature