Message ID | 20210426230949.3561-1-jiangshanlai@gmail.com (mailing list archive) |
---|---|
Headers | show |
Series | x86: Don't invoke asm_exc_nmi() on the kernel stack | expand |
On 27/04/21 01:09, Lai Jiangshan wrote: > From: Lai Jiangshan <laijs@linux.alibaba.com> > > In VMX, the NMI handler needs to be invoked after NMI VM-Exit. > > Before the commit 1a5488ef0dcf6 ("KVM: VMX: Invoke NMI handler via > indirect call instead of INTn"), the work is done by INTn ("int $2"). > > But INTn microcode is relatively expensive, so the commit reworked > NMI VM-Exit handling to invoke the kernel handler by function call. > And INTn doesn't set the NMI blocked flag required by the linux kernel > NMI entry. So moving away from INTn are very reasonable. > > Yet some details were missed. After the said commit applied, the NMI > entry pointer is fetched from the IDT table and called from the kernel > stack. But the NMI entry pointer installed on the IDT table is > asm_exc_nmi() which expects to be invoked on the IST stack by the ISA. > And it relies on the "NMI executing" variable on the IST stack to work > correctly. When it is unexpectedly called from the kernel stack, the > RSP-located "NMI executing" variable is also on the kernel stack and > is "uninitialized" and can cause the NMI entry to run in the wrong way. > > During fixing the problem for KVM, I found that there might be the same > problem for early booting stage where the IST is not set up. asm_exc_nmi() > is not allowed to be used in this stage for the same reason about > the RSP-located "NMI executing" variable. > > For both cases, we should use asm_noist_exc_nmi() which is introduced > in the patch 1 via renaming from an existing asm_xenpv_exc_nmi() and > which is safe on the kernel stack. > > https://lore.kernel.org/lkml/20200915191505.10355-3-sean.j.christopherson@intel.com/ For the KVM part, Acked-by: Paolo Bonzini <pbonzini@redhat.com> Thanks, Paolo > Cc: Thomas Gleixner <tglx@linutronix.de> > Cc: Paolo Bonzini <pbonzini@redhat.com> > Cc: Sean Christopherson <seanjc@google.com> > Cc: Steven Rostedt <rostedt@goodmis.org> > Cc: Andi Kleen <ak@linux.intel.com> > Cc: Andy Lutomirski <luto@kernel.org> > Cc: Vitaly Kuznetsov <vkuznets@redhat.com> > Cc: Wanpeng Li <wanpengli@tencent.com> > Cc: Jim Mattson <jmattson@google.com> > Cc: Joerg Roedel <joro@8bytes.org> > Cc: kvm@vger.kernel.org > Cc: Josh Poimboeuf <jpoimboe@redhat.com> > Cc: Uros Bizjak <ubizjak@gmail.com> > Cc: Maxim Levitsky <mlevitsk@redhat.com> > Signed-off-by: Lai Jiangshan <laijs@linux.alibaba.com> > > Lai Jiangshan (4): > x86/xen/entry: Rename xenpv_exc_nmi to noist_exc_nmi > x86/entry: Use asm_noist_exc_nmi() for NMI in early booting stage > KVM/VMX: Invoke NMI non-IST entry instead of IST entry > KVM/VMX: fold handle_interrupt_nmi_irqoff() into its solo caller > > arch/x86/include/asm/idtentry.h | 4 +--- > arch/x86/kernel/idt.c | 8 +++++++- > arch/x86/kernel/nmi.c | 12 ++++++++++++ > arch/x86/kvm/vmx/vmx.c | 27 ++++++++++++++------------- > arch/x86/xen/enlighten_pv.c | 9 +++------ > arch/x86/xen/xen-asm.S | 2 +- > 6 files changed, 38 insertions(+), 24 deletions(-) >
On Fri, Apr 30 2021 at 09:14, Paolo Bonzini wrote: > On 27/04/21 01:09, Lai Jiangshan wrote: > > Acked-by: Paolo Bonzini <pbonzini@redhat.com> Thanks Paolo. I'm working through it now...