Received: by 2002:a05:7412:e794:b0:fa:551:50a7 with SMTP id o20csp631879rdd; Tue, 9 Jan 2024 15:03:32 -0800 (PST) X-Google-Smtp-Source: AGHT+IHYSWCHJeY36+iFM6F2/tB007dj3TpIS0JRi0iNiyxlJbycH8qcMc1YcvSaUSPGsdeAatqR X-Received: by 2002:adf:fe86:0:b0:336:67c9:1d9e with SMTP id l6-20020adffe86000000b0033667c91d9emr31079wrr.79.1704841412506; Tue, 09 Jan 2024 15:03:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1704841412; cv=none; d=google.com; s=arc-20160816; b=FflnqfGRdosA8Qbmo8XeWlq+ZDM0qPRfMy3D+LCAWWBuo7IOW52lHod+fwTgbCBpve 5pGqj0I2pYs4PZFaQ199v9nj9vTS/9a5cFwtt+awMU1mn4g2I+3IItjwsTthxuJbGi08 bGI5KC4l2Ix/jerEJDk/8fn+t41cB5I/Lfo9nL07bXyrCvDn/I7Exg68FA/GgqZladeZ JzJzonpAK6jo5h8ek+Zib/p6cM4hrQluY527cC9eERWwwkwxyBziWdiW1cOX8QPaVjwV G+h5JOkZwP8nbBao+bei5wIz5JcvzCyipsL0Jsl5eov95H0lw9mTBwGVuDQkcle1CNmu ic+Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:from:subject:message-id:references:mime-version :list-unsubscribe:list-subscribe:list-id:precedence:in-reply-to:date :reply-to:dkim-signature; bh=tXsV5Mg+VvJOgGB933IW2BaWsp1tYo1T/RC8C6lgjm8=; fh=gm96CM+cG0KJxn7vnhn0c1c98ILNP1HHUrKfrGecw3M=; b=sYC8LVrFVjHgZr0BO4JqbxwsX3DKrDMIZQ488XGRv7XXng/8RUdjYVag4kDrbttsw3 7cG3u4Y/8/yV9T2WhTk7R3Emcbfh6Lp6N1cwkAiZXQhAa0hDAl4FmCCSIxjSn4SYZz8t og4JR7njNDNlzcyFmgQlVd09fpIn9f3/5Fky5DzHCuhtKv7d4YYdPrNHIJQUIhfdG/I4 ygfAEkanpRcnkl4E/XS6+ENxIyyAjRXA+sE61j3JgdYJMMbCyoD/a0M2dd+Dc2tO6gPc JJSArVevs/pS8UyXM8zdImjQ7E5qCuMZdRWokLU8yMn59mdlZUYHRtZwD01UuQGlOBmw X81w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=2MU+ORTS; spf=pass (google.com: domain of linux-kernel+bounces-21490-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-21490-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id h7-20020a056402094700b005535abb0f31si1173644edz.552.2024.01.09.15.03.32 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Jan 2024 15:03:32 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-21490-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=2MU+ORTS; spf=pass (google.com: domain of linux-kernel+bounces-21490-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-21490-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 101B71F25ECC for ; Tue, 9 Jan 2024 23:03:32 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id CC4D73EA7D; Tue, 9 Jan 2024 23:02:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="2MU+ORTS" Received: from mail-yw1-f201.google.com (mail-yw1-f201.google.com [209.85.128.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DB8E13E473 for ; Tue, 9 Jan 2024 23:02:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-5e9074bb7c5so49313747b3.0 for ; Tue, 09 Jan 2024 15:02:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1704841375; x=1705446175; 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=tXsV5Mg+VvJOgGB933IW2BaWsp1tYo1T/RC8C6lgjm8=; b=2MU+ORTSm2htKkCH8uXfKpPUyBU45YIGXNm7BFlwd3eiy3L6U+R7kAomhfyZ00qfZG mEsV25h+IyQOTL8T3W3DpovOZJfRL+vRrMTRvCZpAP9+MKjQF7Zn+eFLXfS0mPC4XTkZ A/6XCkn2ly0jRRrS09eBxEV2K0S/m77q3Nq0ZxwNqk3SXCse6mFc7QuVJ8PhSYr6RiX/ as0oO3O556TQUVuFn6VU37o+BeQQa4wxT7Heax5gk49Ri1o0btEHaBa8hp05c+Bgp6hd kCaUIv3ibY5wmedHijLHDPmQjOw4e5A+ff7aXrc/nnCE4vF5BSPz3Lkrd+sn2rGjwzsQ sj2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704841375; x=1705446175; 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=tXsV5Mg+VvJOgGB933IW2BaWsp1tYo1T/RC8C6lgjm8=; b=KBol2bpfXQT6UZozVQ50BX8c+e+5lOEaWHtLFdZmE+rP3WRAADJkzf9DTQyC34eoDc REiIE4DoG0lmD7ve1yN2nL51daAEWgtiRRFxKx4Th5DRpGTDWW6f6QWZA2vz2NKwoK+5 u9eD1hGun8+gsuYLnAgVPVrH4DdWHLNEJo7fQ2etHa3r5Gvc6/piiRahm/C1w1zZbQ3y 0TkOJKT58HLZ/eTHdzXdyq4bErGXjU8uErXCFvA6FPuJh8nWBuSomMvqShfiXhlE9xpi cDIpmPzI58gd+Qkqn9WSy1i0qfjLgVvzMapi64gcHmlqkcjsqjbqBYdz9Rshn18hVxeO 8jaQ== X-Gm-Message-State: AOJu0Yw5c1O24PCNny0AhW2G97KiYGFVP3whmLP/DpCHvQp0V0y/rPzU vcWZ/04adUC6RhLaKgHeczJzFbotziJdD1vR0A== X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a05:690c:c16:b0:5ee:2b5:7d75 with SMTP id cl22-20020a05690c0c1600b005ee02b57d75mr83986ywb.8.1704841374981; Tue, 09 Jan 2024 15:02:54 -0800 (PST) Reply-To: Sean Christopherson Date: Tue, 9 Jan 2024 15:02:21 -0800 In-Reply-To: <20240109230250.424295-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240109230250.424295-1-seanjc@google.com> X-Mailer: git-send-email 2.43.0.472.g3155946c3a-goog Message-ID: <20240109230250.424295-2-seanjc@google.com> Subject: [PATCH v10 01/29] KVM: x86/pmu: Always treat Fixed counters as available when supported From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kan Liang , Dapeng Mi , Jim Mattson , Jinrong Liang , Aaron Lewis , Like Xu Content-Type: text/plain; charset="UTF-8" Treat fixed counters as available when they are supported, i.e. don't silently ignore an enabled fixed counter just because guest CPUID says the associated general purpose architectural event is unavailable. KVM originally treated fixed counters as always available, but that got changed as part of a fix to avoid confusing REF_CPU_CYCLES, which does NOT map to an architectural event, with the actual architectural event used associated with bit 7, TOPDOWN_SLOTS. The commit justified the change with: If the event is marked as unavailable in the Intel guest CPUID 0AH.EBX leaf, we need to avoid any perf_event creation, whether it's a gp or fixed counter. but that justification doesn't mesh with reality. The Intel SDM uses "architectural events" to refer to both general purpose events (the ones with the reverse polarity mask in CPUID.0xA.EBX) and the events for fixed counters, e.g. the SDM makes statements like: Each of the fixed-function PMC can count only one architectural performance event. but the fact that fixed counter 2 (TSC reference cycles) doesn't have an associated general purpose architectural makes trying to apply the mask from CPUID.0xA.EBX impossible. Furthermore, the lack of enumeration for an architectural event in CPUID only means the CPU doesn't officially support the architectural encoding, i.e. it doesn't mean using the architectural encoding _won't_ work, it sipmly means there are no guarantees that it will work as expected. E.g. if KVM is running in a VM that advertises a fixed counters but not the corresponding architectural event encoding, and perf decides to use a general purpose counter instead of a fixed counter, odds are very good that the underlying hardware actually does support the architectrual encoding, and that programming the encoding will count the right thing. In other words, asking perf to count the event will probably work, whereas intentionally doing nothing is obviously guaranteed to fail. Note, at the time of the change, KVM didn't enforce hardware support, i.e. didn't prevent userspace from enumerating support in guest CPUID.0xA.EBX for architectural events that aren't supported in hardware. I.e. silently dropping the fixed counter didn't somehow protection against counting the wrong event, it just enforced guest CPUID. And practically speaking, this issue is almost certainly limited to running KVM on a funky virtual CPU model. No known real hardware has an asymmetric PMU where a fixed counter is supported but the associated architectural event is not. Fixes: a21864486f7e ("KVM: x86/pmu: Fix available_event_types check for REF_CPU_CYCLES event") Signed-off-by: Sean Christopherson --- arch/x86/kvm/vmx/pmu_intel.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c index a6216c874729..8207f8c03585 100644 --- a/arch/x86/kvm/vmx/pmu_intel.c +++ b/arch/x86/kvm/vmx/pmu_intel.c @@ -108,11 +108,24 @@ static bool intel_hw_event_available(struct kvm_pmc *pmc) u8 unit_mask = (pmc->eventsel & ARCH_PERFMON_EVENTSEL_UMASK) >> 8; int i; + /* + * Fixed counters are always available if KVM reaches this point. If a + * fixed counter is unsupported in hardware or guest CPUID, KVM doesn't + * allow the counter's corresponding MSR to be written. KVM does use + * architectural events to program fixed counters, as the interface to + * perf doesn't allow requesting a specific fixed counter, e.g. perf + * may (sadly) back a guest fixed PMC with a general purposed counter. + * But if _hardware_ doesn't support the associated event, KVM simply + * doesn't enumerate support for the fixed counter. + */ + if (pmc_is_fixed(pmc)) + return true; + BUILD_BUG_ON(ARRAY_SIZE(intel_arch_events) != NR_INTEL_ARCH_EVENTS); /* * Disallow events reported as unavailable in guest CPUID. Note, this - * doesn't apply to pseudo-architectural events. + * doesn't apply to pseudo-architectural events (see above). */ for (i = 0; i < NR_REAL_INTEL_ARCH_EVENTS; i++) { if (intel_arch_events[i].eventsel != event_select || -- 2.43.0.472.g3155946c3a-goog