Message ID | 20090417191346.GA9743@doriath.ww600.siemens.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Dmitry Eremin-Solenikov wrote: > On Mon, Apr 13, 2009 at 12:55:43PM +0300, kvm-owner@vger.kernel.org wrote: >> Signed-off-by: Gleb Natapov <gleb@redhat.com> > > The attached patch if applied on the top of the serie fixes the NMI issue on > SVM. I did not refactor it on the top of this patch though, sorry. > > > From 26d7e88c84089abbe871286d54e77ff2922dc33d Mon Sep 17 00:00:00 2001 > From: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> > Date: Fri, 17 Apr 2009 22:53:50 +0400 > Subject: [PATCH] KVM: correct NMI injection logic wrt NMI window tracking > > inject_pending_irq() calls inject_irq() which disables nmi_pending flag > if the nmi was injected. Thus for tracking we should use nmi_injected > flag. This al fin fixes NMI injection on SVM. > > Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> > --- > arch/x86/kvm/x86.c | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index e4cc717..eeed350 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -3160,7 +3160,7 @@ static void inject_pending_irq(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) > inject_irq(vcpu); > > /* enable NMI/IRQ window open exits if needed */ > - if (vcpu->arch.nmi_pending) > + if (vcpu->arch.nmi_injected) > kvm_x86_ops->enable_nmi_window(vcpu); > else if (kvm_cpu_has_interrupt(vcpu) || req_int_win) > kvm_x86_ops->enable_irq_window(vcpu); Hmm, good to know that it works better now, but I'm afraid this papers over an issue in svm (and will break other cases). The logic here is: We injected something (IRQ or NMI), and if there is more pending, _then_ enable the corresponding window. The check you changed should actually only fire if we (re-)injected an IRQ for this round, and now there is also an NMI pending. My feeling is that the real issue is in svm which probably fails to open the NMI window on NMI injection. In contrast to latest Intel CPUs, we have to do this unconditionally on AMD (no virtual NMI mask). And as this is so, svm has to take care that this is done on injection, not here via the generic code. What about setting INTERCEPT_IRET additionally in svm_inject_nmi? Jan
From 26d7e88c84089abbe871286d54e77ff2922dc33d Mon Sep 17 00:00:00 2001 From: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> Date: Fri, 17 Apr 2009 22:53:50 +0400 Subject: [PATCH] KVM: correct NMI injection logic wrt NMI window tracking inject_pending_irq() calls inject_irq() which disables nmi_pending flag if the nmi was injected. Thus for tracking we should use nmi_injected flag. This al fin fixes NMI injection on SVM. Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> --- arch/x86/kvm/x86.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index e4cc717..eeed350 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -3160,7 +3160,7 @@ static void inject_pending_irq(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) inject_irq(vcpu); /* enable NMI/IRQ window open exits if needed */ - if (vcpu->arch.nmi_pending) + if (vcpu->arch.nmi_injected) kvm_x86_ops->enable_nmi_window(vcpu); else if (kvm_cpu_has_interrupt(vcpu) || req_int_win) kvm_x86_ops->enable_irq_window(vcpu); -- 1.6.2.1