From patchwork Mon Sep 25 17:34:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mingwei Zhang X-Patchwork-Id: 144709 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:cae8:0:b0:403:3b70:6f57 with SMTP id r8csp1661164vqu; Mon, 25 Sep 2023 21:16:48 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGvbN70sxJy6dCzOzWHvvaJ1oMfm8JXweCDbklboniDSyy8PBYMbsF+qGERKctzcg4vxl9g X-Received: by 2002:a05:6a20:d41d:b0:13d:ac08:6b79 with SMTP id il29-20020a056a20d41d00b0013dac086b79mr6115792pzb.60.1695701808371; Mon, 25 Sep 2023 21:16:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695701808; cv=none; d=google.com; s=arc-20160816; b=cJznV78DcSoA3ujqcD1IoEETj+/NkCf4XpS7aUizJyYVjiYfVSVtLxy5m2R/YpxR9f /Zn6e2KThtcNWkYSL8x9QK0CuzY2XkWKInv8L9RG2MWgginOPel3GH3WiU+cmM+D9bvv wuLvB8cVCq7lmvKd4IwcTQNceb4C8qHjCyI6QIg9RBwf+5pyDFAh5IJJDzHtdtUcREHt w5TqYDhl+79GjB2pjncoBSbZzW2spfRbSC9YvVj/kd86h+qNBErjkyuz+663Jgx9RGW/ VReOS0KKqVXpyc+j6lXFXpHWnNOMN39xZ5h55Z9e7OEkV/Z5X+y+RMzM3DwKHfMjggW6 lPhw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=N3mybIXWXmxE94oHFn/stJfySL7s2PMrxYppKn/7o5E=; fh=K+J2qYD/91bJS7zqTA6goMUf/yDX26DDWcmH+Ph084I=; b=E/ts+k9Oy62x3z5RYGGTiYacsD5seZG1b0Huq3WVQkyh2jeUECCL0cjMfBRt/ZXewT flE73pUaxerlAA3PrjXMBzuf2JaH59E3fTZ2oAo0YDwQG/iYqUk1LUuTcN1xPRd9pGB8 AHvVvQj5l4wsW6OsjCugwaIf+QV5ogTFLG5CIUYJUI5m7a+piaso5YRcNis29n2+Ce5W UETQxahUheLRFVwXobbnsXqAuC2BFJtQgE4wF+8ABxhgBYIwD4/DJ8xzL1ONXQ0ziKgR vMHGnQFUf0rS+hwRZRCTupI2TzMh7MgJFk8WLc9cEgzCyXMsL6nig4Rr7DlPmEpb8P6O 6o2w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b="l0fgHK/t"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from howler.vger.email (howler.vger.email. [23.128.96.34]) by mx.google.com with ESMTPS id j18-20020a170902f25200b001b674055d72si10825833plc.621.2023.09.25.21.16.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Sep 2023 21:16:48 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) client-ip=23.128.96.34; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b="l0fgHK/t"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id BAE7F833488C; Mon, 25 Sep 2023 10:35:12 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233060AbjIYRfG (ORCPT + 29 others); Mon, 25 Sep 2023 13:35:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60742 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233065AbjIYRfE (ORCPT ); Mon, 25 Sep 2023 13:35:04 -0400 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AE7AB10D for ; Mon, 25 Sep 2023 10:34:57 -0700 (PDT) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-59bdb9fe821so130672627b3.0 for ; Mon, 25 Sep 2023 10:34:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1695663296; x=1696268096; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=N3mybIXWXmxE94oHFn/stJfySL7s2PMrxYppKn/7o5E=; b=l0fgHK/tYNmZCoIFnp1u4GvzMn7MgmKgs5nOMB3MmccHqjSaqHWNLifvBUHB2HkP5G Cwg1jYsQ0A6KaBUrNEljJFvPilIDVizpCoxwsOs1pr/jCqQy/Y2ed9BE7Qo18KkFK1q6 1yc16MNM0qrsVAcwERqCi31kgrzr1sJW/o50OfMtO4H31yHnCfzx3Bf9BZg2m+HJUBix 8iepH2LOryPebM4GT/Ncx5s285FB5aECVxjqhDg2aSmVmYYi6T37XzHl8zlotEq5jaNR WR1e07AGxzoRzshTPoF8yOewo8YPbtadgqlVveMSntpz5LpIuf4tCg964F7u9IPzmCIh vqbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695663296; x=1696268096; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=N3mybIXWXmxE94oHFn/stJfySL7s2PMrxYppKn/7o5E=; b=wlSZvtTaXABm6jcSjaQRw5B1jM0OgLvN36IAB5zMQ7UHkG8unKhHFcQ5gduIzCJKV4 HAbq/cuhGQg/8IpzR0GeVwTWiL4aNktIBE3fX25oTOUawAotP3qQTffgyvLt28oSTIbE uSNH2Zb17AEx023i05GhyCaC/TCbNfkdNNFpUFi/4w40iRnQO0Cmcfnvy+7JNWY+Dylg Zu9SJQUi7slOzboM+q9yt1ii077s7mAE7+SXqNOrhyvYs/+wpnQvtjuNoN9W+/hJRfAl YOm+n5OtbsuB8QL8SBovpf3ftYvrKwtoaCwa+F7dSyGv/2W03hOfNSJS7ljdwA82VOiD YwFQ== X-Gm-Message-State: AOJu0YyEk01DBkiPrR2LjINEL/nhvb3vAzXgzipCerealzaMXVsiFXqi Sli6Os349c5k+YKwBmG2vgSrOpFiEJhb X-Received: from mizhang-super.c.googlers.com ([35.247.89.60]) (user=mizhang job=sendgmr) by 2002:a81:ac20:0:b0:59e:ee51:52a1 with SMTP id k32-20020a81ac20000000b0059eee5152a1mr93922ywh.10.1695663296760; Mon, 25 Sep 2023 10:34:56 -0700 (PDT) Reply-To: Mingwei Zhang Date: Mon, 25 Sep 2023 17:34:46 +0000 In-Reply-To: <20230925173448.3518223-1-mizhang@google.com> Mime-Version: 1.0 References: <20230925173448.3518223-1-mizhang@google.com> X-Mailer: git-send-email 2.42.0.515.g380fc7ccd1-goog Message-ID: <20230925173448.3518223-2-mizhang@google.com> Subject: [PATCH 1/2] KVM: x86: Synthesize at most one PMI per VM-exit From: Mingwei Zhang To: Sean Christopherson , Paolo Bonzini Cc: "H. Peter Anvin" , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Jim Mattson , Mingwei Zhang , Dapeng Mi , Like Xu , Roman Kagan , Kan Liang , Dapeng1 Mi X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL 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 X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Mon, 25 Sep 2023 10:35:12 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1778037983301741875 X-GMAIL-MSGID: 1778072219398267704 From: Jim Mattson When the irq_work callback, kvm_pmi_trigger_fn(), is invoked during a VM-exit that also invokes __kvm_perf_overflow() as a result of instruction emulation, kvm_pmu_deliver_pmi() will be called twice before the next VM-entry. That shouldn't be a problem. The local APIC is supposed to automatically set the mask flag in LVTPC when it handles a PMI, so the second PMI should be inhibited. However, KVM's local APIC emulation fails to set the mask flag in LVTPC when it handles a PMI, so two PMIs are delivered via the local APIC. In the common case, where LVTPC is configured to deliver an NMI, the first NMI is vectored through the guest IDT, and the second one is held pending. When the NMI handler returns, the second NMI is vectored through the IDT. For Linux guests, this results in the "dazed and confused" spurious NMI message. Though the obvious fix is to set the mask flag in LVTPC when handling a PMI, KVM's logic around synthesizing a PMI is unnecessarily convoluted. Remove the irq_work callback for synthesizing a PMI, and all of the logic for invoking it. Instead, to prevent a vcpu from leaving C0 with a PMI pending, add a check for KVM_REQ_PMI to kvm_vcpu_has_events(). Fixes: 9cd803d496e7 ("KVM: x86: Update vPMCs when retiring instructions") Signed-off-by: Jim Mattson Tested-by: Mingwei Zhang Tested-by: Dapeng Mi --- arch/x86/include/asm/kvm_host.h | 1 - arch/x86/kvm/pmu.c | 27 +-------------------------- arch/x86/kvm/x86.c | 3 +++ 3 files changed, 4 insertions(+), 27 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 28bd38303d70..de951d6aa9a8 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -528,7 +528,6 @@ struct kvm_pmu { u64 raw_event_mask; struct kvm_pmc gp_counters[KVM_INTEL_PMC_MAX_GENERIC]; struct kvm_pmc fixed_counters[KVM_PMC_MAX_FIXED]; - struct irq_work irq_work; /* * Overlay the bitmap with a 64-bit atomic so that all bits can be diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c index edb89b51b383..9ae07db6f0f6 100644 --- a/arch/x86/kvm/pmu.c +++ b/arch/x86/kvm/pmu.c @@ -93,14 +93,6 @@ void kvm_pmu_ops_update(const struct kvm_pmu_ops *pmu_ops) #undef __KVM_X86_PMU_OP } -static void kvm_pmi_trigger_fn(struct irq_work *irq_work) -{ - struct kvm_pmu *pmu = container_of(irq_work, struct kvm_pmu, irq_work); - struct kvm_vcpu *vcpu = pmu_to_vcpu(pmu); - - kvm_pmu_deliver_pmi(vcpu); -} - static inline void __kvm_perf_overflow(struct kvm_pmc *pmc, bool in_pmi) { struct kvm_pmu *pmu = pmc_to_pmu(pmc); @@ -124,20 +116,7 @@ static inline void __kvm_perf_overflow(struct kvm_pmc *pmc, bool in_pmi) __set_bit(pmc->idx, (unsigned long *)&pmu->global_status); } - if (!pmc->intr || skip_pmi) - return; - - /* - * Inject PMI. If vcpu was in a guest mode during NMI PMI - * can be ejected on a guest mode re-entry. Otherwise we can't - * be sure that vcpu wasn't executing hlt instruction at the - * time of vmexit and is not going to re-enter guest mode until - * woken up. So we should wake it, but this is impossible from - * NMI context. Do it from irq work instead. - */ - if (in_pmi && !kvm_handling_nmi_from_guest(pmc->vcpu)) - irq_work_queue(&pmc_to_pmu(pmc)->irq_work); - else + if (pmc->intr && !skip_pmi) kvm_make_request(KVM_REQ_PMI, pmc->vcpu); } @@ -675,9 +654,6 @@ void kvm_pmu_refresh(struct kvm_vcpu *vcpu) void kvm_pmu_reset(struct kvm_vcpu *vcpu) { - struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); - - irq_work_sync(&pmu->irq_work); static_call(kvm_x86_pmu_reset)(vcpu); } @@ -687,7 +663,6 @@ void kvm_pmu_init(struct kvm_vcpu *vcpu) memset(pmu, 0, sizeof(*pmu)); static_call(kvm_x86_pmu_init)(vcpu); - init_irq_work(&pmu->irq_work, kvm_pmi_trigger_fn); pmu->event_count = 0; pmu->need_cleanup = false; kvm_pmu_refresh(vcpu); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index a6b9bea62fb8..6f24a8c1e136 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -12820,6 +12820,9 @@ static inline bool kvm_vcpu_has_events(struct kvm_vcpu *vcpu) return true; #endif + if (kvm_test_request(KVM_REQ_PMI, vcpu)) + return true; + if (kvm_arch_interrupt_allowed(vcpu) && (kvm_cpu_has_interrupt(vcpu) || kvm_guest_apic_has_interrupt(vcpu))) From patchwork Mon Sep 25 17:34:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mingwei Zhang X-Patchwork-Id: 144513 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:cae8:0:b0:403:3b70:6f57 with SMTP id r8csp1379062vqu; Mon, 25 Sep 2023 10:43:24 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFjnofGoodQN2AaT4Z3vu0MUYIZQpqDPDoxrO79CfFUkfAqIZNztvgvNi8yoAu2YxoMgXdT X-Received: by 2002:a17:90b:3e87:b0:271:80f2:52bd with SMTP id rj7-20020a17090b3e8700b0027180f252bdmr4670156pjb.35.1695663804269; Mon, 25 Sep 2023 10:43:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695663804; cv=none; d=google.com; s=arc-20160816; b=UGuQej6H6tUuuMnec05ImoX7zAqCkI7ieL+IpMueQpjstXap5/06eGFFsi7b/zoTJk 7kMBquvnVJ61EKyVQ8OwnZ1DmsiWysxwekplONta+GZAfGoWuE6cGOGn+8u4IXDTCCMe ljPqzdODrCOx7tClIfMVzepCYhgUROXc1ndkh+vXtCd5D6DYy/2Oc43OjZbU9IX0Is1W 0BB8SRc2DOUaZiEDdWO/vjkDt5/p7XRBZHG/5tUW08ina+emsnyF4vKnta/sJbiHVkzD PqoCxIkR3qY/5IaIhuT6JeLeWCA+wZi5XzTheGR3Pbj1Jh4BM+02CHE+ivVj7mZnN2KF 1cog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=/SyWpsTveCt8sOgUzwdLFOIMv03DArAYAXRCSsRfzC8=; fh=K+J2qYD/91bJS7zqTA6goMUf/yDX26DDWcmH+Ph084I=; b=PLNBbpKb7pEwf54fFd16kxcYcV2FNWJ1oD2kUlpML9GQeRt4IZ/Jwi27udAa5YAhpz gqo9BZCA8ENGgeyQT7kXk58dxjYbMbbydSIDOvapNygYPSj1so4zwNMmx6WJMAwW5eY0 spnC9arpai0F5qsH6AtvANeODEncFuE2pMEo0mzFnXAagrVZgBnfRr4nYkVp1lUOv0mA n9QEsF8T3jIgXEQR8xu/a8RIzr5ZnrsfpvgZPEWvPqEkN7ZD8BlG2dHNZJvwkq7mTHfL KIa+qYTJl8Rc4OPpbfeTPwUJ8x8rmSMDkwuXqTgVuDpppYuaBq4VdlmY3qaUZ7tQuskC JzUQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=fclNOGWq; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from agentk.vger.email (agentk.vger.email. [2620:137:e000::3:2]) by mx.google.com with ESMTPS id ot18-20020a17090b3b5200b00276571c0d34si6646260pjb.6.2023.09.25.10.43.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Sep 2023 10:43:24 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) client-ip=2620:137:e000::3:2; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=fclNOGWq; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id 84D6181A4A25; Mon, 25 Sep 2023 10:35:26 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233116AbjIYRfK (ORCPT + 29 others); Mon, 25 Sep 2023 13:35:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60782 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233098AbjIYRfG (ORCPT ); Mon, 25 Sep 2023 13:35:06 -0400 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 718B910E for ; Mon, 25 Sep 2023 10:34:59 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id d9443c01a7336-1c44a2cbea0so82802545ad.0 for ; Mon, 25 Sep 2023 10:34:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1695663299; x=1696268099; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=/SyWpsTveCt8sOgUzwdLFOIMv03DArAYAXRCSsRfzC8=; b=fclNOGWqTOH/DVBvx0pK874VLTc62EHr9aEgkwpmpf+gwX+k1Ue8BnCnpnDAzdf519 7wBCIk5gD/QgQbfdsMyHQG16DvEGagsQjLlIhamu/YelP8dmrUnVDDjn1nQ52poL0uj9 mxSun8vztCj2KHvlK9+er8EmMqIDmMHlsJEK0p1KpLhi/NUjDqxFPLFIdFVUSDGEXkS2 yyFuPNtNT+/8Co1juZKqHz3cPNbtm5kgaj5uaKQuh8J5PLjKiAiUorIhsj/Cn5EFf8pG tDY6HGInO2Gok+nrILJJFA9mPlGST54/Yr/7Bqb5d/SnwV4A5QbO4I7YarMr4akmob0q PAsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695663299; x=1696268099; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=/SyWpsTveCt8sOgUzwdLFOIMv03DArAYAXRCSsRfzC8=; b=o+lguolUAxHcYyp3vkGATR/l8U6jW2cAajsYvbEp62hoRSSKh5UiBn6AUQdHeZN9Ls LZ51v5vN8R+9jMR+j4ZMk06dljd+GAE0RvIwmIve4LgGhUKt/ZPmYyq1ZWzYB+UB90Bu 8OgEO5/UaSjSGxSPLzRiJDG1F8C4G/NT65h4WW62XsXxUlp2+0cA00BDC6t4zpeoSQ9H w9TIQ3X1XOyTE0si+ZsID71MgFh+2cCs157rvyGvBu+CC6laECubapdOZVxG2F0RlIyc Fx/qXWih/gFFVRvPgOAbtmCPlkjHSpBsVz/JSCDvWdceqT6X0gY1Z3zt84jMZXxBjpPx jWMA== X-Gm-Message-State: AOJu0Yy0Qm1V7BDO+JWCJAdKDQUS3syqfJa/qfeRZR60ypzgsqYd+u2O CaOq5nXmXpHaMMz3ZjIlYs168nuovERI X-Received: from mizhang-super.c.googlers.com ([34.105.13.176]) (user=mizhang job=sendgmr) by 2002:a17:902:cf52:b0:1c4:5e07:6d87 with SMTP id e18-20020a170902cf5200b001c45e076d87mr3367plg.4.1695663298881; Mon, 25 Sep 2023 10:34:58 -0700 (PDT) Reply-To: Mingwei Zhang Date: Mon, 25 Sep 2023 17:34:47 +0000 In-Reply-To: <20230925173448.3518223-1-mizhang@google.com> Mime-Version: 1.0 References: <20230925173448.3518223-1-mizhang@google.com> X-Mailer: git-send-email 2.42.0.515.g380fc7ccd1-goog Message-ID: <20230925173448.3518223-3-mizhang@google.com> Subject: [PATCH 2/2] KVM: x86: Mask LVTPC when handling a PMI From: Mingwei Zhang To: Sean Christopherson , Paolo Bonzini Cc: "H. Peter Anvin" , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Jim Mattson , Mingwei Zhang , Dapeng Mi , Like Xu , Roman Kagan , Kan Liang , Dapeng1 Mi X-Spam-Status: No, score=-8.4 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Mon, 25 Sep 2023 10:35:26 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1778032369153483664 X-GMAIL-MSGID: 1778032369153483664 From: Jim Mattson Per the SDM, "When the local APIC handles a performance-monitoring counters interrupt, it automatically sets the mask flag in the LVT performance counter register." Add this behavior to KVM's local APIC emulation, to reduce the incidence of "dazed and confused" spurious NMI warnings in Linux guests (at least, those that use a PMI handler with "late_ack"). Fixes: 23930f9521c9 ("KVM: x86: Enable NMI Watchdog via in-kernel PIT source") Signed-off-by: Jim Mattson Tested-by: Mingwei Zhang Signed-off-by: Mingwei Zhang --- arch/x86/kvm/lapic.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 113ca9661ab2..1f3d56a1f45f 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -2729,13 +2729,17 @@ int kvm_apic_local_deliver(struct kvm_lapic *apic, int lvt_type) { u32 reg = kvm_lapic_get_reg(apic, lvt_type); int vector, mode, trig_mode; + int r; if (kvm_apic_hw_enabled(apic) && !(reg & APIC_LVT_MASKED)) { vector = reg & APIC_VECTOR_MASK; mode = reg & APIC_MODE_MASK; trig_mode = reg & APIC_LVT_LEVEL_TRIGGER; - return __apic_accept_irq(apic, mode, vector, 1, trig_mode, - NULL); + + r = __apic_accept_irq(apic, mode, vector, 1, trig_mode, NULL); + if (r && lvt_type == APIC_LVTPC) + kvm_lapic_set_reg(apic, lvt_type, reg | APIC_LVT_MASKED); + return r; } return 0; }