Skip to content

Commit

Permalink
perf stat: Introduce ':b' modifier
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Song Liu authored and Arnaldo Carvalho de Melo committed Apr 29, 2021
1 parent 112cb56 commit 01bd8ef
Show file tree
Hide file tree
Showing 4 changed files with 10 additions and 3 deletions.
2 changes: 1 addition & 1 deletion tools/perf/util/bpf_counter.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
1 change: 1 addition & 0 deletions tools/perf/util/evsel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand Down
8 changes: 7 additions & 1 deletion tools/perf/util/parse-events.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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));

Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;
Expand All @@ -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) {
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion tools/perf/util/parse-events.l
Original file line number Diff line number Diff line change
Expand Up @@ -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}

%%
Expand Down

0 comments on commit 01bd8ef

Please sign in to comment.