From nobody Sun Feb 8 15:25:55 2026 Received: from mail-qk1-f179.google.com (mail-qk1-f179.google.com [209.85.222.179]) (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 E24B83E95BB for ; Thu, 5 Feb 2026 13:59:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770299941; cv=none; b=qzxeJ8HAuzPzAJ/HUaBL6zdUs6cLCT8GHfqO8PqmgPRJ4w5oKEKlNseywv6tgSJWjF2jfeI1feuuJciAzdVol2/k+q5qSUbzLbKQ8Nt8II6zG3gkZQXwCzo5m+emQbGMUh6yC37uHmBWkYh5PML2hoV1cWIQEe9g0IXGU+uaHBY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770299941; c=relaxed/simple; bh=xNoM3ajeOuo+vHypFLl5eB9S7kFrp92N00jEL3zmt5M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lISBGrHpeqN3Ldx0Fx1BVKTkEH3AkqYCZZOtKh8Uu0PZzUpESRvRr1kIIdaMxZNxnarrNzeGQn+DGlGQuLJDMPDHCcmssTP00yR6jrJqvT15WiPs+cp44AKEX+UvCf0UZBovkZw6hAohD2rc/oTfbau3kxAwNq9/vzPEstKVEX0= 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=Bd5vUI8+; arc=none smtp.client-ip=209.85.222.179 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="Bd5vUI8+" Received: by mail-qk1-f179.google.com with SMTP id af79cd13be357-8ca3807494eso60948185a.2 for ; Thu, 05 Feb 2026 05:59:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770299940; x=1770904740; 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=IKmWgylkYM7IUOyI3sKx0XB35vK5p+kJUDZCEqi1vOA=; b=Bd5vUI8+1LA6AFMU+J0KU9pkr3fxJjmfJj12MLo97kBk2xBXNwBFq1400m7tAZBJTd CAGTt77O/Vrhibm4ZVl6v8xZmZQQn1wBP4wWsiDaa9/mxTreS2yv8PC4RswJr6yBVdih IkQl6CgzLVwwrrVsBKt6IJrfFK9xHFCrD5jOJxQxFdV6jDYSfJewH7x7klVX9+qr/WQ4 6La9Guq8Vo473Xq4ITa5wUPmuEfbRKrFqtd4z3PFfbrGiSWTBdVH0lqWOU3QCBOjXZM9 0nckVDkKYYtXwllPIO9zfRJ79XAn+sAjs5GwirWsaYTpfSFe5+ZKQovmzIhSH8mGlJVe H+0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770299940; x=1770904740; 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=IKmWgylkYM7IUOyI3sKx0XB35vK5p+kJUDZCEqi1vOA=; b=sgOyWymftAOB0KWZ1jVSznVYTElJ4B/xfP/sKykhANiKsyLAbpUgGOvWxBaeVJ7GUs 00uTlU0714/1FwsfbqrcsDqlmBeQCgoildvbScVdOhXkzEep4XuagVJSIZxh57q4fBSa tPyOi4cPM5JP5Ca9aeF16WMneya+T6azr0yUiVJz8nOn2LF3Z1nzIsBuOsE3eFIlQ2h2 +Oc6dvnTfjr5cnKcIjQJ6B4P27kivM2Ngy6cRUimHC3s7dA60QoH6fGVRKqQpw38MWn2 yj6cwgaGh3Ik11zIZMBTZPOThUl4ZZvkfV/ReOt5XcckfO/nJnA4pghPihLOotu7PxzU MJmQ== X-Forwarded-Encrypted: i=1; AJvYcCXJkQwqkBeara2cgkf7tvrWwN20oFFcgwPa9ufNgZJH7VmNDBTZdOkpKMVeIYFMwy8jcSMCIrcz7rAbdHE=@vger.kernel.org X-Gm-Message-State: AOJu0YxjfJix5jcWTPfLLq46LD56/4ti8vUAQ0cgnngHeDmp6zvfQOZ8 GOXbyvQyc0AV3OAxSUGL/+2CalpvsSDBcaQ7XS2akJpc+FnxiZ3ULB2v X-Gm-Gg: AZuq6aJsrLM7/J+gGxYuG9S0qa/LQbPauw26U17D4Q86R4+Lsr3wjT9q5Sw4Azb7sou Uo9Gho6cD6YjxfYd+gO5zkC+ij0pmDmYlVDo9n9oX5RVYt6u/3Gns8GmXYhS/CK5wXJDhRA++Kd 6zvjPo5F0MfSQVP37pcO1kaS8At0LBwrtNcO+72itQehqUqJeq46p8likCmEqMSfmJGcJzue+nT ue9zdgxhja7M528hMBnLMKqhICsLmneJ6bXQrO05OQEE/YyC9sCLEySqeexdRA7whcjZp4KkrxD yBpKzowy8Zx3sMnlpkTFg0Gv+oyrlj5XpOapfU5KMSBZDWaR0CvqCAn/N+rZ7C0TdgMw6bFhFuE G4NUCHJXmGa6iHo5ET+5d4IXfOnF+O2uYYsL9z5v2QCeuF/wlaJKt3ZXk3QKDfSrKVgT5yZPnId MmwEZVSqTm79A1s6z6jjtfYp1iXKPgric3hL6TmnApbAdJdiJh1p+VLfIDp9ZDWrEWzi/oiMc= X-Received: by 2002:a05:620a:4720:b0:8ca:2cf9:81a3 with SMTP id af79cd13be357-8ca2f868aa7mr799096385a.40.1770299939812; Thu, 05 Feb 2026 05:58:59 -0800 (PST) Received: from pc.mynetworksettings.com ([2600:4041:4491:2000:87a6:ecbb:44f:b3c1]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8ca2fd40f9asm404975985a.41.2026.02.05.05.58.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Feb 2026 05:58:59 -0800 (PST) From: "Seokwoo Chung (Ryan)" To: mhiramat@kernel.org Cc: rostedt@goodmis.org, corbet@lwn.net, shuah@kernel.org, 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 v6 1/4] tracing/fprobe: Support comma-separated symbols and :entry/:exit Date: Thu, 5 Feb 2026 08:58:39 -0500 Message-ID: <20260205135842.20517-2-seokwoo.chung130@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260205135842.20517-1-seokwoo.chung130@gmail.com> References: <20260205135842.20517-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" Extend the fprobe event interface to support: - Comma-separated symbol lists: "func1,func2,func3" - Exclusion prefix: "func1,!func2,func3" - Explicit :entry and :exit suffixes (replacing %return for lists) Single-symbol probes retain backward compatibility with %return. The list parsing is factored into a dedicated parse_fprobe_list() helper that splits comma-separated input into filter (included) and nofilter (excluded) strings. Tracepoint validation now reports the error position via trace_probe_log_err() so users can see what went wrong in tracefs/error_log. Changes since v5: - Fix missing closing brace in the empty-token check that caused a build error. - Remove redundant strchr/strstr checks for tracepoint validation (the character validation loop already rejects ',', ':', and '%'). - Add trace_probe_log_err() to the tracepoint character validation loop per reviewer feedback. - Remove unnecessary braces around single-statement if per kernel coding style. - Extract list parsing into parse_fprobe_list() per reviewer feedback to keep parse_fprobe_spec() focused. Update tracefs/README to reflect the new syntax. Signed-off-by: Seokwoo Chung (Ryan) --- kernel/trace/trace.c | 3 +- kernel/trace/trace_fprobe.c | 219 ++++++++++++++++++++++++++++-------- 2 files changed, 174 insertions(+), 48 deletions(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 8bd4ec08fb36..649a6e6021b4 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -5578,7 +5578,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 262c0556e4af..f8846cd1d020 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,131 @@ 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_list(char *b, char **filter, char **nofilter) +{ + char *f __free(kfree) =3D NULL; + char *nf __free(kfree) =3D NULL; + char *tmp =3D b, *tok; + size_t sz; =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) + sz =3D strlen(b) + 1; + + f =3D kzalloc(sz, GFP_KERNEL); + nf =3D kzalloc(sz, GFP_KERNEL); + if (!f || !nf) return -ENOMEM; =20 - if (*is_return) - return 0; + while ((tok =3D strsep(&tmp, ",")) !=3D NULL) { + char *dst; + bool neg =3D (*tok =3D=3D '!'); =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 (*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); } =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; + *filter =3D no_free_ptr(f); + *nofilter =3D no_free_ptr(nf); + + return 0; +} + +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; + + if (!in || !base || !is_return || !list_mode || !filter || !nofilter) + return -EINVAL; + + *base =3D NULL; *filter =3D NULL; *nofilter =3D NULL; + *is_return =3D false; *list_mode =3D false; + + if (is_tracepoint) { + for (p =3D in; *p; p++) + if (!isalnum(*p) && *p !=3D '_') { + trace_probe_log_err(p - in, BAD_TP_NAME); + return -EINVAL; + } + b =3D kstrdup(in, GFP_KERNEL); + if (!b) + return -ENOMEM; + *base =3D no_free_ptr(b); + return 0; + } + + 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) { + ret =3D parse_fprobe_list(b, &f, &nf); + if (ret) + return ret; + *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 +1322,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 +1332,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 +1354,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 +1386,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 +1430,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 +1465,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 +1566,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 Sun Feb 8 15:25:55 2026 Received: from mail-qk1-f176.google.com (mail-qk1-f176.google.com [209.85.222.176]) (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 944933ECBD7 for ; Thu, 5 Feb 2026 13:59:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770299943; cv=none; b=hQ/AF1kC/WMufk8WseTkJWS/sPrXnnOku6fZ8kcsoRA631nK4cQFtxLI8iJDDFLJh9GD8IOng1kod+viZX+cG9ZE1hD7YFEu4gsBQ56yzUo9WybojiNJ0wVkiadtF8TA6eKQpU8lCkPjzfJmmXlmgsaBZW1GhT9vSZKpfQ9jyxY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770299943; c=relaxed/simple; bh=hFDnQ6dA5v4LIpZGLVcYSapTXIgZOljUMnp90oGqvWA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FgKkP2CRjP4k5iwHUo8KChiLemxwSSsQsX2Bzb5KUrOOUvSyRIPEs24GN44ykt1qRSYZIdiAiSbFWJv7tccBieZK3ZlbFYVchzyC4MpOw02eGzI87mM7RYeHwDlgCTFPPX1vI/EjrVoaNAQC9rjyuRmx+Ya71mYJwQZl2/yiReA= 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=bmp1WrBT; arc=none smtp.client-ip=209.85.222.176 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="bmp1WrBT" Received: by mail-qk1-f176.google.com with SMTP id af79cd13be357-8c52c67f64cso70767485a.0 for ; Thu, 05 Feb 2026 05:59:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770299942; x=1770904742; 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=fKV19EGGSuPx0CSDuaZFnNmV/tMAAbV9MIqJCR7Q2JI=; b=bmp1WrBTME6W/7U7Y7cWEjTejFvWrKIRMlKYrfv1qWOKtfSE4OI5sS+iTXgNb8Wfpv fq7OAS8awIUxlAgCyMGsRNurQ7zzyR4HWcvHVHjfJf3djRck4kQ5JBCjfu7FDdg7VsrN tnGrHNtf5aIoCQbVRkNmBeQwqQNvYKdh/uNrlStLgCHIaOVyn7/y2TpQEp6NhPbu4SGa eah7PVYvFHC6/t5aDNXcw6GnHvw45UttG+VJTftZWkB4r5CGtE/Om7Ef5D+IHz7X4jVc 4Ce3x5AKFPHz2eNJN25J0+AWnfq8Ya4c3Wrmf0my9vi4Nqu5Ge6psbVh78wpx5ZbhZbQ hQ4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770299942; x=1770904742; 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=fKV19EGGSuPx0CSDuaZFnNmV/tMAAbV9MIqJCR7Q2JI=; b=SVPCKfAjFPCzOC1lbStLu2LFZFKmTIRoschk0hKJxjPERVFhhb+X1QKwWFrqxqCPxT v44/65JzFM52x1r7hd4YlijT4jKM96FQUbv/WkNWq0n9jqC7eOsCdZjrgFg4SBgmBqO8 b5cFT6k4tt5FXOZ/+QJyHsYjFRWz2tPzEl9DrdaYwUR2FVFO+YWUpuk+WiZ5fRH+8QYQ Jme48sXzxOLZwmYEVgjLAqw5Ysr43y5ncIgzBvJTdk6ljJjkbhHARQeyfNng1EsfK1aD 0kY4NGTSMJ3ZEQJnS8IhkaflnuKsJ8Eo7L4hOroGi+lGFfMSInXvhpSN43Jwe5k35frs qIDg== X-Forwarded-Encrypted: i=1; AJvYcCXLosOi/5NWkk32uROnQe273/FBJOng5WZYOgNM8ZnebnMHn941J/uRqiOc4O0oIIpKmPdhnz4ceZrq/zE=@vger.kernel.org X-Gm-Message-State: AOJu0Yx4IhBjvSm23Mz6uhAYppaHUhcnvTV+duGo4rA3/TE9+TIh46+t 5kon4SqZLCmO36mDA9R6cHel7R59AD6jAvL51zO6xcFzhPlUofkcnGKbTdVdyw== X-Gm-Gg: AZuq6aLLPhwMnyg7Jxe11YWFw1gkyCmmvONFY+/vQO9Syz6TmLKsen6aEDmNZiOVmpH O2+n4kpN4/Y3R1xDD9u93Z21AUzuyi8IgoGct7pL37WAfuAqrdajet1ksvp50kyPg5s9etoKLQ3 AERJfkSmI5c5dJENTXAvfk8TqBAIvBmsG+GP0x9iz+UHTEzn6bcgleH1re9Vkl1fWNcoTEChaym YZiCBpGuiUapjnOO1O0fNbWN0l88KcrrmeVsvjzJ1kgPXmBY0O8wwGRWCaooebWXag3A0/8+C9q m2zlZAicKTECNx5vCWIASn242VnaclphS0/PGIUFPVY3YjHeWzDcAtPVADsYCCSVbdy1u0jqSDl oPzoz1C9jq0CapPF5UlTEgRn/MnVsUDHfjdkNttI8MHFow+qzKwaaBNkTXdQxegzN8EzEfNCndz fMYELUhpdvESWWKu0kbGcbI1STCL8jwBaL5KqstCkCgXaPD00j4CPPBA8AK8F6z2130YQVzFM= X-Received: by 2002:a05:620a:c4a:b0:8b2:7536:bd2c with SMTP id af79cd13be357-8ca2fa08fbbmr876603685a.78.1770299942602; Thu, 05 Feb 2026 05:59:02 -0800 (PST) Received: from pc.mynetworksettings.com ([2600:4041:4491:2000:87a6:ecbb:44f:b3c1]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8ca2fd40f9asm404975985a.41.2026.02.05.05.59.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Feb 2026 05:59:02 -0800 (PST) From: "Seokwoo Chung (Ryan)" To: mhiramat@kernel.org Cc: rostedt@goodmis.org, corbet@lwn.net, shuah@kernel.org, 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 v6 2/4] fprobe: Support comma-separated filters in register_fprobe() Date: Thu, 5 Feb 2026 08:58:40 -0500 Message-ID: <20260205135842.20517-3-seokwoo.chung130@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260205135842.20517-1-seokwoo.chung130@gmail.com> References: <20260205135842.20517-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" register_fprobe() passes its filter and notfilter strings directly to glob_match(), which only understands shell-style globs (*, ?, [...]). Comma-separated symbol lists such as "vfs_read,vfs_open" never match any symbol because no kernel symbol contains a comma. Add glob_match_comma_list() that splits the filter on commas and checks each entry individually with glob_match(). The existing single-pattern fast path is preserved (no commas means the loop executes exactly once). This is required by the comma-separated fprobe list syntax introduced in the preceding patch; without it, enabling a list-mode fprobe event fails with "Could not enable event". Signed-off-by: Seokwoo Chung (Ryan) --- kernel/trace/fprobe.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/kernel/trace/fprobe.c b/kernel/trace/fprobe.c index 1188eefef07c..2acd24b80d04 100644 --- a/kernel/trace/fprobe.c +++ b/kernel/trace/fprobe.c @@ -672,12 +672,38 @@ struct filter_match_data { struct module **mods; }; =20 +/* + * Check if @name matches any comma-separated glob pattern in @list. + * If @list contains no commas, this is equivalent to glob_match(). + */ +static bool glob_match_comma_list(const char *list, const char *name) +{ + const char *cur =3D list; + + while (*cur) { + const char *sep =3D strchr(cur, ','); + int len =3D sep ? sep - cur : strlen(cur); + char pat[KSYM_NAME_LEN]; + + if (len > 0 && len < KSYM_NAME_LEN) { + memcpy(pat, cur, len); + pat[len] =3D '\0'; + if (glob_match(pat, name)) + return true; + } + if (!sep) + break; + cur =3D sep + 1; + } + return false; +} + static int filter_match_callback(void *data, const char *name, unsigned lo= ng addr) { struct filter_match_data *match =3D data; =20 - if (!glob_match(match->filter, name) || - (match->notfilter && glob_match(match->notfilter, name))) + if (!glob_match_comma_list(match->filter, name) || + (match->notfilter && glob_match_comma_list(match->notfilter, name))) return 0; =20 if (!ftrace_location(addr)) --=20 2.43.0 From nobody Sun Feb 8 15:25:55 2026 Received: from mail-qk1-f196.google.com (mail-qk1-f196.google.com [209.85.222.196]) (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 5F6D53E9F8D for ; Thu, 5 Feb 2026 13:59:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.196 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770299945; cv=none; b=tJD1KMZiATrjFs/U7g8RhjRQd4xNdDGA0t8QWgw+VeuWhpIszYzpZhZkLmaUWPio+2IYQiRrm2zhW3gskpZUwnSDKVQScFOrCeEmvnbjjuKU+P5HIt3ij9izp9bguOvIa/9KYqTxQNwrWHNTP7dEs3nekqvaFaMyQsVN5RhZMIE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770299945; c=relaxed/simple; bh=dfSf90CX2fFuCBXs9FEXQJWwoweCuaJmCw5t3YHWiD4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=H8psXRpAZYCUyItm8y1rCSwXB8jmnp9pQLuUpFADlq6vlBnmFgvSzIJL3Mp897obYQc7siReD9p9hLxYwPx33MsPt4yY+vXDK89SBGxacBe2SxBDbOkn/MXIhG39f/sgpkrP5ypgPQOxj6ylA2OJY+oFr94mpDb8vTB9wb8aGWA= 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=lskdNJM1; arc=none smtp.client-ip=209.85.222.196 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="lskdNJM1" Received: by mail-qk1-f196.google.com with SMTP id af79cd13be357-8c69ffb226eso126131585a.1 for ; Thu, 05 Feb 2026 05:59:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770299944; x=1770904744; 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=lskdNJM1jt+SEUCstya50W8LVNRwAtMVYdQs7sHvrjiDN1OQXrp6FvMsTu42pEh5rL HEy8sl+69X39EDcfGL8HsKFl0ldYRqdPUvomviRo2FEv4d0Le3KKP2Eda1xXs44fsnqA Wpz4xGu3wCEuY+v9zvODzJ7wO8mBwuVnoYslN13S8xoA/g/tT75Gy4n2cb8dNccFm0Q5 BPfk6CibcnI9Css3xJYm5h6Nrg+EzpmTB5HF5CCFfFiH/X25UZ2hoC6Oh3FGXOS4IfPr GOAnDbVkQ/AeWhyHMiKMTZ5jjoj2e6DVmjHPBP0MyDOBfeQXnmip4NlpWH5qh3ahzjxN ZF/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770299944; x=1770904744; 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=Sp5RYcycRLwixlkzpfFU5SyqwFAHvqttHuDDfsmj8K1A/Hv01aQgQ1U8eEvSJFS3P9 c+A1hoGLcuIX+vcvML4KbnuwjzGcyj05xFViBvV34pL11ST8i6px5r6dvft/Mx4CbNtL ycSh8HLkPyon+N6spwrHYLMHXVgYk7Ejvm6Y/ZbZIVtpMzPxkJ+OiaTVZcTqn2w5NB/h SAx6795DDkN3DUXHinwI2ORjVNn+MStczTS5E8UpUDbYH9/2U+Ap1ACy35yRLMsOCrhj YUfFVa04qb8QlSwjk8q7SjH3JueTwo+82Oa5wZkfdwZTeJY8Y5f/me/ojTn93wdmw6tP ZE7A== X-Forwarded-Encrypted: i=1; AJvYcCW/8cyB9acHLRBs8jBsbD2LekYZY27Zfny2NxXDe4sOeNrdQ3M0MvHlbPt3Y2I7sLs+h7A6hIX8X6bczkg=@vger.kernel.org X-Gm-Message-State: AOJu0YzF1tBOTGXPv8XBwwH9oxgqy5j4ZfW0uWu4K/YBml8pDpytcyrr ndgBVIQS2DtGxnRJXL4OXSLOYrqEOC9vKV4K7oSlkcpjzo3zUdv0ORPh X-Gm-Gg: AZuq6aJpG5F5mxscJMmNSE7gLuy7vSjE0BZ4hHg32t+1RQ8jDIFApAm08FzZ95tHzBK g3pJXpE+An1j38gPybcQzO4y2Ep6cRLE5b5FIylrKkdw7IyCFYTqZA+Er9xr+4XzDIdm1Hel3yU qQ6wJ2whCRPzg1WkL7MLfiVlaoMxBofSSWTg655CMOipyJQejwMYi7P+U2RT0MuDdFDYNydwaQc Eef7ok2FxJsMM5mEV1BcnqJYhGrKLExUCmLfopPznQuDeZ4aPnxlVsMyIMiOH734O1X5DdEORYk K399uZvy77kwjaomeO/Eo5RLz/a+qyN8oGXeCQFXL5OIZShdNN82mhvXi1L3jjjNJK1jiRUVyIa vWUCe6JYUd+CP14p1XS2cFk16BhwElPwIM2d2bznIg3y8A/gK2UYSxN6ThaFaLIw4acumwJLvo2 TW+kMIfk2/Vvm7XFAEtRQT52Jfu7J3pRmpoy4fd3eA+URqRpVIUIAQFPpMjkItH2Fm+PyWB8w= X-Received: by 2002:a05:620a:4009:b0:8c7:1986:6b3e with SMTP id af79cd13be357-8ca2f83bdd4mr765898885a.32.1770299944301; Thu, 05 Feb 2026 05:59:04 -0800 (PST) Received: from pc.mynetworksettings.com ([2600:4041:4491:2000:87a6:ecbb:44f:b3c1]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8ca2fd40f9asm404975985a.41.2026.02.05.05.59.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Feb 2026 05:59:03 -0800 (PST) From: "Seokwoo Chung (Ryan)" To: mhiramat@kernel.org Cc: rostedt@goodmis.org, corbet@lwn.net, shuah@kernel.org, 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 v6 3/4] docs: tracing/fprobe: Document list filters and :entry/:exit Date: Thu, 5 Feb 2026 08:58:41 -0500 Message-ID: <20260205135842.20517-4-seokwoo.chung130@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260205135842.20517-1-seokwoo.chung130@gmail.com> References: <20260205135842.20517-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 Sun Feb 8 15:25:55 2026 Received: from mail-qk1-f173.google.com (mail-qk1-f173.google.com [209.85.222.173]) (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 36E073EDABC for ; Thu, 5 Feb 2026 13:59:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770299947; cv=none; b=A2HewReVvCM64TCtMQ40KQeh8EYfn6QP2lnOeCNOstxjNb9lSciRie56/aSgB/D1fVwrIbyIKw4Ta+cTui0NfZsmwngwXS+0TeCqOznFVkamKPq4njER00CY1OjeJaL7NuB7KSn8EgzCGerzuKpTHy75NfEFP+RH7XWhkG5mmWc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770299947; c=relaxed/simple; bh=ivjLMnYh+gDKhE3NyeK+npuA+uD8EDy6F2Zu9UaPPf0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=S2nLFkSh9Efl+/GlN5R0UQ2AZ3SANKfkQUxJb+5LGqro7MngBlAIHIoDRjsvUNFo6/UmLu7pI0DGZAfmwD7SUO0l2onVWC48mjtksdA5ApXXXdmQWVZ/I8P274/IldxFZ2adcXAPAzvzKfY032dWkj/EJlNQr7OpkleMH8Jbi6M= 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=e41WHapi; arc=none smtp.client-ip=209.85.222.173 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="e41WHapi" Received: by mail-qk1-f173.google.com with SMTP id af79cd13be357-8c6a50c17fdso90428685a.2 for ; Thu, 05 Feb 2026 05:59:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770299946; x=1770904746; 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=mYk5NaEanNq6uThb2wsIHzNJQE6YGo/SE46HgW+lAvg=; b=e41WHapiL96hDLsLJ9qC0wStyceeTXamm5sQZwiNxsIovYRZ2solJ71u0JU1OcQyH2 d7NkKe7R5H3QThR8pRFvWz2p7jYGnRkDosI10+rw0i5trrN/gnrfjkF+PA/lK/jUktXG zbCEo60dZu3ek/bLDocaAFhCqxtpKEAoDD/4y6thevVsc44EgCBEZsZYPG6SdviHyDS+ 9LaYdO98klObHxrJS0veo80dCqY1Ov25jGZnQmnIsJxqjDkI1XOuRCBEnxqR8DUu6Y2A Z08J/7rU/nIWTstkbqweDRlJ3eB5GO24oF9S8i3E9LQvBr/WwERoK7cTAuVebDshayPP KDfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770299946; x=1770904746; 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=mYk5NaEanNq6uThb2wsIHzNJQE6YGo/SE46HgW+lAvg=; b=DW0RAK4e36jKu+QPDzAraP7xZUx+MzRfeUXNfCjgmStq+mVLmBqRCamPAqs0xOCp63 bPfQHbm7lCTdfiVvqctCKDusJbWhqJD57hbeXxl7Wbq/WmzHwDpjbt7K8fyKHGGcvOqp /jAf0fzPbEMmaqmg14wWK2fzH4L81hCgMxnHp5HV/LJTv3i94D42oeROdyR5zUOmT6P/ nBT0vyBETe8Vs4gvrWjePtEHKqbkEOVvFHSy106wyXVUUBAv2YWmV8oCLtCi8+WNp99Q 4l7pROyGCSpB7NdOA83KR9LIo35BJjg5uwTbhoNdeZpuiNhqaQJzcIoTt4vKvp7vHS/h 8Qxg== X-Forwarded-Encrypted: i=1; AJvYcCVW0B38CAt9UD7cwyZFkAXiDYZxWKD9FKD7RdUmXQgJs0qezagZojDRgrJmUdQQ7MGhZn0lguiOcm7UyAo=@vger.kernel.org X-Gm-Message-State: AOJu0YyTg55Zk8uyFBPndBsSsqlZo6efiAbYciN0FYJR6c1N39jSl7// THVDb0nMRYRj2Vk9W4KKmx8VMuwNQNx+j+t0WFxyh20hhZDjHnk0fBf3 X-Gm-Gg: AZuq6aLsJwMzh66kzzBF9C5Ccvm39jWd8Bq4ItVD1KJUjqyBnYShUoDKP4ORghzavhh 6Xgyck67OdI/82rgnNqCTyrnOBJrSMmPIBiLIifZrkezxm6RZqBx5TcaFeC3Il9aixOGUM9lk9b NdGtvspkQQFQEwc75AvxdU+KGpgAEhQRm4r2h7LTJPhdfQQ36p/M80ZstlJsrBmThvoveGX6LCD 9lyvPEvMPZHhryxgphbK+oaUXtG+4Sf5nfaS5Lj23vXHZ7jw8IABhGtl+W9OyV/B6mXyKWW3bip Q/Kxa00U7y4hom7a0RvnwywU74OlUZKAUcGzngnnvx7YBf/i0B5P+YlszCgV/hf2b8ITyxRuGZk L5MXLpcvnah+SjyyANgcerehD/Nj3NK9yfQo23QC/7DSb7cXCNQw8cNW5oiqhwkmPhuX38N/SoK QhiAvTnYwUdZDSuKL6Wwtsq3jFzp+3ODcxr/+s2JrmTLZJ5eJ6ZfLzOKxIb9GRJje8dBkZmyA= X-Received: by 2002:a05:620a:170c:b0:8be:94e6:3e6c with SMTP id af79cd13be357-8ca2f87eaa2mr899365685a.39.1770299946058; Thu, 05 Feb 2026 05:59:06 -0800 (PST) Received: from pc.mynetworksettings.com ([2600:4041:4491:2000:87a6:ecbb:44f:b3c1]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8ca2fd40f9asm404975985a.41.2026.02.05.05.59.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Feb 2026 05:59:05 -0800 (PST) From: "Seokwoo Chung (Ryan)" To: mhiramat@kernel.org Cc: rostedt@goodmis.org, corbet@lwn.net, shuah@kernel.org, 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 v6 4/4] selftests/ftrace: Add accept cases for fprobe list syntax Date: Thu, 5 Feb 2026 08:58:42 -0500 Message-ID: <20260205135842.20517-5-seokwoo.chung130@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260205135842.20517-1-seokwoo.chung130@gmail.com> References: <20260205135842.20517-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" Add fprobe_list.tc to test the comma-separated symbol list syntax with :entry/:exit suffixes. Three scenarios are covered: 1. List with default (entry) behavior and ! exclusion 2. List with explicit :entry suffix 3. List with :exit suffix for return probes Each test verifies that the correct functions appear in enabled_functions and that excluded (!) symbols are absent. Note: The existing tests add_remove_fprobe.tc, fprobe_syntax_errors.tc, and add_remove_fprobe_repeat.tc check their "requires" line against the tracefs README for the old "%return" syntax pattern. Since the README now documents ":entry|:exit" instead, these tests report UNSUPPORTED. Their "requires" lines need updating in a follow-up patch. 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