Re: [PATCH 1/3] perf, tools: Handle events including .c and .o

From: Wangnan (F)
Date: Sat Oct 08 2016 - 00:04:56 EST




On 2016/10/7 4:18, Arnaldo Carvalho de Melo wrote:
Em Wed, Oct 05, 2016 at 12:47:10PM -0700, Andi Kleen escreveu:
From: Andi Kleen <ak@xxxxxxxxxxxxxxx>

This is a generic bug fix, but it helps with Sukadev's JSON event tree
where such events can happen.

Any event inclduing a .c/.o/.bpf currently triggers BPF compilation or loading
and then an error. This can happen for some Intel JSON events, which cannot
be used.

Fix the scanner to only match for .o or .c or .bpf at the end.
This will prevent loading multiple BPF scripts separated with comma,
but I assume this is acceptable.
So, I tried it with the example provided in the thread for a previous
version of this patch (IIRC) and it still fails:


[acme@jouet linux]$ perf stat -e '{unc_p_clockticks,unc_p_power_state_occupancy.cores_c0}' -a -I 1000
ERROR: problems with path {unc_p_clockticks,unc_p_power_state_occupancy.c: No such file or directory
event syntax error: '{unc_p_clockticks,unc_p_power_state_occupancy.cores_c0}'
\___ Failed to load {unc_p_clockticks,unc_p_power_state_occupancy.c from source: Error when compiling BPF scriptlet

(add -v to see detail)
Run 'perf list' for a list of valid events

Usage: perf stat [<options>] [<command>]

-e, --event <event> event selector. use 'perf list' to list available events
[acme@jouet linux]$

And with another event that for sure is available on this machine:



[acme@jouet linux]$ perf stat -e '{uops_executed.core_cycles_ge_2}' -I 1000 usleep 10
ERROR: problems with path {uops_executed.c: No such file or directory
event syntax error: '{uops_executed.core_cycles_ge_2}'
\___ Failed to load {uops_executed.c from source: Error when compiling BPF scriptlet

(add -v to see detail)
Run 'perf list' for a list of valid events

Usage: perf stat [<options>] [<command>]

-e, --event <event> event selector. use 'perf list' to list available events
[acme@jouet linux]$


I thought this was due to the Makefile not noticing the change in the .l files, but I made
sure I deleted the build dir and rebuilt from scratch, same problem.

- Arnaldo

Tested again, and thank you for giving us another chance for fixing this :)

The key problem here is not the ending '$' but the leading '{'. Flex's
greedy maching policy makes this problem.

According to the design of parse-events.l, when it see something like
'...{...}...', it first matches a 'group' in '<event>' scope, then rewind
to INITIAL scope to match events in the group. In INITIAL scope, when
it see a '{', flex consume this char and goes back to '<event>' scope
to match next event. It works well before match BPF file path using
unlimited '.*\.c' because '.*' will match the leading '{' in INITIAL
scope without consuming it.

The simplest method for this problem is fixing the '.*' part: like
what we define for 'event', don't match ',', '{' and '}'. Doesn't
like 'event', '/' is required because this is a path.

Will post a patch for it. Please test it again.

Thank you.