perf record: Enable arbitrary event names thru name= modifier
Enable complex event names containing [.:=,] symbols to be encoded into Perf trace using name= modifier e.g. like this: perf record -e cpu/name=\'OFFCORE_RESPONSE:request=DEMAND_RFO:response=L3_HIT.SNOOP_HITM\',\ period=0x3567e0,event=0x3c,cmask=0x1/Duk ./futex Below is how it looks like in the report output. Please note explicit escaped quoting at cmdline string in the header so that thestring can be directly reused for another collection in shell: perf report --header # ======== ... # cmdline : /root/abudanko/kernel/tip/tools/perf/perf record -v -e cpu/name=\'OFFCORE_RESPONSE:request=DEMAND_RFO:response=L3_HIT.SNOOP_HITM\',period=0x3567e0,event=0x3c,cmask=0x1/Duk ./futex # event : name = OFFCORE_RESPONSE:request=DEMAND_RFO:response=L3_HIT.SNOOP_HITM, , type = 4, size = 112, config = 0x100003c, { sample_period, sample_freq } = 3500000, sample_type = IP|TID|TIME, disabled = 1, inh ... # ======== # # # Total Lost Samples: 0 # # Samples: 24K of event 'OFFCORE_RESPONSE:request=DEMAND_RFO:response=L3_HIT.SNOOP_HITM' # Event count (approx.): 86492000000 # # Overhead Command Shared Object Symbol # ........ ....... ................ .............................................. # 14.75% futex [kernel.vmlinux] [k] __entry_trampoline_start ... perf stat -e cpu/name=\'CPU_CLK_UNHALTED.THREAD:cmask=0x1\',period=0x3567e0,event=0x3c,cmask=0x1/Duk ./futex 10000000 process context switches in 16678890291ns (1667.9ns/ctxsw) Performance counter stats for './futex': 88,095,770,571 CPU_CLK_UNHALTED.THREAD:cmask=0x1 16.679542407 seconds time elapsed Signed-off-by: Alexey Budankov <alexey.budankov@linux.intel.com> Acked-by: Andi Kleen <ak@linux.intel.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/c194b060-761d-0d50-3b21-bb4ed680002d@linux.intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
aef4feace2
commit
f92da71280
4 changed files with 43 additions and 4 deletions
|
@ -124,7 +124,11 @@ The available PMUs and their raw parameters can be listed with
|
||||||
For example the raw event "LSD.UOPS" core pmu event above could
|
For example the raw event "LSD.UOPS" core pmu event above could
|
||||||
be specified as
|
be specified as
|
||||||
|
|
||||||
perf stat -e cpu/event=0xa8,umask=0x1,name=LSD.UOPS_CYCLES,cmask=1/ ...
|
perf stat -e cpu/event=0xa8,umask=0x1,name=LSD.UOPS_CYCLES,cmask=0x1/ ...
|
||||||
|
|
||||||
|
or using extended name syntax
|
||||||
|
|
||||||
|
perf stat -e cpu/event=0xa8,umask=0x1,cmask=0x1,name=\'LSD.UOPS_CYCLES:cmask=0x1\'/ ...
|
||||||
|
|
||||||
PER SOCKET PMUS
|
PER SOCKET PMUS
|
||||||
---------------
|
---------------
|
||||||
|
|
|
@ -57,6 +57,9 @@ OPTIONS
|
||||||
FP mode, "dwarf" for DWARF mode, "lbr" for LBR mode and
|
FP mode, "dwarf" for DWARF mode, "lbr" for LBR mode and
|
||||||
"no" for disable callgraph.
|
"no" for disable callgraph.
|
||||||
- 'stack-size': user stack size for dwarf mode
|
- 'stack-size': user stack size for dwarf mode
|
||||||
|
- 'name' : User defined event name. Single quotes (') may be used to
|
||||||
|
escape symbols in the name from parsing by shell and tool
|
||||||
|
like this: name=\'CPU_CLK_UNHALTED.THREAD:cmask=0x1\'.
|
||||||
|
|
||||||
See the linkperf:perf-list[1] man page for more parameters.
|
See the linkperf:perf-list[1] man page for more parameters.
|
||||||
|
|
||||||
|
|
|
@ -1459,8 +1459,24 @@ static void print_cmdline(struct feat_fd *ff, FILE *fp)
|
||||||
|
|
||||||
fprintf(fp, "# cmdline : ");
|
fprintf(fp, "# cmdline : ");
|
||||||
|
|
||||||
for (i = 0; i < nr; i++)
|
for (i = 0; i < nr; i++) {
|
||||||
fprintf(fp, "%s ", ff->ph->env.cmdline_argv[i]);
|
char *argv_i = strdup(ff->ph->env.cmdline_argv[i]);
|
||||||
|
if (!argv_i) {
|
||||||
|
fprintf(fp, "%s ", ff->ph->env.cmdline_argv[i]);
|
||||||
|
} else {
|
||||||
|
char *mem = argv_i;
|
||||||
|
do {
|
||||||
|
char *quote = strchr(argv_i, '\'');
|
||||||
|
if (!quote)
|
||||||
|
break;
|
||||||
|
*quote++ = '\0';
|
||||||
|
fprintf(fp, "%s\\\'", argv_i);
|
||||||
|
argv_i = quote;
|
||||||
|
} while (1);
|
||||||
|
fprintf(fp, "%s ", argv_i);
|
||||||
|
free(mem);
|
||||||
|
}
|
||||||
|
}
|
||||||
fputc('\n', fp);
|
fputc('\n', fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,21 @@ static int str(yyscan_t scanner, int token)
|
||||||
YYSTYPE *yylval = parse_events_get_lval(scanner);
|
YYSTYPE *yylval = parse_events_get_lval(scanner);
|
||||||
char *text = parse_events_get_text(scanner);
|
char *text = parse_events_get_text(scanner);
|
||||||
|
|
||||||
yylval->str = strdup(text);
|
if (text[0] != '\'') {
|
||||||
|
yylval->str = strdup(text);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* If a text tag specified on the command line
|
||||||
|
* contains opening single quite ' then it is
|
||||||
|
* expected that the tag ends with single quote
|
||||||
|
* as well, like this:
|
||||||
|
* name=\'CPU_CLK_UNHALTED.THREAD:cmask=1\'
|
||||||
|
* quotes need to be escaped to bypass shell
|
||||||
|
* processing.
|
||||||
|
*/
|
||||||
|
yylval->str = strndup(&text[1], strlen(text) - 2);
|
||||||
|
}
|
||||||
|
|
||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,6 +190,7 @@ num_dec [0-9]+
|
||||||
num_hex 0x[a-fA-F0-9]+
|
num_hex 0x[a-fA-F0-9]+
|
||||||
num_raw_hex [a-fA-F0-9]+
|
num_raw_hex [a-fA-F0-9]+
|
||||||
name [a-zA-Z_*?\[\]][a-zA-Z0-9_*?.\[\]]*
|
name [a-zA-Z_*?\[\]][a-zA-Z0-9_*?.\[\]]*
|
||||||
|
name_tag [\'][a-zA-Z_*?\[\]][a-zA-Z0-9_*?\-,\.\[\]:=]*[\']
|
||||||
name_minus [a-zA-Z_*?][a-zA-Z0-9\-_*?.:]*
|
name_minus [a-zA-Z_*?][a-zA-Z0-9\-_*?.:]*
|
||||||
drv_cfg_term [a-zA-Z0-9_\.]+(=[a-zA-Z0-9_*?\.:]+)?
|
drv_cfg_term [a-zA-Z0-9_\.]+(=[a-zA-Z0-9_*?\.:]+)?
|
||||||
/* If you add a modifier you need to update check_modifier() */
|
/* If you add a modifier you need to update check_modifier() */
|
||||||
|
@ -344,6 +359,7 @@ r{num_raw_hex} { return raw(yyscanner); }
|
||||||
{bpf_object} { if (!isbpf(yyscanner)) { USER_REJECT }; return str(yyscanner, PE_BPF_OBJECT); }
|
{bpf_object} { if (!isbpf(yyscanner)) { USER_REJECT }; return str(yyscanner, PE_BPF_OBJECT); }
|
||||||
{bpf_source} { if (!isbpf(yyscanner)) { USER_REJECT }; return str(yyscanner, PE_BPF_SOURCE); }
|
{bpf_source} { if (!isbpf(yyscanner)) { USER_REJECT }; return str(yyscanner, PE_BPF_SOURCE); }
|
||||||
{name} { return pmu_str_check(yyscanner); }
|
{name} { return pmu_str_check(yyscanner); }
|
||||||
|
{name_tag} { return str(yyscanner, PE_NAME); }
|
||||||
"/" { BEGIN(config); return '/'; }
|
"/" { BEGIN(config); return '/'; }
|
||||||
- { return '-'; }
|
- { return '-'; }
|
||||||
, { BEGIN(event); return ','; }
|
, { BEGIN(event); return ','; }
|
||||||
|
|
Loading…
Reference in a new issue