From nobody Thu Apr 16 05:14:13 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0EBA0C4332F for ; Thu, 24 Nov 2022 09:43:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229893AbiKXJnS (ORCPT ); Thu, 24 Nov 2022 04:43:18 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52634 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229915AbiKXJnN (ORCPT ); Thu, 24 Nov 2022 04:43:13 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8F3DDD22A2; Thu, 24 Nov 2022 01:43:05 -0800 (PST) Date: Thu, 24 Nov 2022 09:43:02 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1669282984; 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=3QBRCQ+BHT2z0qtsJ++jNMKm5qLGoOdudDBsHBJOE78=; b=NKvUw7oGOkJrmwWdlBtiOmXpOSp0RmdIsmmU8jkx1nFZnI2nI6jTzLWoC5JQTRRhziWIUQ y/dAnb/F+ZW56WWLraSkrzlvQAlcc5+0K6R5BJCUA22VhIfxGRIefdwieXTlyMPF2RW5nT RYtox3p1H1KzMUY1OpnCxTluA6RgxbqxI0O2bwhfj/HDCbSNyGoSbJZzgA52xpFAE4+VB/ Vvg2SL5hAbNfb2trAPly6vFseopmnlK8XbkhpdQduWioum2jnxgmMqEkgkAEh7Y+z5LzPK 0ipcID4gcz0C/vMTgUFbolpSTBVMWggKGVl5DnE4cRm0qrmI5zlGoeRjTHfHhQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1669282984; 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=3QBRCQ+BHT2z0qtsJ++jNMKm5qLGoOdudDBsHBJOE78=; b=Z1YL6gq1rY5mU0MQ8Jsm3k7gWHs7aSE3zEQArJsflOPTzfa1ycalc3tOw7mP72dElNPn4t 4Ihq5B5qaKmXOgBA== From: "tip-bot2 for Peter Zijlstra" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: perf/urgent] perf: Consider OS filter fail Cc: Pengfei Xu , "Peter Zijlstra (Intel)" , Marco Elver , x86@kernel.org, linux-kernel@vger.kernel.org In-Reply-To: References: MIME-Version: 1.0 Message-ID: <166928298250.4906.513715216575584648.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: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The following commit has been merged into the perf/urgent branch of tip: Commit-ID: 030a976efae83f7b6593afb11a8254d42f9290fe Gitweb: https://git.kernel.org/tip/030a976efae83f7b6593afb11a8254d42= f9290fe Author: Peter Zijlstra AuthorDate: Sat, 19 Nov 2022 10:45:54 +08:00 Committer: Peter Zijlstra CommitterDate: Thu, 24 Nov 2022 10:12:23 +01:00 perf: Consider OS filter fail Some PMUs (notably the traditional hardware kind) have boundary issues with the OS filter. Specifically, it is possible for perf_event_attr::exclude_kernel=3D1 events to trigger in-kernel due to SKID or errata. This can upset the sigtrap logic some and trigger the WARN. However, if this invalid sample is the first we must not loose the SIGTRAP, OTOH if it is the second, it must not override the pending_addr with a (possibly) invalid one. Fixes: ca6c21327c6a ("perf: Fix missing SIGTRAPs") Reported-by: Pengfei Xu Signed-off-by: Peter Zijlstra (Intel) Reviewed-by: Marco Elver Tested-by: Pengfei Xu Link: https://lkml.kernel.org/r/Y3hDYiXwRnJr8RYG@xpf.sh.intel.com --- kernel/events/core.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/kernel/events/core.c b/kernel/events/core.c index f2bb27e..9d15d2d 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -9273,6 +9273,19 @@ int perf_event_account_interrupt(struct perf_event *= event) return __perf_event_account_interrupt(event, 1); } =20 +static inline bool sample_is_allowed(struct perf_event *event, struct pt_r= egs *regs) +{ + /* + * Due to interrupt latency (AKA "skid"), we may enter the + * kernel before taking an overflow, even if the PMU is only + * counting user events. + */ + if (event->attr.exclude_kernel && !user_mode(regs)) + return false; + + return true; +} + /* * Generic event overflow handling, sampling. */ @@ -9306,6 +9319,13 @@ static int __perf_event_overflow(struct perf_event *= event, } =20 if (event->attr.sigtrap) { + /* + * The desired behaviour of sigtrap vs invalid samples is a bit + * tricky; on the one hand, one should not loose the SIGTRAP if + * it is the first event, on the other hand, we should also not + * trigger the WARN or override the data address. + */ + bool valid_sample =3D sample_is_allowed(event, regs); unsigned int pending_id =3D 1; =20 if (regs) @@ -9313,7 +9333,7 @@ static int __perf_event_overflow(struct perf_event *e= vent, if (!event->pending_sigtrap) { event->pending_sigtrap =3D pending_id; local_inc(&event->ctx->nr_pending); - } else if (event->attr.exclude_kernel) { + } else if (event->attr.exclude_kernel && valid_sample) { /* * Should not be able to return to user space without * consuming pending_sigtrap; with exceptions: @@ -9330,7 +9350,7 @@ static int __perf_event_overflow(struct perf_event *e= vent, } =20 event->pending_addr =3D 0; - if (data->sample_flags & PERF_SAMPLE_ADDR) + if (valid_sample && (data->sample_flags & PERF_SAMPLE_ADDR)) event->pending_addr =3D data->addr; irq_work_queue(&event->pending_irq); }