From patchwork Sat Aug 29 04:21:37 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Nan X-Patchwork-Id: 52819 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-lb0-f200.google.com (mail-lb0-f200.google.com [209.85.217.200]) by patches.linaro.org (Postfix) with ESMTPS id 31BD720503 for ; Sat, 29 Aug 2015 04:23:57 +0000 (UTC) Received: by lbcue2 with SMTP id ue2sf22497678lbc.1 for ; Fri, 28 Aug 2015 21:23:56 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-type:sender:precedence :list-id:x-original-sender:x-original-authentication-results :mailing-list:list-post:list-help:list-archive:list-unsubscribe; bh=s8jSKCfsMYJAIHveXwn2Zt43QCsfiMcjFybaDhsBYmw=; b=hSpUDpRoSx+PbAwowh4H7JUmxsoHhyFsZNEtHHv8WHSZaSVTNrNV07j/zdxACOnoEs PUhjt8NCM1td1+HC8EEpfw1PnBCBXn0uqBfzhnpfoKXeGC1cu2cQfCp5x6h0aR5LiD/F Qa+P2YC4uG58nEgnHXuXdInsCxLzOy6REEHzDa9NgevY0wlsFarbbBaGCCGHHhkMZtNz mZdTb45MfqJUvOkRJtA7XVyhQPAb8W9n4ePW465GhFbGq2zBBdrywUcWF2TktVeBvxU4 BQeN+q3c09K4bnJNqY9e+iV+OMXfts2jWwWfzQtjnVYwDvVBtxxfMffe051etg8LkW44 ieUw== X-Gm-Message-State: ALoCoQl8kxML1jHeyHkwkUbqDS8PfFH3zDjyg7we8btPdRX7m0o4Ys/HDyTXZiIBwfN6tY7ipA6D X-Received: by 10.112.170.67 with SMTP id ak3mr3575335lbc.6.1440822236171; Fri, 28 Aug 2015 21:23:56 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.21.133 with SMTP id v5ls271961lae.63.gmail; Fri, 28 Aug 2015 21:23:55 -0700 (PDT) X-Received: by 10.112.219.70 with SMTP id pm6mr6064400lbc.41.1440822235866; Fri, 28 Aug 2015 21:23:55 -0700 (PDT) Received: from mail-la0-f47.google.com (mail-la0-f47.google.com. [209.85.215.47]) by mx.google.com with ESMTPS id lt3si7654816lac.124.2015.08.28.21.23.55 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 28 Aug 2015 21:23:55 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.47 as permitted sender) client-ip=209.85.215.47; Received: by labnh1 with SMTP id nh1so18617773lab.3 for ; Fri, 28 Aug 2015 21:23:55 -0700 (PDT) X-Received: by 10.152.28.193 with SMTP id d1mr6199438lah.72.1440822235726; Fri, 28 Aug 2015 21:23:55 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.151.194 with SMTP id us2csp267456lbb; Fri, 28 Aug 2015 21:23:54 -0700 (PDT) X-Received: by 10.66.122.73 with SMTP id lq9mr20393991pab.61.1440822234501; Fri, 28 Aug 2015 21:23:54 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id fl4si13359526pdb.129.2015.08.28.21.23.53; Fri, 28 Aug 2015 21:23:54 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752444AbbH2EXk (ORCPT + 28 others); Sat, 29 Aug 2015 00:23:40 -0400 Received: from szxga03-in.huawei.com ([119.145.14.66]:3615 "EHLO szxga03-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752290AbbH2EXh (ORCPT ); Sat, 29 Aug 2015 00:23:37 -0400 Received: from 172.24.1.50 (EHLO szxeml431-hub.china.huawei.com) ([172.24.1.50]) by szxrg03-dlp.huawei.com (MOS 4.4.3-GA FastPath queued) with ESMTP id BLW04285; Sat, 29 Aug 2015 12:23:03 +0800 (CST) Received: from linux-4hy3.site (10.107.193.248) by szxeml431-hub.china.huawei.com (10.82.67.208) with Microsoft SMTP Server id 14.3.235.1; Sat, 29 Aug 2015 12:22:53 +0800 From: Wang Nan To: , , CC: , , , Wang Nan , Brendan Gregg , Daniel Borkmann , David Ahern , "He Kuang" , Jiri Olsa , Kaixu Xia , Masami Hiramatsu , Namhyung Kim , Peter Zijlstra Subject: [PATCH 03/31] perf tools: Introduce dummy evsel Date: Sat, 29 Aug 2015 04:21:37 +0000 Message-ID: <1440822125-52691-4-git-send-email-wangnan0@huawei.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1440822125-52691-1-git-send-email-wangnan0@huawei.com> References: <1440822125-52691-1-git-send-email-wangnan0@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.107.193.248] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020203.55E133A7.00C1, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2013-05-26 15:14:31, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: f7a6f8d3a18335ef4d00ddc319e48210 Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: wangnan0@huawei.com X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.47 as permitted sender) smtp.mailfrom=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , This patch allows linking dummy evsel onto evlist as a placeholder. It is for following patch which allows passing BPF object using '--event object.o'. Doesn't link other event selectors, if passing a BPF object file to '--event', nothing is linked onto evlist. Instead, events described in BPF object file are probed and linked in a delayed manner because we want do all probing work together. Therefore, evsel for events in BPF object would be linked at the end of evlist. Which causes a small problem that, if passing '--filter' setting after object file, the filter option won't be correctly applied to those events. This patch links dummy onto evlist, so following --filter can be collected by the dummy evsel. For this reason dummy evsels are set to PERF_TYPE_TRACEPOINT. Due to the possibility of existance of dummy evsel, perf_evlist__purge_dummy() must be called right after parse_options(). This patch adds it to record, top, trace and stat builtin commands. Further patch moves it down after real BPF events are processed with. Signed-off-by: Wang Nan Cc: Arnaldo Carvalho de Melo Cc: Alexei Starovoitov Cc: Brendan Gregg Cc: Daniel Borkmann Cc: David Ahern Cc: He Kuang Cc: Jiri Olsa Cc: Kaixu Xia Cc: Masami Hiramatsu Cc: Namhyung Kim Cc: Peter Zijlstra Cc: Zefan Li Cc: pi3orama@163.com Link: http://lkml.kernel.org/r/1440742821-44548-4-git-send-email-wangnan0@huawei.com --- tools/perf/builtin-record.c | 2 ++ tools/perf/builtin-stat.c | 1 + tools/perf/builtin-top.c | 1 + tools/perf/builtin-trace.c | 1 + tools/perf/util/evlist.c | 19 +++++++++++++++++++ tools/perf/util/evlist.h | 1 + tools/perf/util/evsel.c | 32 ++++++++++++++++++++++++++++++++ tools/perf/util/evsel.h | 6 ++++++ tools/perf/util/parse-events.c | 25 +++++++++++++++++++++---- 9 files changed, 84 insertions(+), 4 deletions(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index a660022..81829de 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -1112,6 +1112,8 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused) argc = parse_options(argc, argv, record_options, record_usage, PARSE_OPT_STOP_AT_NON_OPTION); + perf_evlist__purge_dummy(rec->evlist); + if (!argc && target__none(&rec->opts.target)) usage_with_options(record_usage, record_options); diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 7aa039b..99b62f1 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1208,6 +1208,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused) argc = parse_options(argc, argv, options, stat_usage, PARSE_OPT_STOP_AT_NON_OPTION); + perf_evlist__purge_dummy(evsel_list); interval = stat_config.interval; diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 8c465c8..246203b 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c @@ -1198,6 +1198,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused) perf_config(perf_top_config, &top); argc = parse_options(argc, argv, options, top_usage, 0); + perf_evlist__purge_dummy(top.evlist); if (argc) usage_with_options(top_usage, options); diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 4e3abba..57712b9 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -3099,6 +3099,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused) argc = parse_options_subcommand(argc, argv, trace_options, trace_subcommands, trace_usage, PARSE_OPT_STOP_AT_NON_OPTION); + perf_evlist__purge_dummy(trace.evlist); if (trace.trace_pgfaults) { trace.opts.sample_address = true; diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 8d00039..8a4e64d 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -1696,3 +1696,22 @@ void perf_evlist__set_tracking_event(struct perf_evlist *evlist, tracking_evsel->tracking = true; } + +void perf_evlist__purge_dummy(struct perf_evlist *evlist) +{ + struct perf_evsel *pos, *n; + + /* + * Remove all dummy events. + * During linking, we don't touch anything except link + * it into evlist. As a result, we don't + * need to adjust evlist->nr_entries during removal. + */ + + evlist__for_each_safe(evlist, n, pos) { + if (perf_evsel__is_dummy(pos)) { + list_del_init(&pos->node); + perf_evsel__delete(pos); + } + } +} diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index b39a619..7f15727 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -181,6 +181,7 @@ bool perf_evlist__valid_read_format(struct perf_evlist *evlist); void perf_evlist__splice_list_tail(struct perf_evlist *evlist, struct list_head *list, int nr_entries); +void perf_evlist__purge_dummy(struct perf_evlist *evlist); static inline struct perf_evsel *perf_evlist__first(struct perf_evlist *evlist) { diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index bac25f4..01267f4 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -213,6 +213,7 @@ void perf_evsel__init(struct perf_evsel *evsel, evsel->sample_size = __perf_evsel__sample_size(attr->sample_type); perf_evsel__calc_id_pos(evsel); evsel->cmdline_group_boundary = false; + evsel->is_dummy = false; } struct perf_evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx) @@ -225,6 +226,37 @@ struct perf_evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx) return evsel; } +struct perf_evsel *perf_evsel__new_dummy(const char *name) +{ + struct perf_evsel *evsel = zalloc(perf_evsel__object.size); + + if (!evsel) + return NULL; + + /* + * Don't need call perf_evsel__init() for dummy evsel. + * Keep it simple. + */ + evsel->name = strdup(name); + if (!evsel->name) + goto out_free; + + INIT_LIST_HEAD(&evsel->node); + INIT_LIST_HEAD(&evsel->config_terms); + + evsel->cmdline_group_boundary = false; + /* + * Set dummy evsel as TRACEPOINT event so it can collect filter + * options. + */ + evsel->attr.type = PERF_TYPE_TRACEPOINT; + evsel->is_dummy = true; + return evsel; +out_free: + free(evsel); + return NULL; +} + struct perf_evsel *perf_evsel__newtp_idx(const char *sys, const char *name, int idx) { struct perf_evsel *evsel = zalloc(perf_evsel__object.size); diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 298e6bb..0b8e47d 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -118,6 +118,7 @@ struct perf_evsel { struct perf_evsel *leader; char *group_name; bool cmdline_group_boundary; + bool is_dummy; struct list_head config_terms; }; @@ -153,6 +154,11 @@ int perf_evsel__object_config(size_t object_size, void (*fini)(struct perf_evsel *evsel)); struct perf_evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx); +struct perf_evsel *perf_evsel__new_dummy(const char *name); +static inline bool perf_evsel__is_dummy(struct perf_evsel *evsel) +{ + return evsel->is_dummy; +} static inline struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr) { diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 14cd7e3..71d91fb 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1141,7 +1141,7 @@ int parse_events(struct perf_evlist *evlist, const char *str, perf_pmu__parse_cleanup(); if (!ret) { int entries = data.idx - evlist->nr_entries; - struct perf_evsel *last; + struct perf_evsel *last = NULL; if (!list_empty(&data.list)) { last = list_entry(data.list.prev, @@ -1149,8 +1149,25 @@ int parse_events(struct perf_evlist *evlist, const char *str, last->cmdline_group_boundary = true; } - perf_evlist__splice_list_tail(evlist, &data.list, entries); - evlist->nr_groups += data.nr_groups; + if (last && perf_evsel__is_dummy(last)) { + if (!list_is_singular(&data.list)) { + parse_events_evlist_error(&data, 0, + "Dummy evsel error: not on a singular list"); + return -1; + } + /* + * We are introducing a dummy event. Don't touch + * anything, just link it. + * + * Don't use perf_evlist__splice_list_tail() since + * it alerts evlist->nr_entries, which affect header + * of resulting perf.data. + */ + list_splice_tail(&data.list, &evlist->entries); + } else { + perf_evlist__splice_list_tail(evlist, &data.list, entries); + evlist->nr_groups += data.nr_groups; + } return 0; } @@ -1256,7 +1273,7 @@ foreach_evsel_in_last_glob(struct perf_evlist *evlist, struct perf_evsel *last = NULL; int err; - if (evlist->nr_entries > 0) + if (!list_empty(&evlist->entries)) last = perf_evlist__last(evlist); do {