[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V3] vmx/nmi: Do not use self_nmi() in VMEXIT handler
On 28/02/13 15:41, Jan Beulich wrote: >>>> On 28.02.13 at 15:42, "Jan Beulich" <JBeulich@xxxxxxxx> wrote: >> ... this must not be done when on the NMI stack (i.e. when the >> NMI was raised while in hypervisor context). Checking for this >> here would be strait forward, but I was really considering to do >> all of this in the assembly exit path, and I was still undecided >> whether we shouldn't follow Linux in skipping softirq processing >> (and hence scheduling) on the way out from an NMI (I don't >> think we'd need to do the same for MCE). > Like this: > > x86: skip processing events on the NMI exit path > > Otherwise, we may end up in the scheduler, keeping NMIs masked for a > possibly unbounded time (until whenever the next IRET gets executed). > > Of course it's open for discussion whether to always use the strait > exit path from handle_ist_exception. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> The logic looks good to me. As for the other IST exceptions, we will never return from a double fault, and will rarely return from an MCE, so I would say it doesn't really matter at the moment. Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> ~Andrew > > --- a/xen/arch/x86/x86_64/compat/entry.S > +++ b/xen/arch/x86/x86_64/compat/entry.S > @@ -171,7 +171,7 @@ compat_bad_hypercall: > jmp compat_test_all_events > > /* %rbx: struct vcpu, interrupts disabled */ > -compat_restore_all_guest: > +ENTRY(compat_restore_all_guest) > ASSERT_INTERRUPTS_DISABLED > RESTORE_ALL adj=8 compat=1 > .Lft0: iretq > --- a/xen/arch/x86/x86_64/entry.S > +++ b/xen/arch/x86/x86_64/entry.S > @@ -635,6 +635,9 @@ ENTRY(early_page_fault) > jmp restore_all_xen > .popsection > > +ENTRY(nmi) > + pushq $0 > + movl $TRAP_nmi,4(%rsp) > handle_ist_exception: > SAVE_ALL > testb $3,UREGS_cs(%rsp) > @@ -649,12 +652,17 @@ handle_ist_exception: > movzbl UREGS_entry_vector(%rsp),%eax > leaq exception_table(%rip),%rdx > callq *(%rdx,%rax,8) > - jmp ret_from_intr > + cmpb $TRAP_nmi,UREGS_entry_vector(%rsp) > + jne ret_from_intr > > -ENTRY(nmi) > - pushq $0 > - movl $TRAP_nmi,4(%rsp) > - jmp handle_ist_exception > + /* We want to get strait to the IRET in the NMI exit path. */ > + testb $3,UREGS_cs(%rsp) > + GET_CURRENT(%rbx) > + jz restore_all_xen > + movq VCPU_domain(%rbx),%rax > + testb $1,DOMAIN_is_32bit_pv(%rax) > + jz restore_all_guest > + jmp compat_restore_all_guest > > ENTRY(nmi_crash) > pushq $0 > > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |