From patchwork Fri Nov 3 23:05:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 161467 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:8f47:0:b0:403:3b70:6f57 with SMTP id j7csp1359398vqu; Fri, 3 Nov 2023 16:06:45 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFP5GDau0ihzScPBWGUlCuO1HhORE7IzvI8RMCgrv/fKWqYUAOd6frC2F9IsAh+Kopwe9hl X-Received: by 2002:a17:90b:d8a:b0:27d:882f:e6c5 with SMTP id bg10-20020a17090b0d8a00b0027d882fe6c5mr19775215pjb.9.1699052805232; Fri, 03 Nov 2023 16:06:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1699052805; cv=none; d=google.com; s=arc-20160816; b=O1l9idKBTJP+41+cqNusuNiSxZfxFIXbyvrotTBGHuXUxYnmRrxbOhgaoj+5TyVAaJ XqzQGB51GekORs4iEPQe47YTo5bIhgrohNZg4K2JBcBKx+sFImYW4HmKRjkI2gjQqBPF Lt8GN1jvchvFf0pv01Q0TuvV0m2YMEXBqR7bx87tDjsFjCHMKhnYOeWXLDUR1wgB2fsg JdT591fm2RvEqIuo3jthB3A585nxmvB/NrnujKomok3vT+DsptiU1sv6aO72/q+oWgdL awwT+M7MQXFG552f9aCQP/PW6Xwy2Q8+QjcSa05gWMvgirJoSdwMYHDDltepBytMNLAu ZDtA== 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=Mc19fE38hKjtB2xqPWfZgcHXFnhJGoZQeSx7D0d7P/U=; fh=GEJ0r4Uylk4yNLU+0Cus278tKN04SijuDr+21/yG6nk=; b=Nke/qLtCKwy7lnwcg8ewwzAXaWwx2VyLqMKkHR0qhjG7CaY3Q5O1P76DLENkYVg8bH 7/vChSa4y9ukyCc3AST8HWztjQHEWZIDmrrXRLLbiiBrudZAjaqFOa6v6oFWYyMjmGDF IJSyqrT2gEqW+KTv8aNiI+f0oSqJbm/PGtekoDvOU9a8+HuX1g6d6mOegCu41AAWZ7cb zlM4e5520iO97wYa+OzLAsNcHcCKIuaHiSNx18BbSFvtA7so8QkpPoXx9G16ciO4Ygby YtJSfNBoM58HA07W5+yGplMjoctzv8xC9Iq1J5KjKAnq5Lqw+iwQWgiDwrin9X12dIsI sXlA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=gEedp323; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 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 fry.vger.email (fry.vger.email. [2620:137:e000::3:8]) by mx.google.com with ESMTPS id i15-20020a17090adc0f00b0027d0bf1eef1si2429608pjv.98.2023.11.03.16.06.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 Nov 2023 16:06:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) client-ip=2620:137:e000::3:8; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=gEedp323; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 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 fry.vger.email (Postfix) with ESMTP id B6A498029AB8; Fri, 3 Nov 2023 16:06:09 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at fry.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231262AbjKCXFy (ORCPT + 35 others); Fri, 3 Nov 2023 19:05:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45070 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231183AbjKCXFt (ORCPT ); Fri, 3 Nov 2023 19:05:49 -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 4BFACD7D for ; Fri, 3 Nov 2023 16:05:46 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id d9443c01a7336-1cc23f2226bso20198915ad.2 for ; Fri, 03 Nov 2023 16:05:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1699052746; x=1699657546; 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=Mc19fE38hKjtB2xqPWfZgcHXFnhJGoZQeSx7D0d7P/U=; b=gEedp323QlkpnvIlzeBZPutRLJla4H97ePb2/iz1SgH1rAOnPHByQl3kKKSDGBpLSh BX2U6Jlus/wgNPQqzjFOqGxweWa0WkzBbXb3+h3zBSrmA2abskaXMwFvqMyX+yNEktUx pg8L4tgS6nWzUqegGO3nDRe6qq7kffyBEvF5B7U1R6wWcKzx9OLT3SnY/X8SjYY5/N5p d4UB8SESJsvZvySzqcNwxoDE011whZiq0j5wQBJf+IRQWlgCxDAOfsz32aisM1kt8KOd EklSOKXp7EE5PqD2I6EH3bi6QbCI+mSImIIbUiuZCf9kUIkxVfiHlat9HezFeC6BTSme 9SnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1699052746; x=1699657546; 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=Mc19fE38hKjtB2xqPWfZgcHXFnhJGoZQeSx7D0d7P/U=; b=aMLpHjpIKXaEcFW/lqq2PCfUchLDl1PtqCu3L7JC4uEC+PB8SqPG/pW83WLT2CG8FZ u9UU6tDKQbg3DT711LthbMuO8jxlldBZfqfOIAjZR04aChRXDAuuqDwLDBj2fGCG159S tNvEK0kdPm/5+wqmOxqJp7jPU64q4PoK/iJYbBF8HK+DSMfCDqZWs8MzyXzzvYtc4AHU iSD7rM+39OLKlKoAZo032pV22tLACBdeKc2il/WXArD7rH3xyn7ZOtBv6h4+psFQ04om EUrklatR0GxYokUbtFriG9SqXkmONOD3pgTqdxfS3/5QSBT4kgYNqpuLlN41Sg/CGNxQ 8ONw== X-Gm-Message-State: AOJu0YzsVqH0d6W8igH8h7WD7c14oR3ok2kmVTLu+DnUTPwO8DaEXvC9 mVVzUymUw+YOrslf8/3WLMDdNVY8guI= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:ef83:b0:1cc:454f:73dc with SMTP id iz3-20020a170902ef8300b001cc454f73dcmr289352plb.7.1699052745760; Fri, 03 Nov 2023 16:05:45 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Nov 2023 16:05:36 -0700 In-Reply-To: <20231103230541.352265-1-seanjc@google.com> Mime-Version: 1.0 References: <20231103230541.352265-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.869.gea05f2083d-goog Message-ID: <20231103230541.352265-2-seanjc@google.com> Subject: [PATCH v2 1/6] KVM: x86/pmu: Move PMU reset logic to common x86 code From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Dapeng Mi , Mingwei Zhang , Roman Kagan , Jim Mattson , Like Xu 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,T_SCC_BODY_TEXT_LINE, 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 fry.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 (fry.vger.email [0.0.0.0]); Fri, 03 Nov 2023 16:06:09 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1781585994222450803 X-GMAIL-MSGID: 1781585994222450803 Move the common (or at least "ignored") aspects of resetting the vPMU to common x86 code, along with the stop/release helpers that are no used only by the common pmu.c. There is no need to manually handle fixed counters as all_valid_pmc_idx tracks both fixed and general purpose counters, and resetting the vPMU is far from a hot path, i.e. the extra bit of overhead to the PMC from the index is a non-issue. Zero fixed_ctr_ctrl in common code even though it's Intel specific. Ensuring it's zero doesn't harm AMD/SVM in any way, and stopping the fixed counters via all_valid_pmc_idx, but not clearing the associated control bits, would be odd/confusing. Make the .reset() hook optional as SVM no longer needs vendor specific handling. Cc: stable@vger.kernel.org Reviewed-by: Dapeng Mi Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm-x86-pmu-ops.h | 2 +- arch/x86/kvm/pmu.c | 40 +++++++++++++++++++++++++- arch/x86/kvm/pmu.h | 18 ------------ arch/x86/kvm/svm/pmu.c | 16 ----------- arch/x86/kvm/vmx/pmu_intel.c | 20 ------------- 5 files changed, 40 insertions(+), 56 deletions(-) diff --git a/arch/x86/include/asm/kvm-x86-pmu-ops.h b/arch/x86/include/asm/kvm-x86-pmu-ops.h index 6c98f4bb4228..058bc636356a 100644 --- a/arch/x86/include/asm/kvm-x86-pmu-ops.h +++ b/arch/x86/include/asm/kvm-x86-pmu-ops.h @@ -22,7 +22,7 @@ KVM_X86_PMU_OP(get_msr) KVM_X86_PMU_OP(set_msr) KVM_X86_PMU_OP(refresh) KVM_X86_PMU_OP(init) -KVM_X86_PMU_OP(reset) +KVM_X86_PMU_OP_OPTIONAL(reset) KVM_X86_PMU_OP_OPTIONAL(deliver_pmi) KVM_X86_PMU_OP_OPTIONAL(cleanup) diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c index 9ae07db6f0f6..027e9c3c2b93 100644 --- a/arch/x86/kvm/pmu.c +++ b/arch/x86/kvm/pmu.c @@ -250,6 +250,24 @@ static bool pmc_resume_counter(struct kvm_pmc *pmc) return true; } +static void pmc_release_perf_event(struct kvm_pmc *pmc) +{ + if (pmc->perf_event) { + perf_event_release_kernel(pmc->perf_event); + pmc->perf_event = NULL; + pmc->current_config = 0; + pmc_to_pmu(pmc)->event_count--; + } +} + +static void pmc_stop_counter(struct kvm_pmc *pmc) +{ + if (pmc->perf_event) { + pmc->counter = pmc_read_counter(pmc); + pmc_release_perf_event(pmc); + } +} + static int filter_cmp(const void *pa, const void *pb, u64 mask) { u64 a = *(u64 *)pa & mask; @@ -654,7 +672,27 @@ void kvm_pmu_refresh(struct kvm_vcpu *vcpu) void kvm_pmu_reset(struct kvm_vcpu *vcpu) { - static_call(kvm_x86_pmu_reset)(vcpu); + struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); + struct kvm_pmc *pmc; + int i; + + bitmap_zero(pmu->reprogram_pmi, X86_PMC_IDX_MAX); + + for_each_set_bit(i, pmu->all_valid_pmc_idx, X86_PMC_IDX_MAX) { + pmc = static_call(kvm_x86_pmu_pmc_idx_to_pmc)(pmu, i); + if (!pmc) + continue; + + pmc_stop_counter(pmc); + pmc->counter = 0; + + if (pmc_is_gp(pmc)) + pmc->eventsel = 0; + } + + pmu->fixed_ctr_ctrl = pmu->global_ctrl = pmu->global_status = 0; + + static_call_cond(kvm_x86_pmu_reset)(vcpu); } void kvm_pmu_init(struct kvm_vcpu *vcpu) diff --git a/arch/x86/kvm/pmu.h b/arch/x86/kvm/pmu.h index 1d64113de488..a46aa9b25150 100644 --- a/arch/x86/kvm/pmu.h +++ b/arch/x86/kvm/pmu.h @@ -80,24 +80,6 @@ static inline void pmc_write_counter(struct kvm_pmc *pmc, u64 val) pmc->counter &= pmc_bitmask(pmc); } -static inline void pmc_release_perf_event(struct kvm_pmc *pmc) -{ - if (pmc->perf_event) { - perf_event_release_kernel(pmc->perf_event); - pmc->perf_event = NULL; - pmc->current_config = 0; - pmc_to_pmu(pmc)->event_count--; - } -} - -static inline void pmc_stop_counter(struct kvm_pmc *pmc) -{ - if (pmc->perf_event) { - pmc->counter = pmc_read_counter(pmc); - pmc_release_perf_event(pmc); - } -} - static inline bool pmc_is_gp(struct kvm_pmc *pmc) { return pmc->type == KVM_PMC_GP; diff --git a/arch/x86/kvm/svm/pmu.c b/arch/x86/kvm/svm/pmu.c index 373ff6a6687b..3fd47de14b38 100644 --- a/arch/x86/kvm/svm/pmu.c +++ b/arch/x86/kvm/svm/pmu.c @@ -233,21 +233,6 @@ static void amd_pmu_init(struct kvm_vcpu *vcpu) } } -static void amd_pmu_reset(struct kvm_vcpu *vcpu) -{ - struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); - int i; - - for (i = 0; i < KVM_AMD_PMC_MAX_GENERIC; i++) { - struct kvm_pmc *pmc = &pmu->gp_counters[i]; - - pmc_stop_counter(pmc); - pmc->counter = pmc->prev_counter = pmc->eventsel = 0; - } - - pmu->global_ctrl = pmu->global_status = 0; -} - struct kvm_pmu_ops amd_pmu_ops __initdata = { .hw_event_available = amd_hw_event_available, .pmc_idx_to_pmc = amd_pmc_idx_to_pmc, @@ -259,7 +244,6 @@ struct kvm_pmu_ops amd_pmu_ops __initdata = { .set_msr = amd_pmu_set_msr, .refresh = amd_pmu_refresh, .init = amd_pmu_init, - .reset = amd_pmu_reset, .EVENTSEL_EVENT = AMD64_EVENTSEL_EVENT, .MAX_NR_GP_COUNTERS = KVM_AMD_PMC_MAX_GENERIC, .MIN_NR_GP_COUNTERS = AMD64_NUM_COUNTERS, diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c index 820d3e1f6b4f..90c1f7f07e53 100644 --- a/arch/x86/kvm/vmx/pmu_intel.c +++ b/arch/x86/kvm/vmx/pmu_intel.c @@ -632,26 +632,6 @@ static void intel_pmu_init(struct kvm_vcpu *vcpu) static void intel_pmu_reset(struct kvm_vcpu *vcpu) { - struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); - struct kvm_pmc *pmc = NULL; - int i; - - for (i = 0; i < KVM_INTEL_PMC_MAX_GENERIC; i++) { - pmc = &pmu->gp_counters[i]; - - pmc_stop_counter(pmc); - pmc->counter = pmc->prev_counter = pmc->eventsel = 0; - } - - for (i = 0; i < KVM_PMC_MAX_FIXED; i++) { - pmc = &pmu->fixed_counters[i]; - - pmc_stop_counter(pmc); - pmc->counter = pmc->prev_counter = 0; - } - - pmu->fixed_ctr_ctrl = pmu->global_ctrl = pmu->global_status = 0; - intel_pmu_release_guest_lbr_event(vcpu); } From patchwork Fri Nov 3 23:05:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 161466 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:8f47:0:b0:403:3b70:6f57 with SMTP id j7csp1359395vqu; Fri, 3 Nov 2023 16:06:45 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGwRYsHEfeG5NW5X8prWM4VWa/Rh5G3ukLHfq+SHm0WbKZtnujmcZnlRC4LLTKvyKKNEfVO X-Received: by 2002:a05:6358:713:b0:168:f58d:7bff with SMTP id e19-20020a056358071300b00168f58d7bffmr26068613rwj.30.1699052804970; Fri, 03 Nov 2023 16:06:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1699052804; cv=none; d=google.com; s=arc-20160816; b=diwosrJQnFdGohAjn1MvjGwvcG2JK0EaW6SD3iKS76LdSEaKJURLIk7aM8CyZYgo4c U53J4kXahTibEdBv8rIx9xME8jAsEmxVztUBbNpxyFhPtZi8ZCfs81QYW3TNH/Bpd/to g0YV8aOPz4KujbJtGwlvLesLtpGuoDm5MKbmKreV6H9s+owTJba8/5ySAndZ148rtCpN 6AP06AFQwtyKPGrB/wkxGocApnAePzlj2bq86JxSb4akDdEEkCjXEk0VhdIuhiThUIfk HD4lpRgcqCUtQZayf3pvIyJdz5LP+uzso6i9lnP+Kc8OErOaKoT1F5DhHePp3z/vUKs/ 6Rfw== 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=MBBm7FlqrdtgkBqnXXMbaJMJAl32htix/RXmITDIFAI=; fh=GEJ0r4Uylk4yNLU+0Cus278tKN04SijuDr+21/yG6nk=; b=rU2aAUjJ49yicZemqeEVeHbf2nTop0ubNIHal3f5SgmSJ7mGtEHq+kneqgQE69jHIO PZsj5VSnAimWsUah0FjyjzLrHMajEHTMrpL0FslB3pJygtLSjFmwMrGoOL9pRDOdt2Fy 5HdCmdqG5ZSjGQLIJu86woO30VYYnFVJiNKdemoR6Yz30pit+8ocD1EtKucrB7/IJBwj D0ODWx4hM7BFltp1vrkEfD4iXvmLJLYiwMNxHxGp8Q7azN1lMHFEyHcKa7B7xFmMsfTT ECHFltrse0qXwgrqaE3ySoelB4q/yoSMk6BwtHCg0tZbsh6w3kkOmaxVoENUZTnQCnxf ovWg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=gueaNZV7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.38 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 fry.vger.email (fry.vger.email. [23.128.96.38]) by mx.google.com with ESMTPS id bn10-20020a056a02030a00b00585a5e9a965si2676899pgb.161.2023.11.03.16.06.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 Nov 2023 16:06:44 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.38 as permitted sender) client-ip=23.128.96.38; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=gueaNZV7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.38 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 fry.vger.email (Postfix) with ESMTP id B5AD58029AB7; Fri, 3 Nov 2023 16:06:09 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at fry.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231401AbjKCXF5 (ORCPT + 35 others); Fri, 3 Nov 2023 19:05:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45130 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231523AbjKCXFu (ORCPT ); Fri, 3 Nov 2023 19:05:50 -0400 Received: from mail-pg1-x54a.google.com (mail-pg1-x54a.google.com [IPv6:2607:f8b0:4864:20::54a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2B982D6A for ; Fri, 3 Nov 2023 16:05:48 -0700 (PDT) Received: by mail-pg1-x54a.google.com with SMTP id 41be03b00d2f7-56f75e70190so1799557a12.3 for ; Fri, 03 Nov 2023 16:05:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1699052747; x=1699657547; 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=MBBm7FlqrdtgkBqnXXMbaJMJAl32htix/RXmITDIFAI=; b=gueaNZV7Vxljy9Q/ZB6efChaUm6uV0JEKE+GkSzYs0C+5Hb2jInuMrWqWStXtvCpsj FIV/nOkF+TaLyFtofsUQCUscJw5TWNJNazwdeKTjzT2uXcYc+MX3n3tEFjW7UjyLeDlz Ba8/sno1/y4NA59qibyaIZ+4UY8/vZYJarUESnE6yZqKgb2vf8hyojXbDWS6AHyWhC93 LT/QK7GJu/AenrGm6vl7rj7+wTbnMpLxej/hVdg84XSyGDUmeGfFgJYzFj24pvf086VK lHwNygVS9lQhMIRSH7iRAJk1JVnweIZ0Ct6vhTW1LxUHGPH7mEESHAuQX4PP/BCMZCcU K91Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1699052747; x=1699657547; 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=MBBm7FlqrdtgkBqnXXMbaJMJAl32htix/RXmITDIFAI=; b=Q9oRkGMZ6gPB2ceD6ncjXN0TFmbOXZhGAeRzt+lYK4DxnGQuXpyuLS4aitD+fQp7A0 F9Su2LLPnXujL3tCD2cPGLaT95m6gvXIk4AfR/0wK6VKTRJ9c4h4Qb79qIR2QTHLBKhc kZ8aInBgMM6GoCxCw5wXi0f9zdrJCz1mg5BLz3S8PFbpIvg0txmqgsgGl2Lr2p6PtCno G3c02TJ1Z+LnsUYQc2KcCLFAaP9Lifa3mB8wMKYV5HXa2nG/hf4Sfpot5xLHwbE3Pclh IhtxgTtkUSa7dqXarqzrs/hn9oXC9UexeMhqSTDM5WsIN3ldl9HkoXmEJi70ZbxVvPVH 8sVA== X-Gm-Message-State: AOJu0YwPB4KaDnz3rP7yTt65Eq5otgmfiqb/Xna3UAeTfzXklySRzU2Z yvvGxusUQdStuzwPZwE9zBgBoYC9Ou0= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:903:3303:b0:1cc:38e0:dbab with SMTP id jk3-20020a170903330300b001cc38e0dbabmr336922plb.3.1699052747477; Fri, 03 Nov 2023 16:05:47 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Nov 2023 16:05:37 -0700 In-Reply-To: <20231103230541.352265-1-seanjc@google.com> Mime-Version: 1.0 References: <20231103230541.352265-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.869.gea05f2083d-goog Message-ID: <20231103230541.352265-3-seanjc@google.com> Subject: [PATCH v2 2/6] KVM: x86/pmu: Reset the PMU, i.e. stop counters, before refreshing From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Dapeng Mi , Mingwei Zhang , Roman Kagan , Jim Mattson , Like Xu 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,T_SCC_BODY_TEXT_LINE, 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 fry.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 (fry.vger.email [0.0.0.0]); Fri, 03 Nov 2023 16:06:09 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1781585994077704951 X-GMAIL-MSGID: 1781585994077704951 Stop all counters and release all perf events before refreshing the vPMU, i.e. before reconfiguring the vPMU to respond to changes in the vCPU model. Clear need_cleanup in kvm_pmu_reset() as well so that KVM doesn't prematurely stop counters, e.g. if KVM enters the guest and enables counters before the vCPU is scheduled out. Cc: stable@vger.kernel.org Reviewed-by: Dapeng Mi Signed-off-by: Sean Christopherson --- arch/x86/kvm/pmu.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c index 027e9c3c2b93..dc8e8e907cfb 100644 --- a/arch/x86/kvm/pmu.c +++ b/arch/x86/kvm/pmu.c @@ -657,25 +657,14 @@ int kvm_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) return 0; } -/* refresh PMU settings. This function generally is called when underlying - * settings are changed (such as changes of PMU CPUID by guest VMs), which - * should rarely happen. - */ -void kvm_pmu_refresh(struct kvm_vcpu *vcpu) -{ - if (KVM_BUG_ON(kvm_vcpu_has_run(vcpu), vcpu->kvm)) - return; - - bitmap_zero(vcpu_to_pmu(vcpu)->all_valid_pmc_idx, X86_PMC_IDX_MAX); - static_call(kvm_x86_pmu_refresh)(vcpu); -} - void kvm_pmu_reset(struct kvm_vcpu *vcpu) { struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); struct kvm_pmc *pmc; int i; + pmu->need_cleanup = false; + bitmap_zero(pmu->reprogram_pmi, X86_PMC_IDX_MAX); for_each_set_bit(i, pmu->all_valid_pmc_idx, X86_PMC_IDX_MAX) { @@ -695,6 +684,26 @@ void kvm_pmu_reset(struct kvm_vcpu *vcpu) static_call_cond(kvm_x86_pmu_reset)(vcpu); } + +/* + * Refresh the PMU configuration for the vCPU, e.g. if userspace changes CPUID + * and/or PERF_CAPABILITIES. + */ +void kvm_pmu_refresh(struct kvm_vcpu *vcpu) +{ + if (KVM_BUG_ON(kvm_vcpu_has_run(vcpu), vcpu->kvm)) + return; + + /* + * Stop/release all existing counters/events before realizing the new + * vPMU model. + */ + kvm_pmu_reset(vcpu); + + bitmap_zero(vcpu_to_pmu(vcpu)->all_valid_pmc_idx, X86_PMC_IDX_MAX); + static_call(kvm_x86_pmu_refresh)(vcpu); +} + void kvm_pmu_init(struct kvm_vcpu *vcpu) { struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); From patchwork Fri Nov 3 23:05:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 161463 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:8f47:0:b0:403:3b70:6f57 with SMTP id j7csp1359256vqu; Fri, 3 Nov 2023 16:06:26 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGBEi6yb9MZs3oIUcxOEqmHo6RjtsRlWSNMkwWlCn2LCLRxhNfzKOEHrpe4TVFkzYFm03Z7 X-Received: by 2002:a05:6a00:1744:b0:6c3:871a:7f0f with SMTP id j4-20020a056a00174400b006c3871a7f0fmr2258175pfc.5.1699052786267; Fri, 03 Nov 2023 16:06:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1699052786; cv=none; d=google.com; s=arc-20160816; b=s9n6MBfae+XJXDgqu9TwdYgMqUR/ieuc94aEo054KyspP8bcbd386N1s/aXUuOCA1B m7a5+0Lrd3NHMu2fY49/6AUDX0Q99/BQsML21dTCasbHhmfvNmb5VfcGfUING64Fyh1o zG+mYYpJGOfoMR1ZArtEpvHZQ5PJkZX7xLuLkhIGloukGF15ttzek8g/0ZXP+C0UoCyc qyJTfWomDdAXJx9Xnger7CjaJRvlN5n89mMAAEfliGcf0c8w6I/uzsx8x/VElmKE1opW b6vDUXvh8KPGRRKeqkiUdqY+Qy6W6AZiMLlKVnrnymc2juOUNj4ngJpOCd7aAGOTeZ9c dKKg== 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=PIc07kH91+cPU8S0NDLhNr7u04OQXkw6B524JpAs8r4=; fh=GEJ0r4Uylk4yNLU+0Cus278tKN04SijuDr+21/yG6nk=; b=WKyj5pLEC6G2kY0PU3XcGeejDpxmU+kCPI3v/X1FL7DJ6S65UY5DS9Svnd58dxZkyu NCCAYQSFNisbhOM2mWb0iv6zLCvQVWwA0sp6baukH8Evt42WntSSHhR0j532HLlDz2ib eNZBtw+XQhK4O4bsaWFxC2oVhWhJJhdaqRQ/CaOXW+tGV3A23NNgy1526HVmxm4IuCXq zlsZyIxg61KclrUAMt7i/enojlzY3lqO5EsqekJUQRYneZd/+GfkRyfQw4bmO5D3TssS kba/3M16NKnpKEj+VW7oEdpQh2sq/dB5WCQjQIiwU0WxQTWH8Rjm6PonaIAQnOQ9pNsW zSJw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=LIecUdMS; 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 j5-20020a056a00234500b006c0db523732si2561654pfj.136.2023.11.03.16.06.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 Nov 2023 16:06:26 -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=LIecUdMS; 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 2BD7181EB0DF; Fri, 3 Nov 2023 16:06:22 -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 S231472AbjKCXGA (ORCPT + 35 others); Fri, 3 Nov 2023 19:06:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45144 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231268AbjKCXFx (ORCPT ); Fri, 3 Nov 2023 19:05:53 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3D3AED64 for ; Fri, 3 Nov 2023 16:05:50 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id 3f1490d57ef6-da0c6d62ec8so2984648276.1 for ; Fri, 03 Nov 2023 16:05:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1699052749; x=1699657549; 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=PIc07kH91+cPU8S0NDLhNr7u04OQXkw6B524JpAs8r4=; b=LIecUdMSlswrzia4Txqh2//zY8sAsGqtlQ4x4TypDl+bX2sS0H5zEoCSlMMZvkxEFb iMG/xdWze67S5ICqEUYDpaqrn4UeZa52hCRNHo/4n9JSYUCCqEuJ7iiDzyyGmmYsCkiB GNZjYxKI1l2ShDGRWevk3TZ4WCC9+YHngLlI2gKlXjE8LYdg3QIQgNWuUmu/G29mB3JD 6Kpk9yrUhndlSec3XuQpbhFPs7oOq5t2lzgB2KBgzK8OJ3iHuYNUJ94VjoBa0R/u6qSx OR97+ELUC6bwMeSMz9Zo2d9PRPIsiGv58J9Qk02MUWiLtVMD8+w3WVJ85UybPo5MRDcn AdBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1699052749; x=1699657549; 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=PIc07kH91+cPU8S0NDLhNr7u04OQXkw6B524JpAs8r4=; b=AyoLUg7DzrRYcw2sdSsEFQMHd2MWv3RV/DGuRwm26FCuYuD7wrVeOMxQ5u33KusTi3 D921qUK++gcFsDSHiOH0/+DxAoFFljbTDTwJN53dz/m28S+YqSo+aRYBxeR7OcMhJbo+ iuSAJ534dTTmbXRIlT1EoPhInD1b0/pCIOaQ5j+k9AYNNIsjGkoqUEwdowQBbg4V0rh3 McET/pR+eBc9NfHJ456d6QLeEFb4jlxFCMvfbKFOQy+qZZnVF3eg6Hcmfjz1JZyzez0S d/ZiAFNuIQEEGeiMTVMO59m09P0zmbkE98sl9KIbYGMc3Us5hH4y+7cCP4cQDwuzcIaq IcOQ== X-Gm-Message-State: AOJu0YwJ0qZBhBFCpRRpMDMrIrFY0eW0lMHmw1WKE0MVk141jH3JGURi 9gOcxy1yA61Dxsb6a9Oo7nlDolXgE6w= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:2083:0:b0:da0:c584:def4 with SMTP id g125-20020a252083000000b00da0c584def4mr428586ybg.1.1699052749410; Fri, 03 Nov 2023 16:05:49 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Nov 2023 16:05:38 -0700 In-Reply-To: <20231103230541.352265-1-seanjc@google.com> Mime-Version: 1.0 References: <20231103230541.352265-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.869.gea05f2083d-goog Message-ID: <20231103230541.352265-4-seanjc@google.com> Subject: [PATCH v2 3/6] KVM: x86/pmu: Stop calling kvm_pmu_reset() at RESET (it's redundant) From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Dapeng Mi , Mingwei Zhang , Roman Kagan , Jim Mattson , Like Xu 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,T_SCC_BODY_TEXT_LINE, 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]); Fri, 03 Nov 2023 16:06:22 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1781585974383450105 X-GMAIL-MSGID: 1781585974383450105 Drop kvm_vcpu_reset()'s call to kvm_pmu_reset(), the call is performed only for RESET, which is really just the same thing as vCPU creation, and kvm_arch_vcpu_create() *just* called kvm_pmu_init(), i.e. there can't possibly be any work to do. Unlike Intel, AMD's amd_pmu_refresh() does fill all_valid_pmc_idx even if guest CPUID is empty, but everything that is at all dynamic is guaranteed to be '0'/NULL, e.g. it should be impossible for KVM to have already created a perf event. Reviewed-by: Dapeng Mi Signed-off-by: Sean Christopherson --- arch/x86/kvm/pmu.c | 2 +- arch/x86/kvm/pmu.h | 1 - arch/x86/kvm/x86.c | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c index dc8e8e907cfb..458e836c6efe 100644 --- a/arch/x86/kvm/pmu.c +++ b/arch/x86/kvm/pmu.c @@ -657,7 +657,7 @@ int kvm_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) return 0; } -void kvm_pmu_reset(struct kvm_vcpu *vcpu) +static void kvm_pmu_reset(struct kvm_vcpu *vcpu) { struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); struct kvm_pmc *pmc; diff --git a/arch/x86/kvm/pmu.h b/arch/x86/kvm/pmu.h index a46aa9b25150..db9a12c0a2ef 100644 --- a/arch/x86/kvm/pmu.h +++ b/arch/x86/kvm/pmu.h @@ -243,7 +243,6 @@ bool kvm_pmu_is_valid_msr(struct kvm_vcpu *vcpu, u32 msr); int kvm_pmu_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info); int kvm_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info); void kvm_pmu_refresh(struct kvm_vcpu *vcpu); -void kvm_pmu_reset(struct kvm_vcpu *vcpu); void kvm_pmu_init(struct kvm_vcpu *vcpu); void kvm_pmu_cleanup(struct kvm_vcpu *vcpu); void kvm_pmu_destroy(struct kvm_vcpu *vcpu); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 2c924075f6f1..efbf52a9dc83 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -12207,7 +12207,6 @@ void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) } if (!init_event) { - kvm_pmu_reset(vcpu); vcpu->arch.smbase = 0x30000; vcpu->arch.msr_misc_features_enables = 0; From patchwork Fri Nov 3 23:05:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 161464 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:8f47:0:b0:403:3b70:6f57 with SMTP id j7csp1359292vqu; Fri, 3 Nov 2023 16:06:32 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHEXCFDslb9ohBz0o8ZhE+ljLtCQ7yKH+jKKXZCfRDZkTpF2CLARhd7fIQgXUDy0LckFDeP X-Received: by 2002:a17:903:32cc:b0:1cc:4985:fc04 with SMTP id i12-20020a17090332cc00b001cc4985fc04mr17381189plr.66.1699052792227; Fri, 03 Nov 2023 16:06:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1699052792; cv=none; d=google.com; s=arc-20160816; b=lhT/4W0OkBYkZHq+Nn9tfcsbRe2r7WOOburILyc88B0ak4FYHNVrpyMYlaGW4EU8oF s8JUn01PyQ/Xc3vMJ3Ym/ZUgQyUAua9/kymWTwl9JnvdzJZyV4wvsj35FYk9D5O5pUHV dqNd5G+LJ9HkKGGdg6KqjJ4c/9skFmqF5GA/ik1ZTOsGPMbswHwDANcLj7cXzSaG6QiW qJ5BZskFAUP8gP0bm66s0VfP5zHaCmop0TzmankKEtN8MpVZ1cvSuMHzvptzbvaCkKxS jjZSvPcPuEFVu8Zg9zi/EBikeQU4R1AovhI37hgMSymjCJa2YLmuVI5rn1yJR2atapji jqtw== 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=8r9KyLTXzHPbLN5BIkdsSD83nOYaYPo3Uiesh5mapqg=; fh=GEJ0r4Uylk4yNLU+0Cus278tKN04SijuDr+21/yG6nk=; b=bZr3CNr9K2QweYQQq9+ShKe3cpSxMU4iWkq26nmbZ+LZTHiyvi4e+wjslqM4sJS8jo kAM0CCmFiRouzas74T6vZL/gJazuc7VJGdUEYlI28CJxfAfZ1OxfyEEMIWiBts90XeCI 7QHjvrZ+EoP9715MTeI8wEAyKKOc3to7kgVHGljjqNeahaJ1/tHDwDTi8fArWhC7C9it atdeA49TQbe4qhxA2A23gSz0m27/jtOa6XGxk/lqjLvd4mqgSpZdsICHMDW+S//hzi0p D3IjEBpWDGmc4/WoY6ro42/4rgUXeK96R0ToESSldXlcRSKPjtZF321HzIud8CZL430f 2Dww== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=WEk0je4O; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 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 groat.vger.email (groat.vger.email. [2620:137:e000::3:5]) by mx.google.com with ESMTPS id a16-20020a170902ecd000b001c413905d87si2596162plh.49.2023.11.03.16.06.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 Nov 2023 16:06:32 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) client-ip=2620:137:e000::3:5; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=WEk0je4O; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 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 groat.vger.email (Postfix) with ESMTP id E1B55833842E; Fri, 3 Nov 2023 16:06:29 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at groat.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231627AbjKCXGD (ORCPT + 35 others); Fri, 3 Nov 2023 19:06:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45144 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231334AbjKCXFz (ORCPT ); Fri, 3 Nov 2023 19:05:55 -0400 Received: from mail-pg1-x549.google.com (mail-pg1-x549.google.com [IPv6:2607:f8b0:4864:20::549]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 14C0AD48 for ; Fri, 3 Nov 2023 16:05:52 -0700 (PDT) Received: by mail-pg1-x549.google.com with SMTP id 41be03b00d2f7-5b7f3f47547so1908423a12.3 for ; Fri, 03 Nov 2023 16:05:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1699052751; x=1699657551; 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=8r9KyLTXzHPbLN5BIkdsSD83nOYaYPo3Uiesh5mapqg=; b=WEk0je4OxmlYws5A2zp0yML7uSsa2wiAdrh7tf36y8axz/Kpgm2WMW0ZZVjKt5zK3r 9GYmXPcJekkE+uP/C7F8u5HsvDNNLiRweecdeuTq9GjRGKxJhKRR/ll359lOd1JAPy/I XRsJobfd0Ai/SfB3MkcV2Vq7aVJF1vISz/km47vleHaT8ypy0UUweRvFvm8WSfBkMiBN umfs1WZI2w+6TOqWWc/NAF7nsxxKQfrDlO41VpPVKYqJJF4jsmmHZH5GhCpDBIhY9C1K Qonw36bPXDzwrIhwxYeIyif5+SKuZ8P5/BKjYRsuojXBKfzjLSdCJXcOheBmGZQpFJNo uclw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1699052751; x=1699657551; 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=8r9KyLTXzHPbLN5BIkdsSD83nOYaYPo3Uiesh5mapqg=; b=jQVfCpk2mEcNYBrwKUA0TOyZwcF/Ok4ZEVgzg1KNKO40wJ/A5mI4rnr6Kaud3Ax0aN FzMzRfKxQu5jk039ae3lyeduLACWMh6GLnSfALoB3op7gyDswnaFLMivgoBBSgn1zmKf aEhwyV85W+U7l3YbMMEkhWVQzf0+VZ2PkRMTNxAClPLEVSzZSuUCWpcjDmlm9sAxLVVO xWOYX3mAK5ucu6PGg/yIrnCPcikLxCmVUKabAAUmBKcOLw8aTMYagDxZo1Y5hwQwJhLd XGgpvvEIS6tnKTuEOVEYNHI4lLOKvPBuzHYv6XxGsQ5M9lLAjVMQVS6aQiedFWS98nAG KtNA== X-Gm-Message-State: AOJu0Yy1wEG8X7Qfb/g2VoQAfGf1J+U022jsmyWCD625dQY9Vo3J+cyt zbKpHK1Ptr8ScpO1TdJvM4YgGDW27/8= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:d718:b0:1c5:7c07:e403 with SMTP id w24-20020a170902d71800b001c57c07e403mr408772ply.10.1699052751476; Fri, 03 Nov 2023 16:05:51 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Nov 2023 16:05:39 -0700 In-Reply-To: <20231103230541.352265-1-seanjc@google.com> Mime-Version: 1.0 References: <20231103230541.352265-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.869.gea05f2083d-goog Message-ID: <20231103230541.352265-5-seanjc@google.com> Subject: [PATCH v2 4/6] KVM: x86/pmu: Remove manual clearing of fields in kvm_pmu_init() From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Dapeng Mi , Mingwei Zhang , Roman Kagan , Jim Mattson , Like Xu 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,T_SCC_BODY_TEXT_LINE, 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 groat.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 (groat.vger.email [0.0.0.0]); Fri, 03 Nov 2023 16:06:29 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1781585980510720236 X-GMAIL-MSGID: 1781585980510720236 Remove code that unnecessarily clears event_count and need_cleanup in kvm_pmu_init(), the entire kvm_pmu is zeroed just a few lines earlier. Vendor code doesn't set event_count or need_cleanup during .init(), and if either VMX or SVM did set those fields it would be a flagrant bug. Reviewed-by: Dapeng Mi Signed-off-by: Sean Christopherson --- arch/x86/kvm/pmu.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c index 458e836c6efe..c06090196b00 100644 --- a/arch/x86/kvm/pmu.c +++ b/arch/x86/kvm/pmu.c @@ -710,8 +710,6 @@ void kvm_pmu_init(struct kvm_vcpu *vcpu) memset(pmu, 0, sizeof(*pmu)); static_call(kvm_x86_pmu_init)(vcpu); - pmu->event_count = 0; - pmu->need_cleanup = false; kvm_pmu_refresh(vcpu); } From patchwork Fri Nov 3 23:05:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 161468 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:8f47:0:b0:403:3b70:6f57 with SMTP id j7csp1359429vqu; Fri, 3 Nov 2023 16:06:48 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFv3N5yWJhjYsGtVACfUMXLqXqbcvK/nlaxNGAFmYAftJN2XHBfjfJbcDYJzEAL9XhKSPlF X-Received: by 2002:a05:6a00:2b81:b0:68f:c2f7:cef0 with SMTP id dv1-20020a056a002b8100b0068fc2f7cef0mr4647927pfb.4.1699052808264; Fri, 03 Nov 2023 16:06:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1699052808; cv=none; d=google.com; s=arc-20160816; b=GCq2I+f4ZC4BJpIa/8Pvye/AEUarUSqS2Iuji/r7yHrBMti3dV8BPsiUADKjzXtvB6 ZCQqDnIhaCJMZ3hJ7cVjOvVogpjNda19Wg1hyesUNZw+/2q4CYEqrWBl32SUGHhIeiSR uVC2psTNaxANM2GmIBSNNLUu2imNAgtXcBdxwbvcwYxz0AbVS6j+jvcnCr+uJK7k1e3V umejsxTFyd5obzbwK/ZMk7J1QCxOrXY/NcM0+bNEUvFXnlUNj431KQW6WoTrZ2LzLh0v 5NeR0CXCIr47nPKmoUPCWojdCMSDJ2PDHPFegN+3c9l8vfhNitg7fTC5RnpEyqgzexyd cWIg== 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=KalgR4SKhAn+0sVVXRME3OmIqom3v7Pw10s1BHql8OU=; fh=GEJ0r4Uylk4yNLU+0Cus278tKN04SijuDr+21/yG6nk=; b=MC8S3DIDGgZeDNSWCVY1ZG0ME9e6n4/9+nMC4h0t01JcjyqrzhA0mYRDkl5x5+JKmj H9sJmyBw2fVm0NJn4PZs9iZcca6CkPzndqfkrzSJf1r6th+u2R98+6WDLQF1BthdFTw9 hBmzvB9OnGghMRKFLvnWdpxLVVgkoyjbEsRV4sthbw7OAZx+StlbBf30kxB3l9vGksAu Tchl6voIKBHLgdJCmrY5cWU0xYQR8l0g9kmQV87basZRHXBhHFXkIsc4YRFgDCM0cFuw Yv3jMZ18orfCMQvs9a4roAukx42eddUx/7NFhpPROYhN2pLvGmkphf6z/HOSG8E2acOm 4O2g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=qJpmvbS4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.38 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 fry.vger.email (fry.vger.email. [23.128.96.38]) by mx.google.com with ESMTPS id bx31-20020a056a02051f00b0059c02d055c4si2680647pgb.668.2023.11.03.16.06.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 Nov 2023 16:06:48 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.38 as permitted sender) client-ip=23.128.96.38; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=qJpmvbS4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.38 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 fry.vger.email (Postfix) with ESMTP id 72FEB8039ED8; Fri, 3 Nov 2023 16:06:42 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at fry.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1376528AbjKCXGG (ORCPT + 35 others); Fri, 3 Nov 2023 19:06:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45162 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231365AbjKCXF4 (ORCPT ); Fri, 3 Nov 2023 19:05:56 -0400 Received: from mail-pg1-x54a.google.com (mail-pg1-x54a.google.com [IPv6:2607:f8b0:4864:20::54a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D80CFD72 for ; Fri, 3 Nov 2023 16:05:53 -0700 (PDT) Received: by mail-pg1-x54a.google.com with SMTP id 41be03b00d2f7-5b62a669d61so1919899a12.1 for ; Fri, 03 Nov 2023 16:05:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1699052753; x=1699657553; 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=KalgR4SKhAn+0sVVXRME3OmIqom3v7Pw10s1BHql8OU=; b=qJpmvbS4OgR53WFbHs4AZgKDK5ndzazak1vWEbz/cDu6CgzVXgDynazd9FqmPpal3x cTu/rGCHdGUYjECGOWrV6pmfhcqQm6SXNGQvdDJFO2Ad1g6nzx/c+eDWpeBjmCtGNTEv FNSWmhJu9y985Wwe4KRQDCUluhoT5vbHyqXIaQaQsl33REWDVBH+Ql4LiukQEd7vC2LL 9A41oSFLehYil9jiv4L58PfRA5SerZXfovsWnpvaJTqhWHGos1EG1JlhtHkrSrVrmTNs vpwmumI2Y7ivqlesPqGUMfmNOpka1mf3EJvfhFCPw12j91gp+D0TIZHM53F03W3AxHXJ 2FfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1699052753; x=1699657553; 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=KalgR4SKhAn+0sVVXRME3OmIqom3v7Pw10s1BHql8OU=; b=FuF5/x5ypCksm5TgY/xu8CgDoaAbx+TynGaNHxhy5WJooDcnnTQc3LYDzSqdPJkDR+ J542riQoOMkcrqpQhOQQOktlfldLhxV0SHzjuLiH66whcZqV+BwDDDTeDtnXR7JewZfF fCKrjtRE2yeRxlGyuKsgshEDRuclEVC+ZUbiueScg9g0ZCKiNmW01B7DKzhSX6u0cex7 pVwxgnVymPnnbXmKDqrahsFtnWgTNEqCoa0wCYp0HxkIPDB12vHlzBygHzzUeBkPhpT5 +f8ChwHaFyZ26R+TvKKPdXZacDi9Y7jd2CPGd1uk9OOjWb11pKyuol4EYgg6voeKdzt/ IFkw== X-Gm-Message-State: AOJu0Yw+C8EmYcQ7rg9tItwfPkWRjOBsKk3zdkr+wWYjXsoFlmIMFtKd NGeNlypybJ0XTsG4gTxTAtEu2U8AkdU= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:efd1:b0:1c6:2b9d:570b with SMTP id ja17-20020a170902efd100b001c62b9d570bmr412463plb.7.1699052753358; Fri, 03 Nov 2023 16:05:53 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Nov 2023 16:05:40 -0700 In-Reply-To: <20231103230541.352265-1-seanjc@google.com> Mime-Version: 1.0 References: <20231103230541.352265-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.869.gea05f2083d-goog Message-ID: <20231103230541.352265-6-seanjc@google.com> Subject: [PATCH v2 5/6] KVM: x86/pmu: Update sample period in pmc_write_counter() From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Dapeng Mi , Mingwei Zhang , Roman Kagan , Jim Mattson , Like Xu 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,T_SCC_BODY_TEXT_LINE, 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 fry.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 (fry.vger.email [0.0.0.0]); Fri, 03 Nov 2023 16:06:42 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1781585997770122755 X-GMAIL-MSGID: 1781585997770122755 Update a PMC's sample period in pmc_write_counter() to deduplicate code across all callers of pmc_write_counter(). Opportunistically move pmc_write_counter() into pmc.c now that it's doing more work. WRMSR isn't such a hot path that an extra CALL+RET pair will be problematic, and the order of function definitions needs to be changed anyways, i.e. now is a convenient time to eat the churn. Reviewed-by: Dapeng Mi Signed-off-by: Sean Christopherson --- arch/x86/kvm/pmu.c | 27 +++++++++++++++++++++++++++ arch/x86/kvm/pmu.h | 25 +------------------------ arch/x86/kvm/svm/pmu.c | 1 - arch/x86/kvm/vmx/pmu_intel.c | 2 -- 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c index c06090196b00..3725d001239d 100644 --- a/arch/x86/kvm/pmu.c +++ b/arch/x86/kvm/pmu.c @@ -161,6 +161,15 @@ static u64 pmc_get_pebs_precise_level(struct kvm_pmc *pmc) return 1; } +static u64 get_sample_period(struct kvm_pmc *pmc, u64 counter_value) +{ + u64 sample_period = (-counter_value) & pmc_bitmask(pmc); + + if (!sample_period) + sample_period = pmc_bitmask(pmc) + 1; + return sample_period; +} + static int pmc_reprogram_counter(struct kvm_pmc *pmc, u32 type, u64 config, bool exclude_user, bool exclude_kernel, bool intr) @@ -268,6 +277,24 @@ static void pmc_stop_counter(struct kvm_pmc *pmc) } } +static void pmc_update_sample_period(struct kvm_pmc *pmc) +{ + if (!pmc->perf_event || pmc->is_paused || + !is_sampling_event(pmc->perf_event)) + return; + + perf_event_period(pmc->perf_event, + get_sample_period(pmc, pmc->counter)); +} + +void pmc_write_counter(struct kvm_pmc *pmc, u64 val) +{ + pmc->counter += val - pmc_read_counter(pmc); + pmc->counter &= pmc_bitmask(pmc); + pmc_update_sample_period(pmc); +} +EXPORT_SYMBOL_GPL(pmc_write_counter); + static int filter_cmp(const void *pa, const void *pb, u64 mask) { u64 a = *(u64 *)pa & mask; diff --git a/arch/x86/kvm/pmu.h b/arch/x86/kvm/pmu.h index db9a12c0a2ef..cae85e550f60 100644 --- a/arch/x86/kvm/pmu.h +++ b/arch/x86/kvm/pmu.h @@ -74,11 +74,7 @@ static inline u64 pmc_read_counter(struct kvm_pmc *pmc) return counter & pmc_bitmask(pmc); } -static inline void pmc_write_counter(struct kvm_pmc *pmc, u64 val) -{ - pmc->counter += val - pmc_read_counter(pmc); - pmc->counter &= pmc_bitmask(pmc); -} +void pmc_write_counter(struct kvm_pmc *pmc, u64 val); static inline bool pmc_is_gp(struct kvm_pmc *pmc) { @@ -128,25 +124,6 @@ static inline struct kvm_pmc *get_fixed_pmc(struct kvm_pmu *pmu, u32 msr) return NULL; } -static inline u64 get_sample_period(struct kvm_pmc *pmc, u64 counter_value) -{ - u64 sample_period = (-counter_value) & pmc_bitmask(pmc); - - if (!sample_period) - sample_period = pmc_bitmask(pmc) + 1; - return sample_period; -} - -static inline void pmc_update_sample_period(struct kvm_pmc *pmc) -{ - if (!pmc->perf_event || pmc->is_paused || - !is_sampling_event(pmc->perf_event)) - return; - - perf_event_period(pmc->perf_event, - get_sample_period(pmc, pmc->counter)); -} - static inline bool pmc_speculative_in_use(struct kvm_pmc *pmc) { struct kvm_pmu *pmu = pmc_to_pmu(pmc); diff --git a/arch/x86/kvm/svm/pmu.c b/arch/x86/kvm/svm/pmu.c index 3fd47de14b38..b6a7ad4d6914 100644 --- a/arch/x86/kvm/svm/pmu.c +++ b/arch/x86/kvm/svm/pmu.c @@ -161,7 +161,6 @@ 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_write_counter(pmc, data); - 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 90c1f7f07e53..a6216c874729 100644 --- a/arch/x86/kvm/vmx/pmu_intel.c +++ b/arch/x86/kvm/vmx/pmu_intel.c @@ -437,11 +437,9 @@ 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_write_counter(pmc, data); - pmc_update_sample_period(pmc); break; } else if ((pmc = get_fixed_pmc(pmu, msr))) { pmc_write_counter(pmc, data); - pmc_update_sample_period(pmc); break; } else if ((pmc = get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0))) { reserved_bits = pmu->reserved_bits; From patchwork Fri Nov 3 23:05:41 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 161465 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:8f47:0:b0:403:3b70:6f57 with SMTP id j7csp1359303vqu; Fri, 3 Nov 2023 16:06:33 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFuzo5Dj9RdYQM1Fs4GSQ6D3W1zi+CmX384hxxiSD0IQPWqmsctsyxMqlFxz9pqiZBaodrU X-Received: by 2002:a05:6808:350:b0:3b2:9bd8:582c with SMTP id j16-20020a056808035000b003b29bd8582cmr26120560oie.13.1699052793294; Fri, 03 Nov 2023 16:06:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1699052793; cv=none; d=google.com; s=arc-20160816; b=EuoH6wNyD8CGzlD6Suum0hSHazQ0Rf4/lvvbdOyMWH/JzEe//9FuIPm42Vx0vSvul1 sGlmt23dTQjyS8yw/4dRzz+egggL3L5bmXOusuY6648RIBi9YeAlHXXWKK7gCnrh8VdE 2CaHrpMSeUBirg9x1Kwlh2ArcGoL5IEStg6tYL+9fXNUnF9P8bgC6RtmqkYohgJ3ZM9p gSUNUfugzocTbWKcG0uiJBEbhvSutaKfgjS4eNLV28b5sGVrylnHwWGIa6cv56AhE4EV goR6m4l4trsuuyqEuvdqIyjmFlu4447raBGBLYHBHj6A32acMG6c5bXXREkyZNwOdTUr kafg== 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=14t8J2dqJR1PSLTL343RjgPlrxeM7Se//FxMlzhSSkI=; fh=GEJ0r4Uylk4yNLU+0Cus278tKN04SijuDr+21/yG6nk=; b=prES1TmfOLybIPqHbopE2qckR/miSrRCJFpih7OKj/JfOWnv1OleeHgweenfBLuHqA bxYDnUVI+bheQopUrkhmewIabrR1THaAnho4vj4+Kgp/7IuKRlf5wC8ZtbJ4+0BCiTWK Ov0aGM1fUe1aE/bvf67QLyiPqU+mbeKfQ1sRlSpHylEuUfNXZzlebGaLIW5iU++EfFea 7biBJjYZAmEE5nRgFwEAY9aWaWMkPdt7oBvgUyHkFSt/Oxi8wt5Pf8pEBk4RWy8IScnt BRcn8ulQKFHFjuQsBSEKTbHA3AJCgBZahX9cp1LlXBmZoMN8qnWpCJ599ghEMn6O0Kpm HBUQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=ExEtH0hv; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 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. [23.128.96.32]) by mx.google.com with ESMTPS id bf21-20020a656d15000000b005b969f7e4b0si2406565pgb.377.2023.11.03.16.06.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 Nov 2023 16:06:33 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) client-ip=23.128.96.32; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=ExEtH0hv; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 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 94ADD81F8FDE; Fri, 3 Nov 2023 16:06:30 -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 S231325AbjKCXGU (ORCPT + 35 others); Fri, 3 Nov 2023 19:06:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47532 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231259AbjKCXF7 (ORCPT ); Fri, 3 Nov 2023 19:05:59 -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 657E7D6F for ; Fri, 3 Nov 2023 16:05:56 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id d9443c01a7336-1cc385e90a9so20288815ad.1 for ; Fri, 03 Nov 2023 16:05:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1699052756; x=1699657556; 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=14t8J2dqJR1PSLTL343RjgPlrxeM7Se//FxMlzhSSkI=; b=ExEtH0hv7fYQsiq/avEZTwYtW2skJHaoxzsDr2tX5DrB/hiHXPQfFto7o2sQ6tWVns F8NX6SIWFd3OlkDYC02t7q+F1vZNk2IeRO0jt6stqOzWXe63vOpFn3a7dPwD49j/8yiE zYxs22FzZR1u6OaEGHI/CnObRENd3owz692tE3A+9lkO9XljReRp8sF/EQAdjJxzu98y Wc4m5g+sMkmA5fcmMgmMBD5/JHqIDvu1mVhchbFzFiNbdXromW+z/rz1bztlAZoagwEt GcPtdglaykpuvYgGt8Dpd7NmwjsrhklFF1KAohIznGYWJWTzrHtVnAT/DHLzYf09ipAX gq8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1699052756; x=1699657556; 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=14t8J2dqJR1PSLTL343RjgPlrxeM7Se//FxMlzhSSkI=; b=c+Tsxf/QXH/2Qd9XYy6xosuxkyDKCPpB/Iql/148O7QM4325M8gY+4YEK8ZvHVDy2x vH3CRZSRS2Ns7BfeCZQ8peEU3hLjIG4Bo87ek9WRuHQocWfRuGU+KD9ITETdcmQrukQ/ 8dQ5weleU0BSEXbkiD1BW0mMm0fo9xndQLqI8689UyJMbV3VcwGjVYWDtcImqpDVe9A/ +NNxNqsehsvqieKnWE+pmiC+d/Qg1N5P9pFkzoL+C8IRlS8qTs2dZ6XQSnq72YxGBnib g3wNC13E6gKiduVcRig+DvIw7OcuDkyivP/GpmTgXe0YeYW9rhU+v14Kyz667AWrvkbF G6iA== X-Gm-Message-State: AOJu0YxeWrxDNSUTiIcyC9uyk3Rqi8jmJ1NmuhTJezs/Ml7Xi47sbSnK DqLdz792EaoYR9QM+MaMfRGBlIClsxo= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:9b93:b0:1cc:5674:9177 with SMTP id y19-20020a1709029b9300b001cc56749177mr260160plp.11.1699052755280; Fri, 03 Nov 2023 16:05:55 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 3 Nov 2023 16:05:41 -0700 In-Reply-To: <20231103230541.352265-1-seanjc@google.com> Mime-Version: 1.0 References: <20231103230541.352265-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.869.gea05f2083d-goog Message-ID: <20231103230541.352265-7-seanjc@google.com> Subject: [PATCH v2 6/6] KVM: x86/pmu: Track emulated counter events instead of previous counter From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Dapeng Mi , Mingwei Zhang , Roman Kagan , Jim Mattson , Like Xu 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,T_SCC_BODY_TEXT_LINE, 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]); Fri, 03 Nov 2023 16:06:30 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1781585981346689488 X-GMAIL-MSGID: 1781585981346689488 Explicitly track emulated counter events instead of using the common counter value that's shared with the hardware counter owned by perf. Bumping the common counter requires snapshotting the pre-increment value in order to detect overflow from emulation, and the snapshot approach is inherently flawed. Snapshotting the previous counter at every increment assumes that there is at most one emulated counter event per emulated instruction (or rather, between checks for KVM_REQ_PMU). That's mostly holds true today because KVM only emulates (branch) instructions retired, but the approach will fall apart if KVM ever supports event types that don't have a 1:1 relationship with instructions. And KVM already has a relevant bug, as handle_invalid_guest_state() emulates multiple instructions without checking KVM_REQ_PMU, i.e. could miss an overflow event due to clobbering pmc->prev_counter. Not checking KVM_REQ_PMU is problematic in both cases, but at least with the emulated counter approach, the resulting behavior is delayed overflow detection, as opposed to completely lost detection. Tracking the emulated count fixes another bug where the snapshot approach can signal spurious overflow due to incorporating both the emulated count and perf's count in the check, i.e. if overflow is detected by perf, then KVM's emulation will also incorrectly signal overflow. Add a comment in the related code to call out the need to process emulated events *after* pausing the perf event (big kudos to Mingwei for figuring out that particular wrinkle). Cc: Mingwei Zhang Cc: Roman Kagan Cc: Jim Mattson Cc: Dapeng Mi Cc: Like Xu Signed-off-by: Sean Christopherson Reviewed-by: Mingwei Zhang --- arch/x86/include/asm/kvm_host.h | 17 +++++++++++- arch/x86/kvm/pmu.c | 48 ++++++++++++++++++++++++--------- arch/x86/kvm/pmu.h | 3 ++- 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index d7036982332e..d8bc9ba88cfc 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -500,8 +500,23 @@ struct kvm_pmc { u8 idx; bool is_paused; bool intr; + /* + * Base value of the PMC counter, relative to the *consumed* count in + * the associated perf_event. This value includes counter updates from + * the perf_event and emulated_count since the last time the counter + * was reprogrammed, but it is *not* the current value as seen by the + * guest or userspace. + * + * The count is relative to the associated perf_event so that KVM + * doesn't need to reprogram the perf_event every time the guest writes + * to the counter. + */ u64 counter; - u64 prev_counter; + /* + * PMC events triggered by KVM emulation that haven't been fully + * processed, i.e. haven't undergone overflow detection. + */ + u64 emulated_counter; u64 eventsel; struct perf_event *perf_event; struct kvm_vcpu *vcpu; diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c index 3725d001239d..87cc6c8809ad 100644 --- a/arch/x86/kvm/pmu.c +++ b/arch/x86/kvm/pmu.c @@ -127,9 +127,9 @@ static void kvm_perf_overflow(struct perf_event *perf_event, struct kvm_pmc *pmc = perf_event->overflow_handler_context; /* - * Ignore overflow events for counters that are scheduled to be - * reprogrammed, e.g. if a PMI for the previous event races with KVM's - * handling of a related guest WRMSR. + * Ignore asynchronous overflow events for counters that are scheduled + * to be reprogrammed, e.g. if a PMI for the previous event races with + * KVM's handling of a related guest WRMSR. */ if (test_and_set_bit(pmc->idx, pmc_to_pmu(pmc)->reprogram_pmi)) return; @@ -224,17 +224,30 @@ static int pmc_reprogram_counter(struct kvm_pmc *pmc, u32 type, u64 config, return 0; } -static void pmc_pause_counter(struct kvm_pmc *pmc) +static bool pmc_pause_counter(struct kvm_pmc *pmc) { u64 counter = pmc->counter; - - if (!pmc->perf_event || pmc->is_paused) - return; + u64 prev_counter; /* update counter, reset event value to avoid redundant accumulation */ - counter += perf_event_pause(pmc->perf_event, true); + if (pmc->perf_event && !pmc->is_paused) + counter += perf_event_pause(pmc->perf_event, true); + + /* + * Snapshot the previous counter *after* accumulating state from perf. + * If overflow already happened, hardware (via perf) is responsible for + * generating a PMI. KVM just needs to detect overflow on emulated + * counter events that haven't yet been processed. + */ + prev_counter = counter & pmc_bitmask(pmc); + + counter += pmc->emulated_counter; pmc->counter = counter & pmc_bitmask(pmc); + + pmc->emulated_counter = 0; pmc->is_paused = true; + + return pmc->counter < prev_counter; } static bool pmc_resume_counter(struct kvm_pmc *pmc) @@ -289,6 +302,15 @@ static void pmc_update_sample_period(struct kvm_pmc *pmc) void pmc_write_counter(struct kvm_pmc *pmc, u64 val) { + /* + * Drop any unconsumed accumulated counts, the WRMSR is a write, not a + * read-modify-write. Adjust the counter value so that its value is + * relative to the current count, as reading the current count from + * perf is faster than pausing and repgrogramming the event in order to + * reset it to '0'. Note, this very sneakily offsets the accumulated + * emulated count too, by using pmc_read_counter()! + */ + pmc->emulated_counter = 0; pmc->counter += val - pmc_read_counter(pmc); pmc->counter &= pmc_bitmask(pmc); pmc_update_sample_period(pmc); @@ -428,14 +450,15 @@ static void reprogram_counter(struct kvm_pmc *pmc) struct kvm_pmu *pmu = pmc_to_pmu(pmc); u64 eventsel = pmc->eventsel; u64 new_config = eventsel; + bool emulate_overflow; u8 fixed_ctr_ctrl; - pmc_pause_counter(pmc); + emulate_overflow = pmc_pause_counter(pmc); if (!pmc_event_is_allowed(pmc)) goto reprogram_complete; - if (pmc->counter < pmc->prev_counter) + if (emulate_overflow) __kvm_perf_overflow(pmc, false); if (eventsel & ARCH_PERFMON_EVENTSEL_PIN_CONTROL) @@ -475,7 +498,6 @@ static void reprogram_counter(struct kvm_pmc *pmc) reprogram_complete: clear_bit(pmc->idx, (unsigned long *)&pmc_to_pmu(pmc)->reprogram_pmi); - pmc->prev_counter = 0; } void kvm_pmu_handle_event(struct kvm_vcpu *vcpu) @@ -701,6 +723,7 @@ static void kvm_pmu_reset(struct kvm_vcpu *vcpu) pmc_stop_counter(pmc); pmc->counter = 0; + pmc->emulated_counter = 0; if (pmc_is_gp(pmc)) pmc->eventsel = 0; @@ -772,8 +795,7 @@ void kvm_pmu_destroy(struct kvm_vcpu *vcpu) static void kvm_pmu_incr_counter(struct kvm_pmc *pmc) { - pmc->prev_counter = pmc->counter; - pmc->counter = (pmc->counter + 1) & pmc_bitmask(pmc); + pmc->emulated_counter++; kvm_pmu_request_counter_reprogram(pmc); } diff --git a/arch/x86/kvm/pmu.h b/arch/x86/kvm/pmu.h index cae85e550f60..7caeb3d8d4fd 100644 --- a/arch/x86/kvm/pmu.h +++ b/arch/x86/kvm/pmu.h @@ -66,7 +66,8 @@ static inline u64 pmc_read_counter(struct kvm_pmc *pmc) { u64 counter, enabled, running; - counter = pmc->counter; + counter = pmc->counter + pmc->emulated_counter; + if (pmc->perf_event && !pmc->is_paused) counter += perf_event_read_value(pmc->perf_event, &enabled, &running);