mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
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: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Song 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.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
112cb56164
commit
01bd8efcec
@ -790,7 +790,7 @@ int bpf_counter__load(struct evsel *evsel, struct target *target)
|
||||
{
|
||||
if (target->bpf_str)
|
||||
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->bpf_counter_ops = &bperf_ops;
|
||||
|
||||
|
@ -82,6 +82,7 @@ struct evsel {
|
||||
bool auto_merge_stats;
|
||||
bool collect_stat;
|
||||
bool weak_group;
|
||||
bool bpf_counter;
|
||||
int bpf_fd;
|
||||
struct bpf_object *bpf_obj;
|
||||
};
|
||||
|
@ -1804,6 +1804,7 @@ struct event_modifier {
|
||||
int pinned;
|
||||
int weak;
|
||||
int exclusive;
|
||||
int bpf_counter;
|
||||
};
|
||||
|
||||
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_GH = evsel ? evsel->exclude_GH : 0;
|
||||
int weak = 0;
|
||||
int bpf_counter = 0;
|
||||
|
||||
memset(mod, 0, sizeof(*mod));
|
||||
|
||||
@ -1867,6 +1869,8 @@ static int get_event_modifier(struct event_modifier *mod, char *str,
|
||||
exclusive = 1;
|
||||
} else if (*str == 'W') {
|
||||
weak = 1;
|
||||
} else if (*str == 'b') {
|
||||
bpf_counter = 1;
|
||||
} else
|
||||
break;
|
||||
|
||||
@ -1898,6 +1902,7 @@ static int get_event_modifier(struct event_modifier *mod, char *str,
|
||||
mod->sample_read = sample_read;
|
||||
mod->pinned = pinned;
|
||||
mod->weak = weak;
|
||||
mod->bpf_counter = bpf_counter;
|
||||
mod->exclusive = exclusive;
|
||||
|
||||
return 0;
|
||||
@ -1912,7 +1917,7 @@ static int check_modifier(char *str)
|
||||
char *p = str;
|
||||
|
||||
/* The sizeof includes 0 byte as well. */
|
||||
if (strlen(str) > (sizeof("ukhGHpppPSDIWe") - 1))
|
||||
if (strlen(str) > (sizeof("ukhGHpppPSDIWeb") - 1))
|
||||
return -1;
|
||||
|
||||
while (*p) {
|
||||
@ -1953,6 +1958,7 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add)
|
||||
evsel->sample_read = mod.sample_read;
|
||||
evsel->precise_max = mod.precise_max;
|
||||
evsel->weak_group = mod.weak;
|
||||
evsel->bpf_counter = mod.bpf_counter;
|
||||
|
||||
if (evsel__is_group_leader(evsel)) {
|
||||
evsel->core.attr.pinned = mod.pinned;
|
||||
|
@ -210,7 +210,7 @@ name_tag [\'][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_*?\.:]+)?
|
||||
/* If you add a modifier you need to update check_modifier() */
|
||||
modifier_event [ukhpPGHSDIWe]+
|
||||
modifier_event [ukhpPGHSDIWeb]+
|
||||
modifier_bp [rwx]{1,3}
|
||||
|
||||
%%
|
||||
|
Loading…
Reference in New Issue
Block a user