Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp1403059pxb; Wed, 30 Mar 2022 02:42:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz7BpyEZOY0edzLKOgk5J/9uXYKL3vyW+d2bFkKNjwAqTW6FAYwTG0q1Vpy6bemQib2RodT X-Received: by 2002:a50:bb08:0:b0:41b:6bb6:3be6 with SMTP id y8-20020a50bb08000000b0041b6bb63be6mr867118ede.106.1648633352500; Wed, 30 Mar 2022 02:42:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648633352; cv=none; d=google.com; s=arc-20160816; b=pOQurZ3znzXObZYWnQLuYK9tp9duZpBp5uY3Z06N7OMhQT32+PwPuUJ52gGiFsUz7g FZOkFnXI3j+2BloYBeOKQ3hxzMlNCbqLEPNJ16Ec1CgWBu7+HY0HeAbbUDj8IJP0naZN 973T0TbJC7E4QkZ+RBNVxon6IeyYv+YuhNb0SH41JUeeGff4x4ZgG7FOB1Z06pKhuo5C A1s+HbNznQar4xBynD58M7VNRGYH0svKHHlwtENpxBXt8NogRdCRI037x0J5Rsk+OGKA T1SlqSOo5auMAriT+kFof6MVkK5sLCR6BkAFSBxnHelPdnR1AV7c8HqoYu753yeuGbkl qQeQ== 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:dkim-signature; bh=wgrXCQ8DvR6aFcMp2z2Iko9WKtMTYjOnny8m9XfH5bc=; b=MSfBn6tZWZBbjBtQg0GMI3Rl3VSvycdPWx6CuVtMaHITVdH22uXyrxsrOZQ0ReTynd LnDKiMdXz6JG1EsCIncnXOlGoXyEN4kwgCXdaohTJTsmTrJNeGCPw9no0k7SlmQxCefe iozVzyGX/ES0fJ7Gxn/rCbHr+5qLPhMk3kdIqUSvn4Lx3+UeX4+k6Sa0A+K8Ecl9PIVq N+SejDKYtUdKc0Jt9lx8G2dSMTlbdrz/4eASEdrji57kbylvE2ixPXP6AupIqRtwMtxg S6pVq3ftImGwZl6vlUmK7EkctpBr6lsNPyk72g7vPUo5+HfwvoyRm8A1bzg1T+dyr8hX 3XRw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=YWwQABy4; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 14-20020a508e0e000000b004190fd858eesi20385640edw.432.2022.03.30.02.42.05; Wed, 30 Mar 2022 02:42:32 -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; dkim=pass header.i=@gmail.com header.s=20210112 header.b=YWwQABy4; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237483AbiC2NsW (ORCPT + 99 others); Tue, 29 Mar 2022 09:48:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60590 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231233AbiC2NsV (ORCPT ); Tue, 29 Mar 2022 09:48:21 -0400 Received: from mail-pj1-x1035.google.com (mail-pj1-x1035.google.com [IPv6:2607:f8b0:4864:20::1035]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9B59015DAA7; Tue, 29 Mar 2022 06:46:38 -0700 (PDT) Received: by mail-pj1-x1035.google.com with SMTP id mj15-20020a17090b368f00b001c637aa358eso2063623pjb.0; Tue, 29 Mar 2022 06:46:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=wgrXCQ8DvR6aFcMp2z2Iko9WKtMTYjOnny8m9XfH5bc=; b=YWwQABy4/xNVwdoOYNasx7+NdRGiiSGwW35gcliM/ZKz1a8HQaShPge5Cn+ONI+HNN YcDS4BS3OLm6ra8vy3Qer7tCSuCsPdBaj9oBfcuDGHS2g5UKRI8c8Acv6QGtqKQNpqqg 5YQ4Sr9owcyh88tlPzvVoWGWVM2+387hxpz5MopOz3yky05pm+dtNUmm/PndZimXXwzb LOtbZ7+7i23XCCgEOVH7unoiZsscJoJHUW5q1lo4XF7X9q9Vf/KdYYV5kMsl0hTt4m4g 3CV2P4IdZUcqufPGIKWrk1DeV/a1qO+eu9G21GEPpIPevgEGC5/8p79NB/K80rtZeOBl yrBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=wgrXCQ8DvR6aFcMp2z2Iko9WKtMTYjOnny8m9XfH5bc=; b=nNiR7hxe9uf7D4qoazG3WQoN+0Kr1KQcA45xB2OXi8/ny9myK7D69DUlqKW7bCerIc Ji5CjKZvmvxaNxgMdl21EYopu30CIitvKzw+vPVu1yY7ihtnsy9GygiXeqMGIoz+iKT9 k2BEnyYWG0PoG5I40DF4mdKw8BurqKSvmSB4RuPG6wkd8m2tng5S5tkIB87dLLbX7SQg y3KcJoFOPOW24QQMG8rzSjDMJ0+Tq3Dhg+glPIBs6KMYD9JvG0RpKXSA1sMsh7JeihMT 8SygfAYSlRFs6r/m9wmrMzjpmGa8OcnzYKVY6CmoldlHwfh4bJ1jghuL7yLmtu3xK46i KicA== X-Gm-Message-State: AOAM531DfxkYjv+P+LcjyQmeokeZtb+YQt94Sv+9VYdb75Y6ptXTIiba y4ylXIWHBo3W5qxR0Wc0+DA= X-Received: by 2002:a17:902:7796:b0:153:8441:b5c8 with SMTP id o22-20020a170902779600b001538441b5c8mr29830741pll.72.1648561597984; Tue, 29 Mar 2022 06:46:37 -0700 (PDT) Received: from localhost.localdomain ([203.205.141.113]) by smtp.gmail.com with ESMTPSA id m7-20020a056a00080700b004fb28fafc4csm14114571pfk.97.2022.03.29.06.46.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Mar 2022 06:46:37 -0700 (PDT) From: Like Xu X-Google-Original-From: Like Xu To: Paolo Bonzini Cc: Jim Mattson , Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Joerg Roedel , Eric Hankland , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] KVM: x86/pmu: Update AMD PMC smaple period to fix guest NMI-watchdog Date: Tue, 29 Mar 2022 21:46:32 +0800 Message-Id: <20220329134632.6064-1-likexu@tencent.com> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,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 From: Like Xu NMI-watchdog is one of the favorite features of kernel developers, but it does not work in AMD guest even with vPMU enabled and worse, the system misrepresents this capability via /proc. This is a PMC emulation error. KVM does not pass the latest valid value to perf_event in time when guest NMI-watchdog is running, thus the perf_event corresponding to the watchdog counter will enter the old state at some point after the first guest NMI injection, forcing the hardware register PMC0 to be constantly written to 0x800000000001. Meanwhile, the running counter should accurately reflect its new value based on the latest coordinated pmc->counter (from vPMC's point of view) rather than the value written directly by the guest. Fixes: 168d918f2643 ("KVM: x86: Adjust counter sample period after a wrmsr") Reported-by: Dongli Cao Signed-off-by: Like Xu --- arch/x86/kvm/pmu.h | 9 +++++++++ arch/x86/kvm/svm/pmu.c | 1 + arch/x86/kvm/vmx/pmu_intel.c | 8 ++------ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/arch/x86/kvm/pmu.h b/arch/x86/kvm/pmu.h index 7a7b8d5b775e..5e7e8d163b98 100644 --- a/arch/x86/kvm/pmu.h +++ b/arch/x86/kvm/pmu.h @@ -140,6 +140,15 @@ static inline u64 get_sample_period(struct kvm_pmc *pmc, u64 counter_value) return sample_period; } +static inline void pmc_update_sample_period(struct kvm_pmc *pmc) +{ + if (!pmc->perf_event || pmc->is_paused) + return; + + perf_event_period(pmc->perf_event, + get_sample_period(pmc, pmc->counter)); +} + void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel); void reprogram_fixed_counter(struct kvm_pmc *pmc, u8 ctrl, int fixed_idx); void reprogram_counter(struct kvm_pmu *pmu, int pmc_idx); diff --git a/arch/x86/kvm/svm/pmu.c b/arch/x86/kvm/svm/pmu.c index 24eb935b6f85..b14860863c39 100644 --- a/arch/x86/kvm/svm/pmu.c +++ b/arch/x86/kvm/svm/pmu.c @@ -257,6 +257,7 @@ static int amd_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) pmc = get_gp_pmc_amd(pmu, msr, PMU_TYPE_COUNTER); if (pmc) { pmc->counter += data - pmc_read_counter(pmc); + pmc_update_sample_period(pmc); return 0; } /* MSR_EVNTSELn */ diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c index efa172a7278e..e64046fbcdca 100644 --- a/arch/x86/kvm/vmx/pmu_intel.c +++ b/arch/x86/kvm/vmx/pmu_intel.c @@ -431,15 +431,11 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) !(msr & MSR_PMC_FULL_WIDTH_BIT)) data = (s64)(s32)data; pmc->counter += data - pmc_read_counter(pmc); - if (pmc->perf_event && !pmc->is_paused) - perf_event_period(pmc->perf_event, - get_sample_period(pmc, data)); + pmc_update_sample_period(pmc); return 0; } else if ((pmc = get_fixed_pmc(pmu, msr))) { pmc->counter += data - pmc_read_counter(pmc); - if (pmc->perf_event && !pmc->is_paused) - perf_event_period(pmc->perf_event, - get_sample_period(pmc, data)); + pmc_update_sample_period(pmc); return 0; } else if ((pmc = get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0))) { if (data == pmc->eventsel) -- 2.35.1