Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp3189934pxk; Tue, 15 Sep 2020 12:26:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxCiwGTD4y7UP+pJLZqDlheKRBl3AS/6/xjkbCOj1sSyXKsuGUVG9QbaslAqcmWOWga+092 X-Received: by 2002:a17:906:8690:: with SMTP id g16mr21352512ejx.187.1600197992034; Tue, 15 Sep 2020 12:26:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1600197992; cv=none; d=google.com; s=arc-20160816; b=uqTiJB9YsNBstfPkpp0iymfcRTC6DeNNSM3c7phGNCACz0djbNvawxxMfXItF29RTS upM0gQYGB61nzk+1e+hFIUmh9rheOmrBbnM2ztIu72WYuds0baSHAUe2iqUiAJlsPuG2 v7Jl97i+02huot91AxZBtDCZfW4KcAQ8z2FOCBfAv9TmjNITp8oYGsT3nK1vavx9uQGi b9J2jzbapetxeaUg2rOd2P2s6FDwQ+qjys5SxezcKqkrfvUG5qYVlKc7Ehq1uihnUEbu 50hWq5N0lZ/Vu4yWTwFD5ZNm+VJdDWII7dmqpXgeNhxTy79RGa7iEToKLXYw9SJacR1u ffXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :ironport-sdr:ironport-sdr; bh=o44yc0jukm6voqiz8JAHPt8ul9SnA/liP1ZKTawlo20=; b=xyObeYd7lhw3ULhMOsKo4pB8ySXga90RTKHnoNUSWY4Hg/HsFxW6uqx6bE8/EFqIz3 yoy77ENm/XpvKfomkHrt4lw9QMFQWQh8QkFuvJ8Kfg28iuhLorTg/m2yQ2tgIBYPeiiS Pi+2F15bfwtecKK3YITNMOfV8WeQJF5/hJ4lOkW5VSpDZVAIXhrOR91EwhyQ9lf4tIma ax1e7MskEAfvhiIsB9WJxWhThyFmOM15heeaC96GgGgi4S2IB58nXMUQAgWuiRZyJdX2 N4WuH2uIpWbC7FfVUXhBFf1KGCCN/F/IUYnD/ZmxUPc1H/J1FA3fpz/HDDogdLUE+DDQ 8t8w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id v6si10093326edt.456.2020.09.15.12.26.09; Tue, 15 Sep 2020 12:26:32 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727866AbgIOTWC (ORCPT + 99 others); Tue, 15 Sep 2020 15:22:02 -0400 Received: from mga18.intel.com ([134.134.136.126]:37595 "EHLO mga18.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728001AbgIOTPU (ORCPT ); Tue, 15 Sep 2020 15:15:20 -0400 IronPort-SDR: xAmXL+DbrEtAPlTRCaWrYTVl/fc9ojCXZ7VxnSL3OyP6mqXymSEONoW3NW6LF7IcRwXh1zGS9x XkAU6o1e89CQ== X-IronPort-AV: E=McAfee;i="6000,8403,9745"; a="147082732" X-IronPort-AV: E=Sophos;i="5.76,430,1592895600"; d="scan'208";a="147082732" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Sep 2020 12:15:08 -0700 IronPort-SDR: QSwEiixagCH7GWlP1mE19nfSrUJnNGVJkl9W+gco31hZQu46t4PIhFYUQR/CLora1l7xDLvCFZ DLBWfJtaTVAw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.76,430,1592895600"; d="scan'208";a="507694455" Received: from sjchrist-coffee.jf.intel.com ([10.54.74.160]) by fmsmga005.fm.intel.com with ESMTP; 15 Sep 2020 12:15:07 -0700 From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Josh Poimboeuf , Uros Bizjak , Andi Kleen Subject: [PATCH v2 2/2] KVM: VMX: Invoke NMI handler via indirect call instead of INTn Date: Tue, 15 Sep 2020 12:15:05 -0700 Message-Id: <20200915191505.10355-3-sean.j.christopherson@intel.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200915191505.10355-1-sean.j.christopherson@intel.com> References: <20200915191505.10355-1-sean.j.christopherson@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Rework NMI VM-Exit handling to invoke the kernel handler by function call instead of INTn. INTn microcode is relatively expensive, and aligning the IRQ and NMI handling will make it easier to update KVM should some newfangled method for invoking the handlers come along. Suggested-by: Andi Kleen Signed-off-by: Sean Christopherson --- arch/x86/kvm/vmx/vmx.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 391f079d9136..b0eca151931d 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -6411,40 +6411,40 @@ static void vmx_apicv_post_state_restore(struct kvm_vcpu *vcpu) void vmx_do_interrupt_nmi_irqoff(unsigned long entry); +static void handle_interrupt_nmi_irqoff(struct kvm_vcpu *vcpu, u32 intr_info) +{ + unsigned int vector = intr_info & INTR_INFO_VECTOR_MASK; + gate_desc *desc = (gate_desc *)host_idt_base + vector; + + kvm_before_interrupt(vcpu); + vmx_do_interrupt_nmi_irqoff(gate_offset(desc)); + kvm_after_interrupt(vcpu); +} + static void handle_exception_nmi_irqoff(struct vcpu_vmx *vmx) { u32 intr_info = vmx_get_intr_info(&vmx->vcpu); /* if exit due to PF check for async PF */ - if (is_page_fault(intr_info)) { + if (is_page_fault(intr_info)) vmx->vcpu.arch.apf.host_apf_flags = kvm_read_and_reset_apf_flags(); /* Handle machine checks before interrupts are enabled */ - } else if (is_machine_check(intr_info)) { + else if (is_machine_check(intr_info)) kvm_machine_check(); /* We need to handle NMIs before interrupts are enabled */ - } else if (is_nmi(intr_info)) { - kvm_before_interrupt(&vmx->vcpu); - asm("int $2"); - kvm_after_interrupt(&vmx->vcpu); - } + else if (is_nmi(intr_info)) + handle_interrupt_nmi_irqoff(&vmx->vcpu, intr_info); } static void handle_external_interrupt_irqoff(struct kvm_vcpu *vcpu) { - unsigned int vector; - gate_desc *desc; u32 intr_info = vmx_get_intr_info(vcpu); if (WARN_ONCE(!is_external_intr(intr_info), "KVM: unexpected VM-Exit interrupt info: 0x%x", intr_info)) return; - vector = intr_info & INTR_INFO_VECTOR_MASK; - desc = (gate_desc *)host_idt_base + vector; - - kvm_before_interrupt(vcpu); - vmx_do_interrupt_nmi_irqoff(gate_offset(desc)); - kvm_after_interrupt(vcpu); + handle_interrupt_nmi_irqoff(vcpu, intr_info); } static void vmx_handle_exit_irqoff(struct kvm_vcpu *vcpu) -- 2.28.0