From nobody Mon Dec 1 22:36:51 2025 Received: from mail-qk1-f175.google.com (mail-qk1-f175.google.com [209.85.222.175]) (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 247A32E88BB for ; Wed, 26 Nov 2025 18:41:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764182493; cv=none; b=QpgZUAZoAdHAJ1rVQQNwwxfyvXJbE6QxGt82Gn92EU6kzlCFsYgg3f1XMXm6J0/+hUpORuKnTRRRBTI1wAF1xVBMaw9DzKJTXqDOEiVJsdQQuJYSfHo0l1kwvvb17OrWW8aFeBErNWuEUrRiQGMSeHTeEkLOVt5ZB74lCb985RA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764182493; c=relaxed/simple; bh=dfSf90CX2fFuCBXs9FEXQJWwoweCuaJmCw5t3YHWiD4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Xr669E+prGv2BqOM87Qbhww/g4mEHayjj1NWyWcL36RFflzd3DFumIfg/Oazb+97ii4ty2o3IY6IJVlEsIUnGo917bXxf+y9FElvCSOgyAldzZ/lMJfCLorvt4R6h3zGXuxNQT3JDTjJ4Tp3n0F5TkXxI4yc9BQdcgptodgaAwk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=gjfPpbkw; arc=none smtp.client-ip=209.85.222.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="gjfPpbkw" Received: by mail-qk1-f175.google.com with SMTP id af79cd13be357-8b1f2fbaed7so3847985a.2 for ; Wed, 26 Nov 2025 10:41:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1764182491; x=1764787291; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=r25epDAJMQ/dj4/lD+Zndgkln/iNdOm3o/jXssTljSE=; b=gjfPpbkwOlrreZCEjmzJFa/R/wub4LdHPIMHP/DljKl/gh+tnk7nnaB71CB6MpaU0I WQhT89k71G8Ii2kHFy33z0IyZ/o8pNH0lzrIB5LwsrLLN/Ib5Sem/1wkkxRbHYqRIfkY Gmn3/lAqaV9UPMIJmLJSp3D7+bmrkls/by8LN/hYp4bVZy2vie66Jf9xaPzQtYwnTvgU EIWGbzPtvfmbbTXyB8UJhumiBvQm2tS03GZ2oqR6otnuKC75YWO7zRMp9Pth+UZvyBHj 8sf3zW/t2NYUA3+8zL0ZFS4++Px4JvxoNYjtI5sZXuLiCzkBPXJ2x1lkjtuKanDygwCN 28VQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764182491; x=1764787291; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=r25epDAJMQ/dj4/lD+Zndgkln/iNdOm3o/jXssTljSE=; b=AyRP6Ih38u8nwmCGOgiNFXB1+82vTSn2knyIjECSprZbwwV3hrht1nWPwf5qAfU+Ll meZr64PWbFAoaFC9BS2fM5ggneYf/l7GZAzEpEsmpemcQmctn70qeSp+pxRXVvlrSG3h SlLSC/QZSeHlcxnEnbKT45Lwqfes8fGhpEoRZpSIo3xLndkreIvfbd6qE5KA0wKv0Nqd aPsrks5CnKVZiGUSr4isM93gNCn9yrJws0WHSL0jsvWZoquGZSDmTb6Xkdy+I+y0P2fk RIee4YoXteHf9Hr5zDEt9jajnqn4t/IepQxGiKJjTijnpQ6vXTb4iaz1o/J+f1xL/ckC BhPQ== X-Forwarded-Encrypted: i=1; AJvYcCXVKPxBM28Mmbl5b2KO8zXQG97sUfZDa0zliqQY6WJQ8V7jHu/Rfo5b//U0biUeYg0FRfVtY518K5nxd18=@vger.kernel.org X-Gm-Message-State: AOJu0YwncQ8ouL/aqtYER9Uvrugop5K0taL2cVE7XE6pBVWfExedY2oB 4jDvLhx99AC2KqGWy16Cg1H5KslynkfrUkl/QlGvP2u01UbvwDROKEYR X-Gm-Gg: ASbGncuWP0kSw53woZfOSHj2w4HAdSjn4WuUueNC63xoOH3Fxvi96zLRnN1oHaVdIMB 6r+XqkDb6vnYGxDiRskCYSlFN5bGA0TX+f0X2EC69FcWp/u1aamanYLVIf9dZitT1EGqaN8vIih aTCd9+900zeA9jLK8IUIzLb9xwuI1ZEEfAVj8YS/I8PHQHEJCVXCDwDw2bidlbRoI/mmiAYCapT WTdsS9jcN5nqiNBoyraJ69DocglPj9jMb29ax+2GXBip9KI0dObk1dyW0liSaCr9SuCV2qIEfHF Z14tYrO6Ocq27H1iffXtRlH4X3WJiOYuGq1rOihInt1BCuyU+NlG5DD1fsbbz3CGg+tgI8zWtBt Clq8tTBeoidYPU2Yy4a95VpblUkp8lkmp/oo1iA5fQfQkKzgjCt7jhRvzUkZ7Dds3/H5b2nRsmd qGD20hBJuRHUdF0jZtPfwBboNAomoSrjADoXCGkDG0Bg7pYhEy9pj1DXaNSf//SStvm44kd0Gy X-Google-Smtp-Source: AGHT+IHqQ4vHalOGeJgi5wHcgOQIKhyE2K/ufYLvIbCrYdKKtu2YqgKcr53BfJEZTMvq2GMt0PmGbw== X-Received: by 2002:a05:620a:1a9f:b0:890:62b7:5ae2 with SMTP id af79cd13be357-8b33d4cfacdmr2481832785a.46.1764182490954; Wed, 26 Nov 2025 10:41:30 -0800 (PST) Received: from pc.mynetworksettings.com ([2600:4041:4491:2000:9820:e89a:8e2a:90ba]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-8846e445b1csm149919506d6.9.2025.11.26.10.41.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Nov 2025 10:41:30 -0800 (PST) From: "Seokwoo Chung (Ryan)" To: rostedt@goodmis.org, mhiramat@kernel.org, corbet@lwn.net, shuah@kernel.org Cc: mathieu.desnoyers@efficios.com, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, "Seokwoo Chung (Ryan)" Subject: [PATCH v4 1/3] docs: tracing/fprobe: Document list filters and :entry/:exit Date: Wed, 26 Nov 2025 13:41:08 -0500 Message-ID: <20251126184110.72241-2-seokwoo.chung130@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251126184110.72241-1-seokwoo.chung130@gmail.com> References: <20251126184110.72241-1-seokwoo.chung130@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Update fprobe event documentation to describe comma-separated symbol lists, exclusions, and explicit suffixes. Signed-off-by: Seokwoo Chung (Ryan) --- Documentation/trace/fprobetrace.rst | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Documentation/trace/fprobetrace.rst b/Documentation/trace/fpro= betrace.rst index b4c2ca3d02c1..bbcfd57f0005 100644 --- a/Documentation/trace/fprobetrace.rst +++ b/Documentation/trace/fprobetrace.rst @@ -25,14 +25,18 @@ Synopsis of fprobe-events ------------------------- :: =20 - f[:[GRP1/][EVENT1]] SYM [FETCHARGS] : Probe on fun= ction entry - f[MAXACTIVE][:[GRP1/][EVENT1]] SYM%return [FETCHARGS] : Probe on fun= ction exit + f[:[GRP1/][EVENT1]] SYM[%return] [FETCHARGS] : Single function + f[:[GRP1/][EVENT1]] SYM[,[!]SYM[,...]][:entry|:exit] [FETCHARGS] :Multip= le + function t[:[GRP2/][EVENT2]] TRACEPOINT [FETCHARGS] : Probe on tra= cepoint =20 GRP1 : Group name for fprobe. If omitted, use "fprobes" for it. GRP2 : Group name for tprobe. If omitted, use "tracepoints" for= it. EVENT1 : Event name for fprobe. If omitted, the event name is - "SYM__entry" or "SYM__exit". + - For a single literal symbol, the event name is + "SYM__entry" or "SYM__exit". + - For a *list or any wildcard*, an explicit [GRP1/][EVENT1] is + required; otherwise the parser rejects it. EVENT2 : Event name for tprobe. If omitted, the event name is the same as "TRACEPOINT", but if the "TRACEPOINT" starts with a digit character, "_TRACEPOINT" is used. @@ -40,6 +44,13 @@ Synopsis of fprobe-events can be probed simultaneously, or 0 for the default value as defined in Documentation/trace/fprobe.rst =20 + SYM : Function name or comma-separated list of symbols. + - SYM prefixed with "!" are exclusions. + - ":entry" suffix means it probes entry of given symbols + (default) + - ":exit" suffix means it probes exit of given symbols. + - "%return" suffix means it probes exit of SYM (single + symbol). FETCHARGS : Arguments. Each probe can have up to 128 args. ARG : Fetch "ARG" function argument using BTF (only for functi= on entry or tracepoint.) (\*1) --=20 2.43.0 From nobody Mon Dec 1 22:36:51 2025 Received: from mail-qv1-f54.google.com (mail-qv1-f54.google.com [209.85.219.54]) (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 42DC1339B4A for ; Wed, 26 Nov 2025 18:41:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764182497; cv=none; b=RoYc8REd4JVGSZd6Mk+ewA8AFj3nCbC4n/bamTHS45uNYOQ/FBAdO/Pu5+5cAzShUk2j+UVNCjbBlu5WnNv9JG+pA2d7OYMAwzHo4aOKUdQm62SHqY5f1eTnunJbZprECyJ/Gw9U07LuK4F93u9I6taQMTqTZJjaMAH0R+12L5U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764182497; c=relaxed/simple; bh=jRr1vA2VhcAB7e6x+d+1Ejo2gBsTf4wkgPnm+WVpHKc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QWHp+5q5dkrq3nVNTuHK6n9mU74yxULIhaSHvAMR5TQwNBZadoymlXqmmTCuc2ZNdG0+uTYDKABNFukQcz2l7pg52y1NKYzcognx59eH9Yosnp5+8+7csQwRas4R4e0Tcu+HcNhrawdVXqX1o3ov5pn/lxnY8oqKRDA/IjLTraQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bH/uuZpj; arc=none smtp.client-ip=209.85.219.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bH/uuZpj" Received: by mail-qv1-f54.google.com with SMTP id 6a1803df08f44-8823dfa84c5so438166d6.3 for ; Wed, 26 Nov 2025 10:41:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1764182494; x=1764787294; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=v5AIJTSliCzft/R4MKMCKOoevolVdyRiQwHIZI0IpKk=; b=bH/uuZpjAyxYxNrlyozGu/vpiGn9Kb8mHvFW61dGx5LBxkd+ouBU28Ft9qWgHaHayp ZexdVzp3O9pY+FQGj9spKxtJZftEvGzwsJRSnkFP4BQmnlyYNyQtop6wnNNRd9bv+Pq3 anarp6dkCdjp9EteP1wK/48Ytu7agJY3oSpgiXm5VylKZ7OMZj/TSQohQb+7CdW4szm7 5xNyeto1aDh7z8T+rcTibMsJq4jvTSRkkbzkZfOPN3Rd4WCeBMxCDADjba2AHAwCdukk 4y4SgSNrIcN1xRvMntOtj7PPLCTBmaQhlVVF98qNmkh/2x7lo0R6VmZWKhNAGcZvboDC IP6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764182494; x=1764787294; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=v5AIJTSliCzft/R4MKMCKOoevolVdyRiQwHIZI0IpKk=; b=FtvtffFHzNXJ6ZqaTWLr+/X5dZa6sMMz70JOvzQ/pORrWQV0LYDPguKyBsRAoKV4M3 Zw0Vm/VDDzq03zanXNO6CQ6N4aV1KBOCWCpH+p4eWgat8K9+vFiyQF6i0aMQ8pB+7rB1 Mbhn0YRy1337wH6Dshk2OulrUbaPGXuTwv870olu2VQSz4AIjVlf+LOLf7/lwMD55tkW GHsq9WeVpiPxHI/dR+RSSF0KbbJss5BiiSmjWxhECubCdmYZBZzv563ZrdhqHgIjp4Pk Dw/VBfe4svf7/V2qmtLXM95O3QES5ypL6GPDZkvxpYrg1airo6ltGh3tsagIEhaVVCVt BcVg== X-Forwarded-Encrypted: i=1; AJvYcCV3vmoo6fBNXepNQBTuScWZdGkiYIH44T2TBL/wrTZOQsPI3fy8fplwGx02Gfv12GowhM7DS7xOOgPf03c=@vger.kernel.org X-Gm-Message-State: AOJu0YxLXOWw49P/Xuweb1/JIwf+6IqlWdvZePtLp1EwIEaZiWmzpyfF 6yQa/wq8thY9IZIwbFgvLeLVN+dlpdfNxab0nOinA/lMZYcpiPPORD1/ X-Gm-Gg: ASbGncufQa4UJvxe2N8z4BUxuPiWJYznNSfs44aMNHOBozQ4z9nlq1EkHrIpLLe65ow ef/9P+d2FVzoBqXYs7yhYnCC1lSyjlVXVszsDhcuXnbP/iDW0Cp2DiHFCsNP2w6vlRu+q4Br8BR gxHK3QvvIbDqqnbhb/iVJ3qBd8GwYHoGy8slBRluzOiqKe3XK8nZ+ssDhY/M2v0w1HNwkDduSss whM73MiRnZvSopoTDwlLPn1fruETPtFsgsKLSnuuuSlYTLYxbv51cGBfHUdWWU6Ll3wCs5By6EF khEd9vW24ocAjqsBq2AA/I75wi9IVnG/x/wzVG4omD50fuPC1PQARsQ5I6xI76L8v3H+HlxJEC3 4fvxOszqAK9OPgTn3lF0SejI8oG4jj4ERmi+ZqEliv0jlToaWoZre1YR0/ofp78hX3yEW1x9o7A 3qryAaGfSprpeiewCqySn8xzcXI/OVaYTlCuLFs9YTT4Xh7RO57VlbX5qYxbpUcvG97u8AHIOb X-Google-Smtp-Source: AGHT+IHKOZzQGfkvDelDc1zjct1s7HRIYV1rQIM2VrRA7sLEUXmzMgwCEl/SerYIvu5apAHiLVU4xg== X-Received: by 2002:a05:6214:768:b0:880:5279:98eb with SMTP id 6a1803df08f44-8847c5120ecmr280275526d6.44.1764182494055; Wed, 26 Nov 2025 10:41:34 -0800 (PST) Received: from pc.mynetworksettings.com ([2600:4041:4491:2000:9820:e89a:8e2a:90ba]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-8846e445b1csm149919506d6.9.2025.11.26.10.41.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Nov 2025 10:41:33 -0800 (PST) From: "Seokwoo Chung (Ryan)" To: rostedt@goodmis.org, mhiramat@kernel.org, corbet@lwn.net, shuah@kernel.org Cc: mathieu.desnoyers@efficios.com, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, "Seokwoo Chung (Ryan)" Subject: [PATCH v4 2/3] tracing/fprobe: Support comma-separated symbols and :entry/:exit Date: Wed, 26 Nov 2025 13:41:09 -0500 Message-ID: <20251126184110.72241-3-seokwoo.chung130@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251126184110.72241-1-seokwoo.chung130@gmail.com> References: <20251126184110.72241-1-seokwoo.chung130@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" - Update DEFINE_FREE to use standard __free() - Extend fprobe to support multiple symbols per event. Add parsing logic for lists, ! exclusions, and explicit suffixes. Update tracefs/README to refl= ect the new syntax Signed-off-by: Seokwoo Chung (Ryan) --- kernel/trace/trace.c | 3 +- kernel/trace/trace_fprobe.c | 209 +++++++++++++++++++++++++++--------- 2 files changed, 163 insertions(+), 49 deletions(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index d1e527cf2aae..e0b77268a702 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -5518,7 +5518,8 @@ static const char readme_msg[] =3D "\t r[maxactive][:[/][]] []\n" #endif #ifdef CONFIG_FPROBE_EVENTS - "\t f[:[/][]] [%return] []\n" + "\t f[:[/][]] [:entry|:exit] []\= n" + "\t (single symbols still accept %return)\n" "\t t[:[/][]] []\n" #endif #ifdef CONFIG_HIST_TRIGGERS diff --git a/kernel/trace/trace_fprobe.c b/kernel/trace/trace_fprobe.c index 8001dbf16891..6307d7d7dd9c 100644 --- a/kernel/trace/trace_fprobe.c +++ b/kernel/trace/trace_fprobe.c @@ -187,11 +187,14 @@ DEFINE_FREE(tuser_put, struct tracepoint_user *, */ struct trace_fprobe { struct dyn_event devent; + char *filter; struct fprobe fp; + bool list_mode; + char *nofilter; const char *symbol; + struct trace_probe tp; bool tprobe; struct tracepoint_user *tuser; - struct trace_probe tp; }; =20 static bool is_trace_fprobe(struct dyn_event *ev) @@ -559,6 +562,8 @@ static void free_trace_fprobe(struct trace_fprobe *tf) trace_probe_cleanup(&tf->tp); if (tf->tuser) tracepoint_user_put(tf->tuser); + kfree(tf->filter); + kfree(tf->nofilter); kfree(tf->symbol); kfree(tf); } @@ -838,7 +843,12 @@ static int __register_trace_fprobe(struct trace_fprobe= *tf) if (trace_fprobe_is_tracepoint(tf)) return __regsiter_tracepoint_fprobe(tf); =20 - /* TODO: handle filter, nofilter or symbol list */ + /* Registration path: + * - list_mode: pass filter/nofilter + * - single: pass symbol only (legacy) + */ + if (tf->list_mode) + return register_fprobe(&tf->fp, tf->filter, tf->nofilter); return register_fprobe(&tf->fp, tf->symbol, NULL); } =20 @@ -1154,60 +1164,119 @@ static struct notifier_block tprobe_event_module_n= b =3D { }; #endif /* CONFIG_MODULES */ =20 -static int parse_symbol_and_return(int argc, const char *argv[], - char **symbol, bool *is_return, - bool is_tracepoint) +static bool has_wildcard(const char *s) { - char *tmp =3D strchr(argv[1], '%'); - int i; + return s && (strchr(s, '*') || strchr(s, '?')); +} =20 - if (tmp) { - int len =3D tmp - argv[1]; +static int parse_fprobe_spec(const char *in, bool is_tracepoint, + char **base, bool *is_return, bool *list_mode, + char **filter, char **nofilter) +{ + char *work __free(kfree) =3D NULL; + char *b __free(kfree) =3D NULL; + char *f __free(kfree) =3D NULL; + char *nf __free(kfree) =3D NULL; + bool legacy_ret =3D false; + bool list =3D false; + const char *p; + int ret =3D 0; =20 - if (!is_tracepoint && !strcmp(tmp, "%return")) { - *is_return =3D true; - } else { - trace_probe_log_err(len, BAD_ADDR_SUFFIX); - return -EINVAL; - } - *symbol =3D kmemdup_nul(argv[1], len, GFP_KERNEL); - } else - *symbol =3D kstrdup(argv[1], GFP_KERNEL); - if (!*symbol) - return -ENOMEM; + if (!in || !base || !is_return || !list_mode || !filter || !nofilter) + return -EINVAL; =20 - if (*is_return) - return 0; + *base =3D NULL; *filter =3D NULL; *nofilter =3D NULL; + *is_return =3D false; *list_mode =3D false; =20 if (is_tracepoint) { - tmp =3D *symbol; - while (*tmp && (isalnum(*tmp) || *tmp =3D=3D '_')) - tmp++; - if (*tmp) { - /* find a wrong character. */ - trace_probe_log_err(tmp - *symbol, BAD_TP_NAME); - kfree(*symbol); - *symbol =3D NULL; + if (strchr(in, ',') || strchr(in, ':')) return -EINVAL; - } + if (strstr(in, "%return")) + return -EINVAL; + for (p =3D in; *p; p++) + if (!isalnum(*p) && *p !=3D '_') + return -EINVAL; + b =3D kstrdup(in, GFP_KERNEL); + if (!b) + return -ENOMEM; + *base =3D no_free_ptr(b); + return 0; } =20 - /* If there is $retval, this should be a return fprobe. */ - for (i =3D 2; i < argc; i++) { - tmp =3D strstr(argv[i], "$retval"); - if (tmp && !isalnum(tmp[7]) && tmp[7] !=3D '_') { - if (is_tracepoint) { - trace_probe_log_set_index(i); - trace_probe_log_err(tmp - argv[i], RETVAL_ON_PROBE); - kfree(*symbol); - *symbol =3D NULL; + work =3D kstrdup(in, GFP_KERNEL); + if (!work) + return -ENOMEM; + + p =3D strstr(work, "%return"); + if (p && p[7] =3D=3D '\0') { + *is_return =3D true; + legacy_ret =3D true; + *(char *)p =3D '\0'; + } else { + /* + * If "symbol:entry" or "symbol:exit" is given, it is new + * style probe. + */ + p =3D strrchr(work, ':'); + if (p) { + if (!strcmp(p, ":exit")) { + *is_return =3D true; + *(char *)p =3D '\0'; + } else if (!strcmp(p, ":entry")) { + *(char *)p =3D '\0'; + } else { return -EINVAL; } - *is_return =3D true; - break; } } - return 0; + + list =3D !!strchr(work, ','); +=09 + if (list && legacy_ret) { + return -EINVAL; + } + + if (legacy_ret) + *is_return =3D true; + + b =3D kstrdup(work, GFP_KERNEL); + if (!b) + return -ENOMEM; + + if (list) { + char *tmp =3D b, *tok; + size_t fsz, nfsz; + + fsz =3D nfsz =3D strlen(b) + 1; + + f =3D kzalloc(fsz, GFP_KERNEL); + nf =3D kzalloc(nfsz, GFP_KERNEL); + if (!f || !nf) + return -ENOMEM; + + while ((tok =3D strsep(&tmp, ",")) !=3D NULL) { + char *dst; + bool neg =3D (*tok =3D=3D '!'); + + if (*tok =3D=3D '\0') { + trace_probe_log_err(tmp - b - 1, BAD_TP_NAME); + return -EINVAL; + + if (neg) + tok++; + dst =3D neg ? nf : f; + if (dst[0] !=3D '\0') + strcat(dst, ","); + strcat(dst, tok); + } + *list_mode =3D true; + } + + *base =3D no_free_ptr(b); + *filter =3D no_free_ptr(f); + *nofilter =3D no_free_ptr(nf); + + return ret; } =20 static int trace_fprobe_create_internal(int argc, const char *argv[], @@ -1241,6 +1310,8 @@ static int trace_fprobe_create_internal(int argc, con= st char *argv[], const char *event =3D NULL, *group =3D FPROBE_EVENT_SYSTEM; struct module *mod __free(module_put) =3D NULL; const char **new_argv __free(kfree) =3D NULL; + char *parsed_nofilter __free(kfree) =3D NULL; + char *parsed_filter __free(kfree) =3D NULL; char *symbol __free(kfree) =3D NULL; char *ebuf __free(kfree) =3D NULL; char *gbuf __free(kfree) =3D NULL; @@ -1249,6 +1320,7 @@ static int trace_fprobe_create_internal(int argc, con= st char *argv[], char *dbuf __free(kfree) =3D NULL; int i, new_argc =3D 0, ret =3D 0; bool is_tracepoint =3D false; + bool list_mode =3D false; bool is_return =3D false; =20 if ((argv[0][0] !=3D 'f' && argv[0][0] !=3D 't') || argc < 2) @@ -1270,11 +1342,26 @@ static int trace_fprobe_create_internal(int argc, c= onst char *argv[], =20 trace_probe_log_set_index(1); =20 - /* a symbol(or tracepoint) must be specified */ - ret =3D parse_symbol_and_return(argc, argv, &symbol, &is_return, is_trace= point); + /* Parse spec early (single vs list, suffix, base symbol) */ + ret =3D parse_fprobe_spec(argv[1], is_tracepoint, &symbol, &is_return, + &list_mode, &parsed_filter, &parsed_nofilter); if (ret < 0) return -EINVAL; =20 + for (i =3D 2; i < argc; i++) { + char *tmp =3D strstr(argv[i], "$retval"); + + if (tmp && !isalnum(tmp[7]) && tmp[7] !=3D '_') { + if (is_tracepoint) { + trace_probe_log_set_index(i); + trace_probe_log_err(tmp - argv[i], RETVAL_ON_PROBE); + return -EINVAL; + } + is_return =3D true; + break; + } + } + trace_probe_log_set_index(0); if (event) { gbuf =3D kmalloc(MAX_EVENT_NAME_LEN, GFP_KERNEL); @@ -1287,6 +1374,15 @@ static int trace_fprobe_create_internal(int argc, co= nst char *argv[], } =20 if (!event) { + /* + * Event name rules: + * - For list/wildcard: require explicit [GROUP/]EVENT + * - For single literal: autogenerate symbol__entry/symbol__exit + */ + if (list_mode || has_wildcard(symbol)) { + trace_probe_log_err(0, NO_GROUP_NAME); + return -EINVAL; + } ebuf =3D kmalloc(MAX_EVENT_NAME_LEN, GFP_KERNEL); if (!ebuf) return -ENOMEM; @@ -1322,7 +1418,8 @@ static int trace_fprobe_create_internal(int argc, con= st char *argv[], NULL, NULL, NULL, sbuf); } } - if (!ctx->funcname) + + if (!list_mode && !has_wildcard(symbol) && !is_tracepoint) ctx->funcname =3D symbol; =20 abuf =3D kmalloc(MAX_BTF_ARGS_LEN, GFP_KERNEL); @@ -1356,6 +1453,21 @@ static int trace_fprobe_create_internal(int argc, co= nst char *argv[], return ret; } =20 + /* carry list parsing result into tf */ + if (!is_tracepoint) { + tf->list_mode =3D list_mode; + if (parsed_filter) { + tf->filter =3D kstrdup(parsed_filter, GFP_KERNEL); + if (!tf->filter) + return -ENOMEM; + } + if (parsed_nofilter) { + tf->nofilter =3D kstrdup(parsed_nofilter, GFP_KERNEL); + if (!tf->nofilter) + return -ENOMEM; + } + } + /* parse arguments */ for (i =3D 0; i < argc; i++) { trace_probe_log_set_index(i + 2); @@ -1442,8 +1554,9 @@ static int trace_fprobe_show(struct seq_file *m, stru= ct dyn_event *ev) seq_printf(m, ":%s/%s", trace_probe_group_name(&tf->tp), trace_probe_name(&tf->tp)); =20 - seq_printf(m, " %s%s", trace_fprobe_symbol(tf), - trace_fprobe_is_return(tf) ? "%return" : ""); + seq_printf(m, " %s", trace_fprobe_symbol(tf)); + if (!trace_fprobe_is_tracepoint(tf) && trace_fprobe_is_return(tf)) + seq_puts(m, ":exit"); =20 for (i =3D 0; i < tf->tp.nr_args; i++) seq_printf(m, " %s=3D%s", tf->tp.args[i].name, tf->tp.args[i].comm); --=20 2.43.0 From nobody Mon Dec 1 22:36:51 2025 Received: from mail-qv1-f52.google.com (mail-qv1-f52.google.com [209.85.219.52]) (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 1743933BBD8 for ; Wed, 26 Nov 2025 18:41:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764182499; cv=none; b=bQ1LFhWF2IJrYReymfcVbxpmBkhHRRNhCf+cupNcAeHK0jrKBgK8qZEHrX5Eyd6XPhRjSe9UmlqKvOhp3MCh1N3qCCBeThyQHTy78Yh3RfHQtIMQr8DZObrXwaNOkBRtVgtQW8Wh2L0v2Y0ruVldXXeAY77e/sVdGJu3FWCstpg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764182499; c=relaxed/simple; bh=14sROXxsePSCyFjX+t2CW+D5fioa/3YjrCzjpOBgBnE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AX8KHC2z5rOKA3KtILAdmRKwwZKTRaL91wBwHj1+WJXMdhAXUxWtYjEJ9U6NbkojhuS2Vw8tVtVYBrrT9pvdwH2RAbG65rHqugwSm80mmFxsMQv0q+FQUNgMhTW1xmWsW3AoltitgDR4E9ywP5WIzMfjbCZcJKQo4CT6WE5i6wE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=OZXk5HKy; arc=none smtp.client-ip=209.85.219.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="OZXk5HKy" Received: by mail-qv1-f52.google.com with SMTP id 6a1803df08f44-8826b83e405so856246d6.0 for ; Wed, 26 Nov 2025 10:41:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1764182496; x=1764787296; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Ah32JKLj65Tb10mc2SlvS0l93Wr7sJeVTGZD/RA6bqM=; b=OZXk5HKyKgHowc4hetOJTA5sM5PSZmoRdnTdv16sXymvQDPG5orRvvAOgGLkEReDp0 FL2fGiqSCMM8WYVrwSdIVlVCK+Ala2vYIIpOMHdNdRZycOVmFVp2YFjO+i6LBMdFx0W8 DrzGiZHhCCCMD3OnKGJHW+mupc4YmrzkSanivcXFJEnR728j7sJfe9ohAmwSS/m1ejcZ McUMKlGNij3iOlYRLIkErn2vn/0/msiO3h98C/LTxxbC1bdix2O9v+8tSpyYgZnWBHUH 4/wbLhYIWtjEOG8jlYWWqTuDssCyx1LUQyiE7MjvvRyW9sZbgKefQH+18uTy3viweVN3 uRlw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764182496; x=1764787296; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Ah32JKLj65Tb10mc2SlvS0l93Wr7sJeVTGZD/RA6bqM=; b=CKZYa375JsfAQknlKiAla/4V44jCNorduPilkZtHNorwsnsHRCpOvxq6g5iofMgShp yTvc3BRL05Ae0VyxerMMQHGc6wfZ7bPOPGVyJTZd8W2X2LKH8PbrvWJlEv+jWPZbyRpT 185hw3oxSHdML6qGKAXokERvC2PZ5pQgaf5nSONRi+otc6oTgXTihy8nrrkQ+XYaucS3 i4DbpgAH56rE1+YYE01MpMxIiDUZdnf4lygLX9kaGMXcqlPZ3NqA+tEgPy+k4uxsYnpO aoATjoah3hH7UYlrqieLaVfoSAXWOK5qvUxx8kxiHhwSrR025iDgmw1JWrM3ozxvZIr2 iGIw== X-Forwarded-Encrypted: i=1; AJvYcCVvLJBZZFWKJ5ey4G/nHe8/aF5MSliixeKbzMeRkFx0XJDzC60uwTKM8rNTuoAOrsG1Y55GiReqatUExBs=@vger.kernel.org X-Gm-Message-State: AOJu0YwvKPh3FHg6Eqk1KF9zcx5oi0PMXVnQ5BEeGTP6QO6HYpYENe9Z GYxUK7uMSWn0GKoAgOlwgHeWHrA3qDG1u1n8xLwfkCnkQG8MLGvy3rGK X-Gm-Gg: ASbGnct2hT2ke4TPQufj5ha3s/jIQPnMOu/ur8T9Xl36jN65vPsc9qXLUBlRFv1UFRi ivQAJn4lhCqTLkq+CUGJLDvcDYy+ytQlOFT2QNWvqGQm29E3w/mR03E0k75Ml0ZhLnZLkZXj1CC JIS5IRSiphyzPHl0ClNq0f+w50JFH7M4FLZJyW13vSYVq1qCDd6FqGHezdnjMIdvQD1QQbqemhv NImkjeGn5JHUdVA5oG49bf62X/fKK3+FIQ54pzMoly3e3dfjezX65JWJr4G1GZ3rcYEDf9ZNHEp AJ09nAJuExeegcLcwJxTrdWra+v7wMiLJ1EYFE34CgVp0G9l7vGZ210bUD+UMUl1f2c+vOs9HYq 1jFC3I8rrAreIhl87B69DqK/dijQ8/x2IKlqJe+vOfqEedsWaS1nglJisyzXyLi7ZGofKOif7SZ HeZaOZQB9E81Jq1PUAJEErMB8y+d2fybrft0N6KEySqh8kfkC5y0JFvDxDi4TJu0Zs1729W4vo X-Google-Smtp-Source: AGHT+IFEsCg1mSN32D+C3r/VHUzlAz2wwpRVuDST+GsfS6aHpdaamrLaRE/OphYPfzmTkQtgG/qgSQ== X-Received: by 2002:a05:6214:3d05:b0:880:5bff:74d6 with SMTP id 6a1803df08f44-8847c536166mr305963936d6.51.1764182495821; Wed, 26 Nov 2025 10:41:35 -0800 (PST) Received: from pc.mynetworksettings.com ([2600:4041:4491:2000:9820:e89a:8e2a:90ba]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-8846e445b1csm149919506d6.9.2025.11.26.10.41.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Nov 2025 10:41:35 -0800 (PST) From: "Seokwoo Chung (Ryan)" To: rostedt@goodmis.org, mhiramat@kernel.org, corbet@lwn.net, shuah@kernel.org Cc: mathieu.desnoyers@efficios.com, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, "Seokwoo Chung (Ryan)" Subject: [PATCH v4 3/3] selftests/ftrace: Add accept cases for fprobe list syntax Date: Wed, 26 Nov 2025 13:41:10 -0500 Message-ID: <20251126184110.72241-4-seokwoo.chung130@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251126184110.72241-1-seokwoo.chung130@gmail.com> References: <20251126184110.72241-1-seokwoo.chung130@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Seokwoo Chung (Ryan) --- .../ftrace/test.d/dynevent/fprobe_list.tc | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 tools/testing/selftests/ftrace/test.d/dynevent/fprobe_l= ist.tc diff --git a/tools/testing/selftests/ftrace/test.d/dynevent/fprobe_list.tc = b/tools/testing/selftests/ftrace/test.d/dynevent/fprobe_list.tc new file mode 100644 index 000000000000..45e57c6f487d --- /dev/null +++ b/tools/testing/selftests/ftrace/test.d/dynevent/fprobe_list.tc @@ -0,0 +1,92 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# description: Fprobe event list syntax and :entry/:exit suffixes +# requires: dynamic_events "f[:[/][]] [:entry|:ex= it] []":README + +# Setup symbols to test. These are common kernel functions. +PLACE=3Dvfs_read +PLACE2=3Dvfs_write +PLACE3=3Dvfs_open + +echo 0 > events/enable +echo > dynamic_events + +# Get baseline count of enabled functions (should be 0 if clean, but be sa= fe) +if [ -f enabled_functions ]; then + ocnt=3D`cat enabled_functions | wc -l` +else + ocnt=3D0 +fi + +# Test 1: List default (entry) with exclusion +# Target: Trace vfs_read and vfs_open, but EXCLUDE vfs_write +echo "f:test/list_entry $PLACE,!$PLACE2,$PLACE3" >> dynamic_events +grep -q "test/list_entry" dynamic_events +test -d events/test/list_entry + +echo 1 > events/test/list_entry/enable + +grep -q "$PLACE" enabled_functions +grep -q "$PLACE3" enabled_functions +! grep -q "$PLACE2" enabled_functions + +# Check count (Baseline + 2 new functions) +cnt=3D`cat enabled_functions | wc -l` +if [ $cnt -ne $((ocnt + 2)) ]; then + exit_fail +fi + +# Cleanup Test 1 +echo 0 > events/test/list_entry/enable +echo "-:test/list_entry" >> dynamic_events +! grep -q "test/list_entry" dynamic_events + +# Count should return to baseline +cnt=3D`cat enabled_functions | wc -l` +if [ $cnt -ne $ocnt ]; then + exit_fail +fi + +# Test 2: List with explicit :entry suffix +# (Should behave exactly like Test 1) +echo "f:test/list_entry_exp $PLACE,!$PLACE2,$PLACE3:entry" >> dynamic_even= ts +grep -q "test/list_entry_exp" dynamic_events +test -d events/test/list_entry_exp + +echo 1 > events/test/list_entry_exp/enable + +grep -q "$PLACE" enabled_functions +grep -q "$PLACE3" enabled_functions +! grep -q "$PLACE2" enabled_functions + +cnt=3D`cat enabled_functions | wc -l` +if [ $cnt -ne $((ocnt + 2)) ]; then + exit_fail +fi + +# Cleanup Test 2 +echo 0 > events/test/list_entry_exp/enable +echo "-:test/list_entry_exp" >> dynamic_events + +# Test 3: List with :exit suffix +echo "f:test/list_exit $PLACE,!$PLACE2,$PLACE3:exit" >> dynamic_events +grep -q "test/list_exit" dynamic_events +test -d events/test/list_exit + +echo 1 > events/test/list_exit/enable + +# Even for return probes, enabled_functions lists the attached symbols +grep -q "$PLACE" enabled_functions +grep -q "$PLACE3" enabled_functions +! grep -q "$PLACE2" enabled_functions + +cnt=3D`cat enabled_functions | wc -l` +if [ $cnt -ne $((ocnt + 2)) ]; then + exit_fail +fi + +# Cleanup Test 3 +echo 0 > events/test/list_exit/enable +echo "-:test/list_exit" >> dynamic_events + +clear_trace --=20 2.43.0