Received: by 2002:ad5:4acb:0:0:0:0:0 with SMTP id n11csp4304707imw; Tue, 12 Jul 2022 05:50:30 -0700 (PDT) X-Google-Smtp-Source: AGRyM1t7nKdeqXBdJVlYjjCvsjgDBxRzCjRH4gf44C59coEilySq/px4ETVqnpJnBWIGUG9j9m/o X-Received: by 2002:a05:6402:950:b0:43a:5194:174c with SMTP id h16-20020a056402095000b0043a5194174cmr32169512edz.145.1657630230174; Tue, 12 Jul 2022 05:50:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1657630230; cv=none; d=google.com; s=arc-20160816; b=BA1cjpSXmnF9I5O6hWux40g7lpLtH/HnmkGEQqUCrl1aW7KkR13muyGQCvqZT4Ldss azOvJKLzr2lJqVUE3vOJF0UMHBZrplmZeHxNZWYmZ3TFYsb3QybCeq1woOPessVCMb8r tUqB6b2Oyn4hBObvDSzJ3s18Dq11DEG3YbJV05gZTYqgq/dfzucmlPlwgUB22/ZH3yFZ EdK8rMayTfVwHPKdvLoR1bSa6axYhVpJu+yxr6UdYIlF3BwXXEmnrz545MTikOxm6nBR KylLAVAWpAklj07ED2Mqkye3QRjZ+iFCq2fzSFI3h08a8upDHcO98FooEHOjTZiXk+Cl xrbQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=ySdjEhV0UpMz1gkL1qpP1suxf5/tYsWqVodx6+cmpME=; b=nUvCWOFDOfxpF4dijNt0KzcyDs1ohhHn/IHKNV3DAy/sJFtDtQs3SFP9WvNg3ogBwT C24Nf/C3t2QYic5BQU/G+T0Y7mBwo5wvpChanN+vl35c18qmKqp5Go1z2UbVC1tryxgV uKZza1oTaP7a9Lgi5Ydyo4M1C79rZ7hHMwsgNICGP886lpToWoXCoi5TRfzq3qJWYcFZ MFKwV8mAJ5S5djrvKURyAn7oQf4dLgjNo+oGKy6Bkl3022y8kja3GgC8uiKop7GJt4Uz JtulVCwndLEownN8vChscFKmWmsiGdPGdXfGgi5Eb7VcT0CKztwbvLs0k2sSCSEWQXiU CUow== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h6-20020a170906398600b00718d0985aa0si11993445eje.247.2022.07.12.05.50.04; Tue, 12 Jul 2022 05:50:30 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233233AbiGLMsE (ORCPT + 99 others); Tue, 12 Jul 2022 08:48:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35040 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233009AbiGLMsD (ORCPT ); Tue, 12 Jul 2022 08:48:03 -0400 X-Greylist: delayed 933 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Tue, 12 Jul 2022 05:48:02 PDT Received: from baidu.com (mx20.baidu.com [111.202.115.85]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 097ABB31D5; Tue, 12 Jul 2022 05:48:02 -0700 (PDT) Received: from BC-Mail-Ex25.internal.baidu.com (unknown [172.31.51.19]) by Forcepoint Email with ESMTPS id C99EE6BA46BF116996BE; Tue, 12 Jul 2022 20:32:25 +0800 (CST) Received: from FB9D8C53FFFC188.internal.baidu.com (172.31.62.15) by BC-Mail-Ex25.internal.baidu.com (172.31.51.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2308.20; Tue, 12 Jul 2022 20:32:27 +0800 From: Wang Guangju To: , , , , , , , , , , , CC: , , , Subject: [PATCH v3] KVM: x86: Send EOI to SynIC vectors on accelerated EOI-induced VM-Exits Date: Tue, 12 Jul 2022 20:32:10 +0800 Message-ID: <20220712123210.89-1-wangguangju@baidu.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [172.31.62.15] X-ClientProxiedBy: BC-Mail-Ex27.internal.baidu.com (172.31.51.21) To BC-Mail-Ex25.internal.baidu.com (172.31.51.19) X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_LOW, SPF_HELO_PASS,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When EOI virtualization is performed on VMX, kvm_apic_set_eoi_accelerated() is called upon EXIT_REASON_EOI_INDUCED but unlike its non-accelerated apic_set_eoi() sibling, Hyper-V SINT vectors are left unhandled. Send EOI to Hyper-V SINT vectors when handling acclerated EOI-induced VM-Exits. KVM Hyper-V needs to handle the SINT EOI irrespective of whether the EOI is acclerated or not. Rename kvm_apic_set_eoi_accelerated() to kvm_apic_set_eoi() and let the non-accelerated helper call the "acclerated" version. That will document the delta between the non-accelerated path and the accelerated path. In addition, guarantee to trace even if there's no valid vector to EOI in the non-accelerated path in order to keep the semantics of the function intact. Fixes: 5c919412fe61 ("kvm/x86: Hyper-V synthetic interrupt controller") Cc: Tested-by: Wang Guangju Suggested-by: Sean Christopherson Suggested-by: Vitaly Kuznetsov Co-developed-by: Li Rongqing Signed-off-by: Wang Guangju --- v1 -> v2: Updated the commit message and implement a new inline function of apic_set_eoi_vector() v2 -> v3: Updated the subject and commit message, drop func apic_set_eoi_vector() and rename kvm_apic_set_eoi_accelerated() to kvm_apic_set_eoi() arch/x86/kvm/lapic.c | 45 ++++++++++++++++++++++----------------------- arch/x86/kvm/lapic.h | 2 +- arch/x86/kvm/vmx/vmx.c | 3 ++- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index f03facc..b2e72ab 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -1269,46 +1269,45 @@ static void kvm_ioapic_send_eoi(struct kvm_lapic *apic, int vector) kvm_ioapic_update_eoi(apic->vcpu, vector, trigger_mode); } +/* + * Send EOI for a valid vector. The caller, or hardware when this is invoked + * after an accelerated EOI VM-Exit, is responsible for updating the vISR and + * vPPR. + */ +void kvm_apic_set_eoi(struct kvm_lapic *apic, int vector) +{ + trace_kvm_eoi(apic, vector); + + if (to_hv_vcpu(apic->vcpu) && + test_bit(vector, to_hv_synic(apic->vcpu)->vec_bitmap)) + kvm_hv_synic_send_eoi(apic->vcpu, vector); + + kvm_ioapic_send_eoi(apic, vector); + kvm_make_request(KVM_REQ_EVENT, apic->vcpu); +} +EXPORT_SYMBOL_GPL(kvm_apic_set_eoi); + static int apic_set_eoi(struct kvm_lapic *apic) { int vector = apic_find_highest_isr(apic); - trace_kvm_eoi(apic, vector); - /* * Not every write EOI will has corresponding ISR, * one example is when Kernel check timer on setup_IO_APIC */ - if (vector == -1) + if (vector == -1) { + trace_kvm_eoi(apic, vector); return vector; + } apic_clear_isr(vector, apic); apic_update_ppr(apic); - if (to_hv_vcpu(apic->vcpu) && - test_bit(vector, to_hv_synic(apic->vcpu)->vec_bitmap)) - kvm_hv_synic_send_eoi(apic->vcpu, vector); + kvm_apic_set_eoi(apic, vector); - kvm_ioapic_send_eoi(apic, vector); - kvm_make_request(KVM_REQ_EVENT, apic->vcpu); return vector; } -/* - * this interface assumes a trap-like exit, which has already finished - * desired side effect including vISR and vPPR update. - */ -void kvm_apic_set_eoi_accelerated(struct kvm_vcpu *vcpu, int vector) -{ - struct kvm_lapic *apic = vcpu->arch.apic; - - trace_kvm_eoi(apic, vector); - - kvm_ioapic_send_eoi(apic, vector); - kvm_make_request(KVM_REQ_EVENT, apic->vcpu); -} -EXPORT_SYMBOL_GPL(kvm_apic_set_eoi_accelerated); - void kvm_apic_send_ipi(struct kvm_lapic *apic, u32 icr_low, u32 icr_high) { struct kvm_lapic_irq irq; diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h index 762bf61..48260fa 100644 --- a/arch/x86/kvm/lapic.h +++ b/arch/x86/kvm/lapic.h @@ -126,7 +126,7 @@ u64 kvm_get_lapic_tscdeadline_msr(struct kvm_vcpu *vcpu); void kvm_set_lapic_tscdeadline_msr(struct kvm_vcpu *vcpu, u64 data); void kvm_apic_write_nodecode(struct kvm_vcpu *vcpu, u32 offset); -void kvm_apic_set_eoi_accelerated(struct kvm_vcpu *vcpu, int vector); +void kvm_apic_set_eoi(struct kvm_lapic *apic, int vector); int kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr); void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu); diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 9258468..f8b9eb1 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -5519,9 +5519,10 @@ static int handle_apic_eoi_induced(struct kvm_vcpu *vcpu) { unsigned long exit_qualification = vmx_get_exit_qual(vcpu); int vector = exit_qualification & 0xff; + struct kvm_lapic *apic = vcpu->arch.apic; /* EOI-induced VM exit is trap-like and thus no need to adjust IP */ - kvm_apic_set_eoi_accelerated(vcpu, vector); + kvm_apic_set_eoi(apic, vector); return 1; } -- 2.9.4