From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Yang, Sheng" Subject: Re: [PATCH 9/11] VMX: Provide support for user space injected NMIs Date: Tue, 23 Sep 2008 14:28:58 +0800 Message-ID: <200809231428.58933.sheng.yang@intel.com> References: <48D74CE6.5060008@siemens.com> <48D75046.8020800@siemens.com> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-15" Content-Transfer-Encoding: 7bit Cc: "kvm-devel" , Avi Kivity , Gleb Natapov To: Jan Kiszka Return-path: Received: from mga14.intel.com ([143.182.124.37]:5481 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752525AbYIWG22 (ORCPT ); Tue, 23 Sep 2008 02:28:28 -0400 In-Reply-To: <48D75046.8020800@siemens.com> Content-Disposition: inline Sender: kvm-owner@vger.kernel.org List-ID: On Monday 22 September 2008 15:59:02 Jan Kiszka wrote: > This patch adds the required bits to the VMX side for user space > injected NMIs. As with the preexisting in-kernel irqchip support, the > CPU must provide the "virtual NMI" feature for proper tracking of the > NMI blocking state. > > Based on the original patch by Sheng Yang. > > Signed-off-by: Jan Kiszka > --- > arch/x86/kvm/vmx.c | 33 +++++++++++++++++++++++++++++++++ > 1 file changed, 33 insertions(+) > > Index: b/arch/x86/kvm/vmx.c > =================================================================== > --- a/arch/x86/kvm/vmx.c > +++ b/arch/x86/kvm/vmx.c > @@ -2356,6 +2356,7 @@ static void vmx_inject_nmi(struct kvm_vc > { > struct vcpu_vmx *vmx = to_vmx(vcpu); > > + ++vcpu->stat.nmi_injections; > if (vcpu->arch.rmode.active) { > vmx->rmode.irq.pending = true; > vmx->rmode.irq.vector = NMI_VECTOR; > @@ -2424,6 +2425,30 @@ static void do_interrupt_requests(struct > { > vmx_update_window_states(vcpu); > > + if (cpu_has_virtual_nmis()) { > + if (vcpu->arch.nmi_pending && !vcpu->arch.nmi_injected) { > + if (vcpu->arch.nmi_window_open) { > + vcpu->arch.nmi_pending = false; > + vcpu->arch.nmi_injected = true; > + } else { > + enable_nmi_window(vcpu); > + return; > + } > + } > + if (vcpu->arch.nmi_injected) { > + vmx_inject_nmi(vcpu); > + if (vcpu->arch.nmi_pending > + || kvm_run->request_nmi_window) > + enable_nmi_window(vcpu); > + else if (vcpu->arch.irq_summary > + || kvm_run->request_interrupt_window) > + enable_irq_window(vcpu); > + return; > + } > + if (!vcpu->arch.nmi_window_open || > kvm_run->request_nmi_window) + > enable_nmi_window(vcpu); > + } > + > if (vcpu->arch.interrupt_window_open) { > if (vcpu->arch.irq_summary && > !vcpu->arch.interrupt.pending) kvm_do_inject_irq(vcpu); > @@ -2936,6 +2961,14 @@ static int handle_nmi_window(struct kvm_ > vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control); > ++vcpu->stat.nmi_window_exits; > > + /* > + * If the user space waits to inject a NNI, exit as soon as > possible + */ o... found a typo :) And also please add my signed-off for patch 8 and 9. Signed-off-by: Sheng Yang -- regards Yang, Sheng > + if (kvm_run->request_nmi_window && !vcpu->arch.nmi_pending) { > + kvm_run->exit_reason = KVM_EXIT_NMI_WINDOW_OPEN; > + return 0; > + } > + > return 1; > }