Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp625356pxb; Tue, 5 Apr 2022 16:22:33 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzfdW2+coqPM8boTXQbj4KkvXdattb0nYLoJMt4e2YkqUmgfuQVsvxxMBfkyjQg6pftENPa X-Received: by 2002:a05:6a00:338e:b0:4fa:9015:af50 with SMTP id cm14-20020a056a00338e00b004fa9015af50mr6063369pfb.57.1649200952879; Tue, 05 Apr 2022 16:22:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649200952; cv=none; d=google.com; s=arc-20160816; b=kYC2JBVWb9wWIRDV3WS0dZPSZ+4dAM19RhQgAmF9TBXbxsP+MdmOzObsJDguZXkdWV oKQE6w7JRimbjD3wdHKf9AfF5YlKKhFmNVLBzHhQt7gW8/V50Gu8ZHfpfgwXvZc+wFMB 3bTTMyKK5K0wapebOdKp+Nyym9RoPGVdWe6XGC97MotU8Ep+OzYkFvYFGnMZIwu77GFB 70BVLMvd9db05I6rtAXUJxSBFNCVpxEI7lRt5nVtGOCmjLqf9AO7BmLhnMjrxT0hc5RY qRQYqLpceVId4yUAYt6qyAOc4UygJix2Kk0FcXRK2qul1UR9gsgpmjSF9OoDNt+T8DuR cruQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:robot-unsubscribe :robot-id:message-id:mime-version:references:in-reply-to:cc:subject :to:reply-to:sender:from:dkim-signature:dkim-signature:date; bh=A5geXpxjvPe814KNLb/sN9jiLCNyqM2BsadEeVroj2c=; b=vKWf5dbk+Qh5XhHdlA3XZQf3J0FhzlOQYrsmPzTTkC5G89OtmSDfNecXFNkbcQzynp P7txgtv3kxpcPt0X1E7GdcubO0GW8X/A7Ve090X+X4+kZ3TNMwGUmJw8gEJPahy3phdy 29uVSNvIX7+cxl8NPdkkxOCrJ8FSUkIF4fDJOqYxikNhtatrzPF4iLUWdn8quYBMaeVS 8aV5uP32BMD9CUkdMGUs7aKEEgfijMdjk6KkkxxDPocG5zvOEJVPKSARfAbiXLnJ+GX9 frMxv8CmMEONVpZ9libsVyYneZj8FPp3x2aOnvOQh1+cp363cE0D+51VwHAc64hxGyjf aFdw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=AQp4XHXL; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e header.b=waW1gpvu; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id q4-20020a170902b10400b00153b2d16433si13369377plr.59.2022.04.05.16.22.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Apr 2022 16:22:32 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=AQp4XHXL; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e header.b=waW1gpvu; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: from out1.vger.email (out1.vger.email [IPv6:2620:137:e000::1:20]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id D7DAF1AD1D7; Tue, 5 Apr 2022 16:07:18 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1376827AbiDELYB (ORCPT + 99 others); Tue, 5 Apr 2022 07:24:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38470 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241701AbiDEIsc (ORCPT ); Tue, 5 Apr 2022 04:48:32 -0400 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 31D462AE09; Tue, 5 Apr 2022 01:36:49 -0700 (PDT) Date: Tue, 05 Apr 2022 08:36:37 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1649147798; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=A5geXpxjvPe814KNLb/sN9jiLCNyqM2BsadEeVroj2c=; b=AQp4XHXLkBNLpKVS2ZkZTHBog9mm3OeJ0AO86QbOyKQNV11W+dRc+g9OYEQ+KcuRfSlXHI 0jn1nM/WdcC1/N8feEklIvZcgRsNMMSkAGndJXTzHL/3AGXJrT6TVByFGWavXfCF5uiuek 7RyEjVa+6kZ9/whJANOJnapATRVi4QC7T0Vt2fjKkk7YJWGudqnCKQM113rJ/UZj3DSN/9 bRpJJMHspABgfWTj7MjPS0tIdfUPc0JuvgUNpVwrJepVsy5koyWWtoD/1TUXGgTSk27CZb WOdQ9xfyy98cge2vSigWWof3B32WbGPzQWyVekzIIWiVJdHnFY9v4/r9FdumaA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1649147798; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=A5geXpxjvPe814KNLb/sN9jiLCNyqM2BsadEeVroj2c=; b=waW1gpvuNo7jZSe8lciWI4fELkaGayOA1mcmRu06XoXFoI1N07xPFGv3P7/wim9I+s5W0D OdTxsFmmUWkqdjDw== From: "tip-bot2 for Stephane Eranian" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: perf/core] perf/x86/amd: Add idle hooks for branch sampling Cc: Stephane Eranian , "Peter Zijlstra (Intel)" , x86@kernel.org, linux-kernel@vger.kernel.org In-Reply-To: <20220322221517.2510440-10-eranian@google.com> References: <20220322221517.2510440-10-eranian@google.com> MIME-Version: 1.0 Message-ID: <164914779753.389.8152356106310343006.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no 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 The following commit has been merged into the perf/core branch of tip: Commit-ID: d5616bac7adadbf42a3b63b8717e75eb82a2cc2c Gitweb: https://git.kernel.org/tip/d5616bac7adadbf42a3b63b8717e75eb82a2cc2c Author: Stephane Eranian AuthorDate: Tue, 22 Mar 2022 15:15:13 -07:00 Committer: Peter Zijlstra CommitterDate: Tue, 05 Apr 2022 10:24:38 +02:00 perf/x86/amd: Add idle hooks for branch sampling On AMD Fam19h Zen3, the branch sampling (BRS) feature must be disabled before entering low power and re-enabled (if was active) when returning from low power. Otherwise, the NMI interrupt may be held up for too long and cause problems. Stopping BRS will cause the NMI to be delivered if it was held up. Define a perf_amd_brs_lopwr_cb() callback to stop/restart BRS. The callback is protected by a jump label which is enabled only when AMD BRS is detected. In all other cases, the callback is never called. Signed-off-by: Stephane Eranian [peterz: static_call() and build fixes] Signed-off-by: Peter Zijlstra (Intel) Link: https://lore.kernel.org/r/20220322221517.2510440-10-eranian@google.com --- arch/x86/events/amd/brs.c | 33 ++++++++++++++++++++++++++++++- arch/x86/events/amd/core.c | 4 ++++- arch/x86/events/perf_event.h | 1 +- arch/x86/include/asm/perf_event.h | 23 +++++++++++++++++++++- 4 files changed, 61 insertions(+) diff --git a/arch/x86/events/amd/brs.c b/arch/x86/events/amd/brs.c index 40461c3..895c821 100644 --- a/arch/x86/events/amd/brs.c +++ b/arch/x86/events/amd/brs.c @@ -7,6 +7,7 @@ * Contributed by Stephane Eranian */ #include +#include #include #include @@ -329,3 +330,35 @@ void amd_pmu_brs_sched_task(struct perf_event_context *ctx, bool sched_in) if (sched_in) amd_brs_poison_buffer(); } + +/* + * called from ACPI processor_idle.c or acpi_pad.c + * with interrupts disabled + */ +void perf_amd_brs_lopwr_cb(bool lopwr_in) +{ + struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events); + union amd_debug_extn_cfg cfg; + + /* + * on mwait in, we may end up in non C0 state. + * we must disable branch sampling to avoid holding the NMI + * for too long. We disable it in hardware but we + * keep the state in cpuc, so we can re-enable. + * + * The hardware will deliver the NMI if needed when brsmen cleared + */ + if (cpuc->brs_active) { + cfg.val = get_debug_extn_cfg(); + cfg.brsmen = !lopwr_in; + set_debug_extn_cfg(cfg.val); + } +} + +DEFINE_STATIC_CALL_NULL(perf_lopwr_cb, perf_amd_brs_lopwr_cb); +EXPORT_STATIC_CALL_TRAMP_GPL(perf_lopwr_cb); + +void __init amd_brs_lopwr_init(void) +{ + static_call_update(perf_lopwr_cb, perf_amd_brs_lopwr_cb); +} diff --git a/arch/x86/events/amd/core.c b/arch/x86/events/amd/core.c index f7bce83..8e1e818 100644 --- a/arch/x86/events/amd/core.c +++ b/arch/x86/events/amd/core.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only #include +#include #include #include #include @@ -1225,6 +1226,9 @@ static int __init amd_core_pmu_init(void) /* * put_event_constraints callback same as Fam17h, set above */ + + /* branch sampling must be stopped when entering low power */ + amd_brs_lopwr_init(); } x86_pmu.attr_update = amd_attr_update; diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h index ef27aee..3b03245 100644 --- a/arch/x86/events/perf_event.h +++ b/arch/x86/events/perf_event.h @@ -1226,6 +1226,7 @@ void amd_brs_enable(void); void amd_brs_enable_all(void); void amd_brs_disable_all(void); void amd_brs_drain(void); +void amd_brs_lopwr_init(void); void amd_brs_disable_all(void); int amd_brs_setup_filter(struct perf_event *event); void amd_brs_reset(void); diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h index 58d9e4b..8199fc5 100644 --- a/arch/x86/include/asm/perf_event.h +++ b/arch/x86/include/asm/perf_event.h @@ -2,6 +2,8 @@ #ifndef _ASM_X86_PERF_EVENT_H #define _ASM_X86_PERF_EVENT_H +#include + /* * Performance event hw details: */ @@ -513,6 +515,27 @@ static inline void intel_pt_handle_vmx(int on) #if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_CPU_SUP_AMD) extern void amd_pmu_enable_virt(void); extern void amd_pmu_disable_virt(void); + +#if defined(CONFIG_PERF_EVENTS_AMD_BRS) + +#define PERF_NEEDS_LOPWR_CB 1 + +/* + * architectural low power callback impacts + * drivers/acpi/processor_idle.c + * drivers/acpi/acpi_pad.c + */ +extern void perf_amd_brs_lopwr_cb(bool lopwr_in); + +DECLARE_STATIC_CALL(perf_lopwr_cb, perf_amd_brs_lopwr_cb); + +static inline void perf_lopwr_cb(bool lopwr_in) +{ + static_call_mod(perf_lopwr_cb)(lopwr_in); +} + +#endif /* PERF_NEEDS_LOPWR_CB */ + #else static inline void amd_pmu_enable_virt(void) { } static inline void amd_pmu_disable_virt(void) { }