From patchwork Tue Nov 7 18:36:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 162693 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:aa0b:0:b0:403:3b70:6f57 with SMTP id k11csp432238vqo; Tue, 7 Nov 2023 10:37:24 -0800 (PST) X-Google-Smtp-Source: AGHT+IExOREqykTQK8QjBLz6H6ybpJ8Y7BP3RYLFxcj2QzxC965yU+3YYUM+VK7VVQGCfUx7NCll X-Received: by 2002:a05:6358:70e:b0:168:e5e7:e652 with SMTP id e14-20020a056358070e00b00168e5e7e652mr30035157rwj.7.1699382244541; Tue, 07 Nov 2023 10:37:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1699382244; cv=none; d=google.com; s=arc-20160816; b=vcvT/kgbmz/6bG2SEeNxdYRTqI72UwBU0LdOc+8oI/1yCtmA3SHOHumKNjgmApO5zy 9w0VIjMF7axWHPBNp00WFJ2A8ODYUz/XgAoxA3q1Uu8qQZATnS+iljNfPFDREMHehvC5 YSHMWYFk3Hk3q9kV2oC9iSOZjxneZp/iXWSiYYQeOOb+9O/PdI4UmitZEKHIGu8fP/r2 k014K4LIk7BHLUgwdSPlVzm+NGGzQdZvlyqa9IH+JtLOwV0ZWyCWLWy4TIVzdQR8TXs8 9+ekgh2S2Yzz2DhoAawx3B42FjfJPhKr36UB2mTJmjSc2/O6h2ZMtTU4w3/0zwG4X26t ysgA== 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:mime-version:date :reply-to:dkim-signature; bh=Nvoe8zuzQD68UsZwn7syk08Ugz3HDvlC6EsBdsDkAvU=; fh=RJmUFR00zsh7EQG6+UhC2I9wYMDWaVPVIIfZSndYMYo=; b=r3S1x6phvXBVQxZESHft3Hm7oCB+BRA3gPK0DeVeq6+3lL+mLoTybztgm5mGhgxw0Y Yni3orfmGicFBmLAWwnOFu6+TwWTXnmpXtCDSkbIRX+mB7lA3cg1LRZad9StjlBqttyH y0tzUMBWT5k1On8pUXnxSAU7ZNjDrHmd6ApyWJta+0BUL5oZz3nJG46D4Ri3oGZRua6B WQX/GKvt5GjrpblZ8dcDI2lz2X3MaArAxIuwuE6WmngUyIAreUjdobIEMGJ+zXQfkkul +chp+Ir2kF/gEKSSADCSvYeakvg9XHwkzbLY5bgtllp4ayxnK1dUAGqT00MkORbHmVmd 46rw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=j5ptDbDH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 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 snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id a190-20020a6390c7000000b005bd27920755si2476461pge.534.2023.11.07.10.37.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Nov 2023 10:37:24 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=j5ptDbDH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 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 snail.vger.email (Postfix) with ESMTP id E0BA380713CC; Tue, 7 Nov 2023 10:36:24 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230523AbjKGSgN (ORCPT + 32 others); Tue, 7 Nov 2023 13:36:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39870 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229886AbjKGSgK (ORCPT ); Tue, 7 Nov 2023 13:36:10 -0500 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A778DB9 for ; Tue, 7 Nov 2023 10:36:08 -0800 (PST) Received: by mail-yb1-xb4a.google.com with SMTP id 3f1490d57ef6-da3b6438170so6011952276.1 for ; Tue, 07 Nov 2023 10:36:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1699382168; x=1699986968; darn=vger.kernel.org; h=cc:to:from:subject:message-id:mime-version:date:reply-to:from:to:cc :subject:date:message-id:reply-to; bh=Nvoe8zuzQD68UsZwn7syk08Ugz3HDvlC6EsBdsDkAvU=; b=j5ptDbDHZ4q2C2BUC5FnZV1JwcS6SZCaIuiapgFRKgZv5rvFpqPvQ5lZk2dFeyiKED oJwVY8G7/2T4xUncgZxg/8+JETVUYf74wBgBFGUELCzMcOAS032mLRrEu5f6Mv1W8WY2 DCfR3G/k9Y7Z+89jRw6hfzOlV+QP6Xj5fyTtmeIa4jhND0aDhocswzGhUb9JgF8qjbRJ 3b6F+WJV44vhozGQK8VKV/Et4lCn7R3oMU+MqpQOFDXYj7Sa7f9Sk4OOXjKht7KTNhT9 gWgpLYbW296fGviaJqDmGI2CWABuwNe5W/mrNzZTCbVI927BqtnaJB9bb2VP8YYZDX/M /htw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1699382168; x=1699986968; h=cc:to:from:subject:message-id:mime-version:date:reply-to :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Nvoe8zuzQD68UsZwn7syk08Ugz3HDvlC6EsBdsDkAvU=; b=ldBwnIVz11Y63dxHnS2ddpUXcYMMLeNHzi+SFEKLiC546r/wZdeIPmkvqEhyIxw1dj 0Zn9Bs5g/+PpjeeO0x1ZKuOoVI1aSdThPvV6mcMVMur0BvCFDMdzNmf8dFMgP1j640xt Pk4iioe+EM63XzCK0SityjJ3w5UNW+S6tw9DawlZoC8nCbqePc8iLv6TNJkcbLs4YYUR 6sGZfgRa2tkjzsRpJa5xXpiyYMJsQP+9TDapwjMJXOn4AFXP27xPU9Gg1B2wxYKxVuyN pW1bQyVGj3tOUcjmajaO2vDt9+vdHo/H5bpirkOyaG3PZHwtUjwCpni9/YmUxqTyjgu4 CXtw== X-Gm-Message-State: AOJu0YzbAVwTwE9Jw9OQRiteVDiLjkeXYMbpc1Kn52KZuhk5riLePAEf cG33+FFvVwRG0OAllDEMUwVuHfM0SEI= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a05:6902:1788:b0:da0:c9a5:b529 with SMTP id ca8-20020a056902178800b00da0c9a5b529mr601875ybb.12.1699382167904; Tue, 07 Nov 2023 10:36:07 -0800 (PST) Reply-To: Sean Christopherson Date: Tue, 7 Nov 2023 10:36:05 -0800 Mime-Version: 1.0 X-Mailer: git-send-email 2.42.0.869.gea05f2083d-goog Message-ID: <20231107183605.409588-1-seanjc@google.com> Subject: [PATCH] perf/x86: Don't enforce minimum period for KVM guest-only events From: Sean Christopherson To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Thomas Gleixner , Borislav Petkov , Dave Hansen , x86@kernel.org Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Like Xu , Jim Mattson , Mingwei Zhang , Sean Christopherson 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 (snail.vger.email [0.0.0.0]); Tue, 07 Nov 2023 10:36:24 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1781931436553813741 X-GMAIL-MSGID: 1781931436553813741 Don't apply minimum period workarounds/requirements to events that are being created by KVM to virtualize PMCs for guests, i.e. skip limit enforcement for events that exclude the host. Perf's somewhat arbitrary limits prevents KVM from correctly virtualizing counter overflow, e.g. if the guest sets a counter to have an effective period of '1', forcing a minimum period of '2' results in overflow occurring at the incorrect time. Whether or not a "real" profiling use case is affected is debatable, but the incorrect behavior is trivially easy to observe and reproduce, and is deterministic enough to make the PMU appear to be broken from the guest's perspective. Furthermore, the "period" set by KVM isn't actually a period, as KVM won't automatically reprogram the event with the same period on overflow. KVM will synthesize a PMI into the guest when appropriate, but what the guest does in response to the PMI is purely a guest decision. In other words, KVM effectively operates in a one-shot mode, not a periodic mode. Letting KVM and/or the guest program "too small" periods is safe for the host, as events that exclude the host are atomically disabled with respect to VM-Exit, i.e. are guaranteed to stop counting upon transitioning to the host. And whether or not *explicitly* programming a short period is safe is somewhat of a moot point, as transitions to/from the guest effectively yield the same effect, e.g. an unrelated VM-Exit => VM-Enter transition will re-enable guest PMCs with whatever count happened to be in the PMC at the time of VM-Exit. Cc: Like Xu Cc: Jim Mattson Cc: Mingwei Zhang Signed-off-by: Sean Christopherson --- Disclaimer: I've only tested this from KVM's side of things. arch/x86/events/core.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) base-commit: 744940f1921c8feb90e3c4bcc1e153fdd6e10fe2 diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c index 40ad1425ffa2..f8a8a4ea4d47 100644 --- a/arch/x86/events/core.c +++ b/arch/x86/events/core.c @@ -1388,16 +1388,25 @@ int x86_perf_event_set_period(struct perf_event *event) hwc->last_period = period; ret = 1; } - /* - * Quirk: certain CPUs dont like it if just 1 hw_event is left: - */ - if (unlikely(left < 2)) - left = 2; if (left > x86_pmu.max_period) left = x86_pmu.max_period; - static_call_cond(x86_pmu_limit_period)(event, &left); + /* + * Exempt KVM guest events from the minimum period requirements. It's + * the guest's responsibility to ensure it can make forward progress, + * and it's KVM's responsibility to configure an appropriate "period" + * to correctly virtualize overflow for the guest's PMCs. + */ + if (!event->attr.exclude_host) { + /* + * Quirk: certain CPUs dont like it if just 1 event is left: + */ + if (unlikely(left < 2)) + left = 2; + + static_call_cond(x86_pmu_limit_period)(event, &left); + } this_cpu_write(pmc_prev_left[idx], left);