This patch adds a bpf_fd field to 'struct evsel' and instroduces new syntax for bpf use. Following patches will generate cmdline for cmd_record, add '-e' options to enable tracing on events set in eBPF object files. By using the newly introduced 'bpf_wrapper', this patch ensures that the new '|bpf_fd=%d|' syntax is hidden to user, only internal use is valid.
Signed-off-by: Wang Nan <wangn...@huawei.com> --- tools/perf/util/evsel.c | 1 + tools/perf/util/evsel.h | 1 + tools/perf/util/parse-events.c | 19 +++++++++++++++++++ tools/perf/util/parse-events.h | 3 +++ tools/perf/util/parse-events.l | 8 +++++++- tools/perf/util/parse-events.y | 21 +++++++++++++++++++++ 6 files changed, 52 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 33e3fd8..04d60a7 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -205,6 +205,7 @@ void perf_evsel__init(struct perf_evsel *evsel, evsel->leader = evsel; evsel->unit = ""; evsel->scale = 1.0; + evsel->bpf_fd = -1; INIT_LIST_HEAD(&evsel->node); perf_evsel__object.init(evsel); evsel->sample_size = __perf_evsel__sample_size(attr->sample_type); diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index e486151..ff1f634 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -100,6 +100,7 @@ struct perf_evsel { int sample_read; struct perf_evsel *leader; char *group_name; + int bpf_fd; }; union u64_swap { diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index be06553..5e49ddb 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -471,6 +471,25 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx, return add_tracepoint_event(list, idx, sys, event); } +int parse_events_set_bpf_fd(struct list_head *list, int bpf_fd) +{ + struct perf_evsel *evsel; + + if (!bpf_wrapper) { + fprintf(stderr, + "ERROR:\n" + "\tbpf fd should only be set by 'perf bpf', \n" + "\tuser should never use '|' syntax when \n" + "\tsetup events.\n" + "\n"); + return -EINVAL; + } + + __evlist__for_each(list, evsel) + evsel->bpf_fd = bpf_fd; + return 0; +} + static int parse_breakpoint_type(const char *type, struct perf_event_attr *attr) { diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 52a2dda..427a74a 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -102,6 +102,9 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx, int parse_events_add_numeric(struct list_head *list, int *idx, u32 type, u64 config, struct list_head *head_config); + +int parse_events_set_bpf_fd(struct list_head *list, int bpf_fd); + int parse_events_add_cache(struct list_head *list, int *idx, char *type, char *op_result1, char *op_result2); int parse_events_add_breakpoint(struct list_head *list, int *idx, diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index 8895cf3..0be944a 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -88,7 +88,7 @@ static int term(yyscan_t scanner, int type) %} %x mem -%s config +%s config bpf_config %x event group [^,{}/]*[{][^}]*[}][^,{}/]* @@ -156,6 +156,11 @@ branch_type { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE {name_minus} { return str(yyscanner, PE_NAME); } } +<bpf_config>{ +bpf_fd { return PE_BPFFD; } +"|" { BEGIN(INITIAL); return '|'; } +} + <mem>{ {modifier_bp} { return str(yyscanner, PE_MODIFIER_BP); } : { return ':'; } @@ -230,6 +235,7 @@ r{num_raw_hex} { return raw(yyscanner); } {modifier_event} { return str(yyscanner, PE_MODIFIER_EVENT); } {name} { return pmu_str_check(yyscanner); } "/" { BEGIN(config); return '/'; } +"|" { BEGIN(bpf_config); return '|'; } - { return '-'; } , { BEGIN(event); return ','; } : { return ':'; } diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 72def07..6c99322 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -48,6 +48,7 @@ static inc_group_count(struct list_head *list, %token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP %token PE_ERROR %token PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT +%token PE_BPFFD %type <num> PE_VALUE %type <num> PE_VALUE_SYM_HW %type <num> PE_VALUE_SYM_SW @@ -62,12 +63,14 @@ static inc_group_count(struct list_head *list, %type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT %type <num> value_sym %type <head> event_config +%type <num> event_bpf_config %type <term> event_term %type <head> event_pmu %type <head> event_legacy_symbol %type <head> event_legacy_cache %type <head> event_legacy_mem %type <head> event_legacy_tracepoint +%type <head> event_legacy_tracepoint_event %type <head> event_legacy_numeric %type <head> event_legacy_raw %type <head> event_def @@ -371,6 +374,24 @@ PE_PREFIX_MEM PE_VALUE sep_dc } event_legacy_tracepoint: +event_legacy_tracepoint_event +{ + $$ = $1; +} +| +event_legacy_tracepoint_event '|' event_bpf_config '|' +{ + ABORT_ON(parse_events_set_bpf_fd($1, $3)); + $$ = $1; +} + +event_bpf_config: +PE_BPFFD '=' PE_VALUE +{ + $$ = $3; +} + +event_legacy_tracepoint_event: PE_NAME '-' PE_NAME ':' PE_NAME { struct parse_events_evlist *data = _data; -- 1.8.3.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/