Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp1108468pxv; Fri, 16 Jul 2021 01:38:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwSjqyXyJAGeC5qK7uzZlTY6gc5rTNbR8wS4XxBoeoPqhzX8T4kiUchLZf8mco184sZvnXw X-Received: by 2002:a05:6402:4c5:: with SMTP id n5mr12886963edw.322.1626424692245; Fri, 16 Jul 2021 01:38:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626424692; cv=none; d=google.com; s=arc-20160816; b=jDsffpqxq414HiLEK7mGZ0twdH8nAN5ybmpfc+r+thMMv50R/f8SK+yTHx2ihJfYcb wd+pXKEFbq1Ap2mvm9hWbUQf0coXXo7mGoePNOwDBZN45yjQZDoDb0HjrCt/szhr41Jf HVpfEFifmZPJUZwZUZTkWAyW5e4y8qURuVg6rPttH0JNA0AogPBbj1wTgFeq3zTu69sf HqHojPACyLf5j7rIOtXtzBlUOGhVBZE5vndyHVjN8dA9uANfs+rvOfmkdL0psLWn0j4F kD/XBNp0b2+CsVtXptlZgtcnbjzi2GRKyhVZxGSNQGeUdA4Cy1p7AMUSlJ57mQE9jjLd NW1w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from; bh=fY//MnTBMaMXpGBsdXTl8QduegKiVJpVwT7kjlIKGPk=; b=SiprH69BePTcYFpVsNCB+9Otf0+DbAQGfnfkofKalohVBJzGGqmSoUrmgBNHgkBTDE +stMu7FUgG0S2SMM8DYVcy5sJM8qfXk1+vo4zMLruBF00dDcJuUKoIqjeJ0MCoOJsyko UQV3krv5GJn0+eXDq/wrztOqyzC1hnPaNpjlyw/JuBUOpO3ev96VxDlgNZHKXzawNHHd ZWQM9O6fYwMgOquZ8V3vk0kSnyDtdWBy+gYfAIJzqrq8mjHE/hD1MW8P5foBXP2pMyuS z2OAyM2WSKhCeXZzruVYj8WV/C++L8jFKxr7RLFlLzE77wSQ5MPIKyHOwAyGN2eewNxu w62A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id 2si3743378ejy.127.2021.07.16.01.37.48; Fri, 16 Jul 2021 01:38:12 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238301AbhGPIj1 (ORCPT + 99 others); Fri, 16 Jul 2021 04:39:27 -0400 Received: from mga09.intel.com ([134.134.136.24]:15663 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238334AbhGPIjU (ORCPT ); Fri, 16 Jul 2021 04:39:20 -0400 X-IronPort-AV: E=McAfee;i="6200,9189,10046"; a="210687282" X-IronPort-AV: E=Sophos;i="5.84,244,1620716400"; d="scan'208";a="210687282" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jul 2021 01:36:25 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,244,1620716400"; d="scan'208";a="460679765" Received: from michael-optiplex-9020.sh.intel.com ([10.239.159.182]) by orsmga008.jf.intel.com with ESMTP; 16 Jul 2021 01:36:23 -0700 From: Yang Weijiang To: pbonzini@redhat.com, jmattson@google.com, seanjc@google.com, vkuznets@redhat.com, wei.w.wang@intel.com, like.xu.linux@gmail.com, kvm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Like Xu , Yang Weijiang Subject: [PATCH v6 04/12] KVM: vmx/pmu: Emulate MSR_ARCH_LBR_DEPTH for guest Arch LBR Date: Fri, 16 Jul 2021 16:49:58 +0800 Message-Id: <1626425406-18582-5-git-send-email-weijiang.yang@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1626425406-18582-1-git-send-email-weijiang.yang@intel.com> References: <1626425406-18582-1-git-send-email-weijiang.yang@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Like Xu The number of Arch LBR entries available is determined by the value in host MSR_ARCH_LBR_DEPTH.DEPTH. The supported LBR depth values are enumerated in CPUID.(EAX=01CH, ECX=0):EAX[7:0]. For each bit "n" set in this field, the MSR_ARCH_LBR_DEPTH.DEPTH value of "8*(n+1)" is supported. On a guest write to MSR_ARCH_LBR_DEPTH, all LBR entries are reset to 0. KVM writes guest requested value to the native ARCH_LBR_DEPTH MSR (this is safe because the two values will be the same) when the Arch LBR records MSRs are pass-through to the guest. Signed-off-by: Like Xu Signed-off-by: Yang Weijiang --- arch/x86/kvm/vmx/pmu_intel.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c index 9efc1a6b8693..a4ef5bbce186 100644 --- a/arch/x86/kvm/vmx/pmu_intel.c +++ b/arch/x86/kvm/vmx/pmu_intel.c @@ -211,7 +211,7 @@ static bool intel_pmu_is_valid_lbr_msr(struct kvm_vcpu *vcpu, u32 index) static bool intel_is_valid_msr(struct kvm_vcpu *vcpu, u32 msr) { struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); - int ret; + int ret = 0; switch (msr) { case MSR_CORE_PERF_FIXED_CTR_CTRL: @@ -220,6 +220,10 @@ static bool intel_is_valid_msr(struct kvm_vcpu *vcpu, u32 msr) case MSR_CORE_PERF_GLOBAL_OVF_CTRL: ret = pmu->version > 1; break; + case MSR_ARCH_LBR_DEPTH: + if (kvm_cpu_cap_has(X86_FEATURE_ARCH_LBR)) + ret = guest_cpuid_has(vcpu, X86_FEATURE_ARCH_LBR); + break; default: ret = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0) || get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0) || @@ -348,10 +352,28 @@ static bool intel_pmu_handle_lbr_msrs_access(struct kvm_vcpu *vcpu, return true; } +/* + * Check if the requested depth value the same as that of host. + * When guest/host depth are different, the handling would be tricky, + * so now only max depth is supported for both host and guest. + */ +static bool arch_lbr_depth_is_valid(struct kvm_vcpu *vcpu, u64 depth) +{ + unsigned int eax, ebx, ecx, edx; + + if (!kvm_cpu_cap_has(X86_FEATURE_ARCH_LBR)) + return false; + + cpuid_count(0x1c, 0, &eax, &ebx, &ecx, &edx); + + return (depth == fls(eax & 0xff) * 8); +} + static int intel_pmu_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) { struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); struct kvm_pmc *pmc; + struct lbr_desc *lbr_desc = vcpu_to_lbr_desc(vcpu); u32 msr = msr_info->index; switch (msr) { @@ -367,6 +389,9 @@ static int intel_pmu_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) case MSR_CORE_PERF_GLOBAL_OVF_CTRL: msr_info->data = pmu->global_ovf_ctrl; return 0; + case MSR_ARCH_LBR_DEPTH: + msr_info->data = lbr_desc->records.nr; + return 0; default: if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0)) || (pmc = get_gp_pmc(pmu, msr, MSR_IA32_PMC0))) { @@ -393,6 +418,7 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) { struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); struct kvm_pmc *pmc; + struct lbr_desc *lbr_desc = vcpu_to_lbr_desc(vcpu); u32 msr = msr_info->index; u64 data = msr_info->data; @@ -427,6 +453,13 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) return 0; } break; + case MSR_ARCH_LBR_DEPTH: + if (!arch_lbr_depth_is_valid(vcpu, data)) + return 1; + lbr_desc->records.nr = data; + if (!msr_info->host_initiated) + wrmsrl(MSR_ARCH_LBR_DEPTH, lbr_desc->records.nr); + return 0; default: if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0)) || (pmc = get_gp_pmc(pmu, msr, MSR_IA32_PMC0))) { -- 2.21.1