Commit 01bd8efc authored by Song Liu's avatar Song Liu Committed by Arnaldo Carvalho de Melo

perf stat: Introduce ':b' modifier

Introduce 'b' modifier to event parser, which means use BPF program to
manage this event. This is the same as --bpf-counters option, but only
applies to this event. For example,

  perf stat -e cycles:b,cs               # use bpf for cycles, but not cs
  perf stat -e cycles,cs --bpf-counters  # use bpf for both cycles and cs
Suggested-by: default avatarJiri Olsa <jolsa@kernel.org>
Signed-off-by: default avatarSong Liu <song@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Song Liu <songliubraving@fb.com>
Link: https://lore.kernel.org/r/20210425214333.1090950-5-song@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 112cb561
...@@ -790,7 +790,7 @@ int bpf_counter__load(struct evsel *evsel, struct target *target) ...@@ -790,7 +790,7 @@ int bpf_counter__load(struct evsel *evsel, struct target *target)
{ {
if (target->bpf_str) if (target->bpf_str)
evsel->bpf_counter_ops = &bpf_program_profiler_ops; evsel->bpf_counter_ops = &bpf_program_profiler_ops;
else if (target->use_bpf || else if (target->use_bpf || evsel->bpf_counter ||
evsel__match_bpf_counter_events(evsel->name)) evsel__match_bpf_counter_events(evsel->name))
evsel->bpf_counter_ops = &bperf_ops; evsel->bpf_counter_ops = &bperf_ops;
......
...@@ -82,6 +82,7 @@ struct evsel { ...@@ -82,6 +82,7 @@ struct evsel {
bool auto_merge_stats; bool auto_merge_stats;
bool collect_stat; bool collect_stat;
bool weak_group; bool weak_group;
bool bpf_counter;
int bpf_fd; int bpf_fd;
struct bpf_object *bpf_obj; struct bpf_object *bpf_obj;
}; };
......
...@@ -1804,6 +1804,7 @@ struct event_modifier { ...@@ -1804,6 +1804,7 @@ struct event_modifier {
int pinned; int pinned;
int weak; int weak;
int exclusive; int exclusive;
int bpf_counter;
}; };
static int get_event_modifier(struct event_modifier *mod, char *str, static int get_event_modifier(struct event_modifier *mod, char *str,
...@@ -1824,6 +1825,7 @@ static int get_event_modifier(struct event_modifier *mod, char *str, ...@@ -1824,6 +1825,7 @@ static int get_event_modifier(struct event_modifier *mod, char *str,
int exclude = eu | ek | eh; int exclude = eu | ek | eh;
int exclude_GH = evsel ? evsel->exclude_GH : 0; int exclude_GH = evsel ? evsel->exclude_GH : 0;
int weak = 0; int weak = 0;
int bpf_counter = 0;
memset(mod, 0, sizeof(*mod)); memset(mod, 0, sizeof(*mod));
...@@ -1867,6 +1869,8 @@ static int get_event_modifier(struct event_modifier *mod, char *str, ...@@ -1867,6 +1869,8 @@ static int get_event_modifier(struct event_modifier *mod, char *str,
exclusive = 1; exclusive = 1;
} else if (*str == 'W') { } else if (*str == 'W') {
weak = 1; weak = 1;
} else if (*str == 'b') {
bpf_counter = 1;
} else } else
break; break;
...@@ -1898,6 +1902,7 @@ static int get_event_modifier(struct event_modifier *mod, char *str, ...@@ -1898,6 +1902,7 @@ static int get_event_modifier(struct event_modifier *mod, char *str,
mod->sample_read = sample_read; mod->sample_read = sample_read;
mod->pinned = pinned; mod->pinned = pinned;
mod->weak = weak; mod->weak = weak;
mod->bpf_counter = bpf_counter;
mod->exclusive = exclusive; mod->exclusive = exclusive;
return 0; return 0;
...@@ -1912,7 +1917,7 @@ static int check_modifier(char *str) ...@@ -1912,7 +1917,7 @@ static int check_modifier(char *str)
char *p = str; char *p = str;
/* The sizeof includes 0 byte as well. */ /* The sizeof includes 0 byte as well. */
if (strlen(str) > (sizeof("ukhGHpppPSDIWe") - 1)) if (strlen(str) > (sizeof("ukhGHpppPSDIWeb") - 1))
return -1; return -1;
while (*p) { while (*p) {
...@@ -1953,6 +1958,7 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add) ...@@ -1953,6 +1958,7 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add)
evsel->sample_read = mod.sample_read; evsel->sample_read = mod.sample_read;
evsel->precise_max = mod.precise_max; evsel->precise_max = mod.precise_max;
evsel->weak_group = mod.weak; evsel->weak_group = mod.weak;
evsel->bpf_counter = mod.bpf_counter;
if (evsel__is_group_leader(evsel)) { if (evsel__is_group_leader(evsel)) {
evsel->core.attr.pinned = mod.pinned; evsel->core.attr.pinned = mod.pinned;
......
...@@ -210,7 +210,7 @@ name_tag [\'][a-zA-Z_*?\[\]][a-zA-Z0-9_*?\-,\.\[\]:=]*[\'] ...@@ -210,7 +210,7 @@ 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() */
modifier_event [ukhpPGHSDIWe]+ modifier_event [ukhpPGHSDIWeb]+
modifier_bp [rwx]{1,3} modifier_bp [rwx]{1,3}
%% %%
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment