From nobody Thu Apr 9 10:53:32 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 C4B65C433FE for ; Fri, 4 Nov 2022 13:07:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230045AbiKDNHm (ORCPT ); Fri, 4 Nov 2022 09:07:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44104 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230021AbiKDNHj (ORCPT ); Fri, 4 Nov 2022 09:07:39 -0400 Received: from m13134.mail.163.com (m13134.mail.163.com [220.181.13.134]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 89F142E6B9 for ; Fri, 4 Nov 2022 06:07:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=Date:From:Subject:MIME-Version:Message-ID; bh=M9PbT Gakjv/3zqqgp2j3iH+TiftOFmtoxz74GES9Wdo=; b=Yp/+ETeK6T2LXqYxNALmY CjF/byF4HURdXx4RLah+6zhP35r5VkVwOboxj1jrufD3Huwl3mLjk2nmx5qKIukL jH4Wm9IVgMZ82BCTNoxEw7M2dmVa305eNgdRcpXK/+l17Guqna9gmuaoq4IT3hmJ RsPUcQbRcv+LsrJ3c2keeM= Received: from 00107082$163.com ( [222.64.157.165] ) by ajax-webmail-wmsvr134 (Coremail) ; Fri, 4 Nov 2022 21:07:35 +0800 (CST) X-Originating-IP: [222.64.157.165] Date: Fri, 4 Nov 2022 21:07:35 +0800 (CST) From: "David Wang" <00107082@163.com> To: "linux-kernel@vger.kernel.org" Subject: [PATCH] trace/trace_uprobe: Only invoke uprobe ebpf handler when event matches. X-Priority: 3 X-Mailer: Coremail Webmail Server Version XT5.0.13 build 20220113(9671e152) Copyright (c) 2002-2022 www.mailtech.cn 163com X-NTES-SC: AL_QuydBfmduEou4yWfZekZnEoUjug3W8K5v/kk3Y9VOp80iivC1Q4adlVPLEL4686kOQeHmjKpQSRf6PtgR4pKcqx5q1y7eiLUqlPJsufzuHT5 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Message-ID: <41828b90.5798.18442c10017.Coremail.00107082@163.com> X-Coremail-Locale: zh_CN X-CM-TRANSID: hsGowACH_t2XDmVjmj5cAA--.49235W X-CM-SenderInfo: qqqrilqqysqiywtou0bp/1tbiEAivql8YLKr7GgABs8 X-Coremail-Antispam: 1U5529EdanIXcx71UUUUU7vcSsGvfC2KfnxnUU== Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Only invoke uprobe ebpf handler when event matches. =20 uprobe ebpf handler would be called even the event dose not match any registered perf event, following steps would be used to generate a unregistered perf event. 1. register a uprobe event on a specified pid 2. invokes syscall `clone` (via pthread_create), new process generated. (Maybe it is a bug here, the uprobe breakpoint is inherited from 3. invokes the function which is uprobed in step 1. 4. perf event generated... =20 Ebpf handler would be invoked even the event happened on , but the default perf event handler make further check and ignore the event because no registered perf event match on . The patch means to fix the inconsistent behavior between ebpf and the defau= lt. Before invoke uprobe ebpf handler, make sure current event match. =20 Signed-off-by: David Wang <00107082@163.com> -- diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c index fb58e86dd117..6f13163c0c0f 100644 Reported-by: kernel test robot --- a/kernel/trace/trace_uprobe.c +++ b/kernel/trace/trace_uprobe.c @@ -1346,27 +1346,20 @@ static void __uprobe_perf_func(struct trace_uprobe = *tu, void *data; int size, esize; int rctx; + bool trace_event_match =3D true; =20 -#ifdef CONFIG_BPF_EVENTS - if (bpf_prog_array_valid(call)) { - u32 ret; =20 - ret =3D bpf_prog_run_array_sleepable(call->prog_array, regs, bpf_prog_ru= n); - if (!ret) - return; + preempt_disable(); + head =3D this_cpu_ptr(call->perf_events); + if (hlist_empty(head)) { + trace_event_match =3D false; + goto out; } -#endif /* CONFIG_BPF_EVENTS */ =20 esize =3D SIZEOF_TRACE_ENTRY(is_ret_probe(tu)); - size =3D esize + tu->tp.size + dsize; size =3D ALIGN(size + sizeof(u32), sizeof(u64)) - sizeof(u32); if (WARN_ONCE(size > PERF_MAX_TRACE_SIZE, "profile buffer not large enoug= h")) - return; - - preempt_disable(); - head =3D this_cpu_ptr(call->perf_events); - if (hlist_empty(head)) goto out; =20 entry =3D perf_trace_buf_alloc(size, NULL, &rctx); @@ -1389,11 +1382,21 @@ static void __uprobe_perf_func(struct trace_uprobe = *tu, =20 memset(data + len, 0, size - esize - len); } - perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs, head, NULL); out: preempt_enable(); + +#ifdef CONFIG_BPF_EVENTS + if (trace_event_match && bpf_prog_array_valid(call)) { + u32 ret; + + ret =3D bpf_prog_run_array_sleepable(call->prog_array, regs, bpf_prog_ru= n); + if (!ret) + return; + } +#endif /* CONFIG_BPF_EVENTS */ + } =20 /* uprobe profile handler */ --