Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf bpf-filter: Fix a parsing error with comma

The previous change to support cgroup filters introduced a bug that
pathname can include commas. It confused the lexer to treat an item and
the trailing comma as a single token. And it resulted in a parse error:

$ sudo perf record -e cycles:P --filter 'period > 0, ip > 64' -- true
perf_bpf_filter: Error: Unexpected item: 0,
perf_bpf_filter: syntax error, unexpected BFT_ERROR, expecting BFT_NUM

Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]

--filter <filter>
event filter

It should get "0" and "," separately.

An easiest fix would be to remove "," from the possible pathname
characters. As it's for cgroup names, probably ok to assume it won't
have commas in the pathname.

I found that the existing BPF filtering test didn't have any complex
filter condition with commas. Let's update the group filter test which
is supposed to test filter combinations like this.

Link: https://lore.kernel.org/r/20250307220922.434319-1-namhyung@kernel.org
Fixes: 91e88437d5156b20 ("perf bpf-filter: Support filtering on cgroups")
Reported-by: Sally Shi <sshii@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>

+3 -3
+2 -2
tools/perf/tests/shell/record_bpf_filter.sh
··· 89 89 test_bpf_filter_group() { 90 90 echo "Group bpf-filter test" 91 91 92 - if ! perf record -e task-clock --filter 'period > 1000 || ip > 0' \ 92 + if ! perf record -e task-clock --filter 'period > 1000, ip > 0' \ 93 93 -o /dev/null true 2>/dev/null 94 94 then 95 95 echo "Group bpf-filter test [Failed should succeed]" ··· 97 97 return 98 98 fi 99 99 100 - if ! perf record -e task-clock --filter 'cpu > 0 || ip > 0' \ 100 + if ! perf record -e task-clock --filter 'period > 1000 , cpu > 0 || ip > 0' \ 101 101 -o /dev/null true 2>&1 | grep -q PERF_SAMPLE_CPU 102 102 then 103 103 echo "Group bpf-filter test [Failed forbidden CPU]"
+1 -1
tools/perf/util/bpf-filter.l
··· 76 76 num_dec [0-9]+ 77 77 num_hex 0[Xx][0-9a-fA-F]+ 78 78 space [ \t]+ 79 - path [^ \t\n]+ 79 + path [^ \t\n,]+ 80 80 ident [_a-zA-Z][_a-zA-Z0-9]+ 81 81 82 82 %%