Skip to content

Commit

Permalink
perf bpf-filter: Fix a parsing error with comma
Browse files Browse the repository at this point in the history
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: 91e8843 ("perf bpf-filter: Support filtering on cgroups")
Reported-by: Sally Shi <sshii@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
  • Loading branch information
Namhyung Kim committed Mar 25, 2025
1 parent 9daa05c commit 35d13f8
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 3 deletions.
4 changes: 2 additions & 2 deletions tools/perf/tests/shell/record_bpf_filter.sh
Original file line number Diff line number Diff line change
Expand Up @@ -89,15 +89,15 @@ test_bpf_filter_fail() {
test_bpf_filter_group() {
echo "Group bpf-filter test"

if ! perf record -e task-clock --filter 'period > 1000 || ip > 0' \
if ! perf record -e task-clock --filter 'period > 1000, ip > 0' \
-o /dev/null true 2>/dev/null
then
echo "Group bpf-filter test [Failed should succeed]"
err=1
return
fi

if ! perf record -e task-clock --filter 'cpu > 0 || ip > 0' \
if ! perf record -e task-clock --filter 'period > 1000 , cpu > 0 || ip > 0' \
-o /dev/null true 2>&1 | grep -q PERF_SAMPLE_CPU
then
echo "Group bpf-filter test [Failed forbidden CPU]"
Expand Down
2 changes: 1 addition & 1 deletion tools/perf/util/bpf-filter.l
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ static int path_or_error(void)
num_dec [0-9]+
num_hex 0[Xx][0-9a-fA-F]+
space [ \t]+
path [^ \t\n]+
path [^ \t\n,]+
ident [_a-zA-Z][_a-zA-Z0-9]+

%%
Expand Down

0 comments on commit 35d13f8

Please sign in to comment.