Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934190AbbEOILD (ORCPT ); Fri, 15 May 2015 04:11:03 -0400 Received: from szxga01-in.huawei.com ([58.251.152.64]:10485 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933570AbbEOIKz (ORCPT ); Fri, 15 May 2015 04:10:55 -0400 From: Wang Nan To: , , , , , , , , , , , CC: , , , Subject: [RFC PATCH v2 35/37] tools perf: add bpf_fd field to evsel and introduce new event syntax. Date: Fri, 15 May 2015 07:51:28 +0000 Message-ID: <1431676290-1230-36-git-send-email-wangnan0@huawei.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1431676290-1230-1-git-send-email-wangnan0@huawei.com> References: <1431676290-1230-1-git-send-email-wangnan0@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.197.200] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5668 Lines: 178 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 --- 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_fd { return PE_BPFFD; } +"|" { BEGIN(INITIAL); return '|'; } +} + { {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 PE_VALUE %type PE_VALUE_SYM_HW %type PE_VALUE_SYM_SW @@ -62,12 +63,14 @@ static inc_group_count(struct list_head *list, %type PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT %type value_sym %type event_config +%type event_bpf_config %type event_term %type event_pmu %type event_legacy_symbol %type event_legacy_cache %type event_legacy_mem %type event_legacy_tracepoint +%type event_legacy_tracepoint_event %type event_legacy_numeric %type event_legacy_raw %type 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 majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/