From: "Masami Hiramatsu (Google)" <mhiramat@kernel.org>
To: Steven Rostedt <rostedt@goodmis.org>,
Masami Hiramatsu <mhiramat@kernel.org>,
Shuah Khan <shuah@kernel.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
linux-kselftest@vger.kernel.org
Subject: [PATCH v4 15/15] selftests/ftrace: Add event filter syntax check test case
Date: Thu, 29 Oct 2026 10:39:44 +0900 [thread overview]
Message-ID: <179323798449.740114.5416715723328926616.stgit@devnote2> (raw)
In-Reply-To: <179323784538.740114.15323117974242744566.stgit@devnote2>
From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Add a new ftracetest test case (filter-syntax-check.tc) to verify valid
event filter expressions, error_log caret reporting for malformed filter
expressions (empty filters, missing fields, unbalanced parentheses and
quotes, dangling logical operators, invalid fields/values/cpulists),
newline truncation on multi-line filter input, and error returns on
invalid subsystem filters.
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
---
Changes in v3:
- Replace negated pipelines (! cmd) with explicit
"if cmd; then exit_fail; fi" checks to properly catch unexpected success
under POSIX sh with set -e.
- Add test cases for empty string matching (prev_comm == "",
prev_comm ~ "").
- Add test cases for out-of-range CPU IDs with CPUS{} comparison.
- Add test cases for missing operands after operators.
- Add test cases for empty operands and stray operators.
- Add test cases for operand type mismatches and brace errors.
- Add test cases for function event filter syntax checks (including
INVALID_OP and ILLEGAL_FIELD_OP caret checks).
- Add test cases for multi-line input validation on event and subsystem
filters.
---
.../ftrace/test.d/filter/filter-syntax-check.tc | 100 ++++++++++++++++++++
1 file changed, 100 insertions(+)
create mode 100644 tools/testing/selftests/ftrace/test.d/filter/filter-syntax-check.tc
diff --git a/tools/testing/selftests/ftrace/test.d/filter/filter-syntax-check.tc b/tools/testing/selftests/ftrace/test.d/filter/filter-syntax-check.tc
new file mode 100644
index 000000000000..02fb2be6e6eb
--- /dev/null
+++ b/tools/testing/selftests/ftrace/test.d/filter/filter-syntax-check.tc
@@ -0,0 +1,100 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+# description: event filter - test filter syntax error check
+# requires: set_event events/sched/sched_switch/filter error_log
+# flags: instance
+
+check_error() { # command-with-error-pos-by-^
+ ftrace_errlog_check 'event filter parse error' "$1" 'events/sched/sched_switch/filter'
+}
+
+# Valid filter expressions
+echo '(common_pid == 0)' > events/sched/sched_switch/filter
+echo '((common_pid == 0) && (prev_pid == 0))' > events/sched/sched_switch/filter
+echo 'prev_comm ~ "*sh"' > events/sched/sched_switch/filter
+echo 'prev_comm ~ "*"' > events/sched/sched_switch/filter
+echo 'prev_comm == ""' > events/sched/sched_switch/filter
+echo 'prev_comm ~ ""' > events/sched/sched_switch/filter
+echo 'common_pid == CPUS{0}' > events/sched/sched_switch/filter
+echo 'common_pid != CPUS{0}' > events/sched/sched_switch/filter
+echo 0 > events/sched/sched_switch/filter
+
+# Empty or meaningless filter expressions
+check_error '^()' # NO_FILTER
+check_error '^== 1' # INVALID_FILTER
+check_error 'common_pid ==^' # INVALID_FILTER
+check_error 'common_pid !=^' # INVALID_FILTER
+check_error 'common_pid >=^' # INVALID_FILTER
+
+# Unbalanced parentheses and quotes
+check_error '^(common_pid == 1' # TOO_MANY_OPEN
+check_error 'common_pid == 1^)' # TOO_MANY_CLOSE
+check_error 'prev_comm == ^"bash' # MISSING_QUOTE
+
+# Dangling logical operators and empty operands
+check_error 'common_pid == 1 &&^' # TOO_MANY_PREDS
+check_error 'common_pid == 1 ||^' # TOO_MANY_PREDS
+check_error 'common_pid == 1 || (common_pid == 2 && ^)' # INVALID_FILTER
+check_error '(common_pid == ^)' # INVALID_VALUE
+check_error 'common_pid == ^&& common_pid == 0' # INVALID_VALUE
+
+# Invalid field, operator, or operand type
+check_error '^no_such_field == 1' # FIELD_NOT_FOUND
+check_error 'common_pid == ^@' # INVALID_VALUE
+check_error 'common_pid == ^"1"' # EXPECT_DIGIT
+check_error 'prev_comm == ^0' # EXPECT_STRING
+check_error 'common_pid ^~ 1' # ILLEGAL_FIELD_OP
+
+# CPUS{} syntax errors
+check_error 'common_pid ^> CPUS{0}' # ILLEGAL_FIELD_OP
+check_error 'common_pid == CPUS^0}' # MISSING_BRACE_OPEN
+check_error 'common_pid == CPUS{0^' # MISSING_BRACE_CLOSE
+check_error 'common_pid == CPUS{^}' # INVALID_CPULIST
+check_error 'common_pid == CPUS{99999^}' # INVALID_CPULIST
+
+# Function event filter errors (if supported)
+if [ -f events/kmem/kmem_cache_free/filter ]; then
+ check_kmem_error() {
+ ftrace_errlog_check 'event filter parse error' "$1" 'events/kmem/kmem_cache_free/filter'
+ }
+ check_kmem_error 'call_site.function == non_exist_func^' # NO_FUNCTION
+ check_kmem_error 'call_site.function ==^' # INVALID_FILTER
+ check_kmem_error 'call_site.function ^> 0' # INVALID_OP
+ check_kmem_error 'common_type^.function == 0' # ILLEGAL_FIELD_OP
+ echo 0 > events/kmem/kmem_cache_free/filter
+fi
+
+# Multi-line input with non-whitespace characters after newline must fail
+if ( printf "common_pid == 0\ncommon_pid == 1" | \
+ dd of=events/sched/sched_switch/filter bs=4096 ) 2> /dev/null; then
+ exit_fail
+fi
+if ( printf "common_pid == CPUS{0\n\"} && common_pid == 0" | \
+ dd of=events/sched/sched_switch/filter bs=4096 ) 2> /dev/null; then
+ exit_fail
+fi
+
+# Trailing whitespace characters after newline are permitted
+printf "common_pid == 0\n \n\t \n" | \
+ dd of=events/sched/sched_switch/filter bs=4096 2> /dev/null
+echo 0 > events/sched/sched_switch/filter
+
+# Subsystem filter must fail on invalid filter expressions
+echo 'common_pid >= 0' > events/sched/filter
+if echo 'no_such_field == 1' > events/sched/filter 2> /dev/null; then
+ exit_fail
+fi
+if echo 'common_pid == 1 &&' > events/sched/filter 2> /dev/null; then
+ exit_fail
+fi
+if ( printf "common_pid == 0\nfoo" | \
+ dd of=events/sched/filter bs=4096 ) 2> /dev/null; then
+ exit_fail
+fi
+
+# Subsystem filter with trailing whitespace after newline must succeed
+printf "common_pid == 0\n \n\t \n" | \
+ dd of=events/sched/filter bs=4096 2> /dev/null
+echo 0 > events/sched/filter
+
+exit 0
prev parent reply other threads:[~2026-10-29 1:39 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-29 1:37 [PATCH v4 00/15] tracing/filters: Fix event filter parsing and matching bugs Masami Hiramatsu (Google)
2026-10-29 1:37 ` [PATCH v4 01/15] tracing/filters: Fix MATCH_END_ONLY regex matching for fixed-size strings Masami Hiramatsu (Google)
2026-10-29 1:37 ` [PATCH v4 02/15] tracing/filters: Fix false success return in process_system_preds() Masami Hiramatsu (Google)
2026-10-29 1:45 ` sashiko-bot
2026-10-29 1:58 ` Masami Hiramatsu (Google)
2026-10-29 2:30 ` [PATCH v4.1 " Masami Hiramatsu (Google)
2026-10-29 1:37 ` [PATCH v4 03/15] tracing/filters: Handle out-of-range CPU for OP_NE in cpumask comparison Masami Hiramatsu (Google)
2026-10-29 1:38 ` [PATCH v4 04/15] tracing/filters: Report parse error on all -EINVAL paths in filter parsing Masami Hiramatsu (Google)
2026-10-29 1:38 ` [PATCH v4 05/15] tracing/filters: Check for missing operand after operator in parse_pred() Masami Hiramatsu (Google)
2026-10-29 1:38 ` [PATCH v4 06/15] tracing/filters: Fix quoted operand parsing in function event filter Masami Hiramatsu (Google)
2026-10-29 1:38 ` [PATCH v4 07/15] tracing/filters: Reject empty unquoted operand " Masami Hiramatsu (Google)
2026-10-29 1:38 ` [PATCH v4 08/15] tracing/filters: Reject unsupported field sizes in parse_pred() Masami Hiramatsu (Google)
2026-10-29 1:38 ` [PATCH v4 09/15] tracing/filters: Check for trailing characters after newline in filter string Masami Hiramatsu (Google)
2026-10-29 1:38 ` [PATCH v4 10/15] tracing/filters: Reject stray quotes and parentheses in unquoted function event operand Masami Hiramatsu (Google)
2026-10-29 1:39 ` [PATCH v4 11/15] tracing/filters: Fix error positions in filter parser Masami Hiramatsu (Google)
2026-10-29 1:39 ` [PATCH v4 12/15] tracing/filters: Fix error position for function filter operations Masami Hiramatsu (Google)
2026-10-29 1:39 ` [PATCH v4 13/15] tracing/filters: Fix error positions for CPUS mask parsing Masami Hiramatsu (Google)
2026-10-29 1:39 ` [PATCH v4 14/15] tracing/filters: Fix error position for within filter operator check Masami Hiramatsu (Google)
2026-10-29 1:39 ` Masami Hiramatsu (Google) [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=179323798449.740114.5416715723328926616.stgit@devnote2 \
--to=mhiramat@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=rostedt@goodmis.org \
--cc=shuah@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.