From: Namhyung Kim <namhyung@kernel.org>
To: Wang Nan <wangnan0@huawei.com>
Cc: acme@redhat.com, mingo@kernel.org, ast@plumgrid.com,
linux-kernel@vger.kernel.org, lizefan@huawei.com,
pi3orama@163.com, Brendan Gregg <brendan.d.gregg@gmail.com>,
Daniel Borkmann <daniel@iogearbox.net>,
David Ahern <dsahern@gmail.com>, He Kuang <hekuang@huawei.com>,
Jiri Olsa <jolsa@kernel.org>, Kaixu Xia <xiakaixu@huawei.com>,
Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>,
Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: Re: [PATCH 03/31] perf tools: Introduce dummy evsel
Date: Thu, 3 Sep 2015 09:11:08 +0900 [thread overview]
Message-ID: <20150903001108.GA31697@sejong> (raw)
In-Reply-To: <1440822125-52691-4-git-send-email-wangnan0@huawei.com>
Hi,
On Sat, Aug 29, 2015 at 04:21:37AM +0000, Wang Nan wrote:
> 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.
I understand the need of the dummy event. But we already have dummy
event so it's confusing to have similar event IMHO. So what about
using existing dummy event instead? You can save a link to a bpf
object in the dummy evsel (to check it later) and change to allow
setting filter on dummy events IMHO.
>
> 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.
IMHO it'd be better to do this kind of job in a single place -
e.g. perf_evlist__config() ? - so that other commands get benefits
from it easily.
Thanks,
Namhyung
>
> Signed-off-by: Wang Nan <wangnan0@huawei.com>
> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
> Cc: Alexei Starovoitov <ast@plumgrid.com>
> Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
> Cc: Daniel Borkmann <daniel@iogearbox.net>
> Cc: David Ahern <dsahern@gmail.com>
> Cc: He Kuang <hekuang@huawei.com>
> Cc: Jiri Olsa <jolsa@kernel.org>
> Cc: Kaixu Xia <xiakaixu@huawei.com>
> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: Zefan Li <lizefan@huawei.com>
> 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 {
> --
> 2.1.0
>
next prev parent reply other threads:[~2015-09-03 0:26 UTC|newest]
Thread overview: 94+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-29 4:21 [GIT PULL 00/31] perf tools: filtering events using eBPF programs Wang Nan
2015-08-29 4:21 ` [PATCH 01/31] bpf tools: New API to get name from a BPF object Wang Nan
2015-08-29 4:21 ` [PATCH 02/31] perf tools: Don't set cmdline_group_boundary if no evsel is collected Wang Nan
2015-08-31 19:20 ` Arnaldo Carvalho de Melo
2015-09-01 10:37 ` Wangnan (F)
2015-09-01 10:38 ` Jiri Olsa
2015-09-01 12:44 ` Wangnan (F)
2015-09-02 2:53 ` [PATCH] perf tools: Don't set leader if parser doesn't collect an evsel Wang Nan
2015-09-02 3:01 ` Wangnan (F)
2015-09-02 5:57 ` 平松雅巳 / HIRAMATU,MASAMI
2015-09-02 6:09 ` Wangnan (F)
[not found] ` <1441176553-116129-1-git-send-email-wangnan0@huawei.com>
2015-09-02 6:53 ` [PATCH] perf tools: Don't write to evsel if parser doesn't collect evsel Wangnan (F)
2015-09-02 10:31 ` 平松雅巳 / HIRAMATU,MASAMI
2015-09-02 11:54 ` Jiri Olsa
2015-09-02 12:05 ` pi3orama
2015-09-02 12:46 ` Jiri Olsa
2015-09-02 13:55 ` Arnaldo Carvalho de Melo
2015-09-02 14:04 ` pi3orama
2015-09-02 14:43 ` Arnaldo Carvalho de Melo
2015-09-02 22:24 ` pi3orama
2015-08-29 4:21 ` [PATCH 03/31] perf tools: Introduce dummy evsel Wang Nan
2015-08-31 19:38 ` Arnaldo Carvalho de Melo
2015-09-03 0:11 ` Namhyung Kim [this message]
2015-09-03 0:42 ` pi3orama
2015-09-06 5:55 ` [PATCH] perf tools: Allow BPF placeholder dummy events to collect --filter options Wang Nan
2015-09-06 5:56 ` [PATCH] perf tools: Sync setting of real bpf events with placeholder Wang Nan
2015-08-29 4:21 ` [PATCH 04/31] perf tools: Make perf depend on libbpf Wang Nan
2015-08-29 4:21 ` [PATCH 05/31] perf ebpf: Add the libbpf glue Wang Nan
2015-08-29 4:21 ` [PATCH 06/31] perf tools: Enable passing bpf object file to --event Wang Nan
2015-08-29 4:21 ` [PATCH 07/31] perf probe: Attach trace_probe_event with perf_probe_event Wang Nan
2015-09-02 4:32 ` Namhyung Kim
2015-09-02 5:40 ` Wangnan (F)
2015-08-29 4:21 ` [PATCH 08/31] perf record, bpf: Parse and probe eBPF programs probe points Wang Nan
2015-08-29 4:21 ` [PATCH 09/31] perf bpf: Collect 'struct perf_probe_event' for bpf_program Wang Nan
2015-08-29 4:21 ` [PATCH 10/31] perf record: Load all eBPF object into kernel Wang Nan
2015-08-29 4:21 ` [PATCH 11/31] perf tools: Add bpf_fd field to evsel and config it Wang Nan
2015-08-29 4:21 ` [PATCH 12/31] perf tools: Allow filter option to be applied to bof object Wang Nan
2015-08-29 4:21 ` [PATCH 13/31] perf tools: Attach eBPF program to perf event Wang Nan
2015-08-29 4:21 ` [PATCH 14/31] perf tools: Suppress probing messages when probing by BPF loading Wang Nan
2015-09-03 0:20 ` Namhyung Kim
2015-09-03 2:42 ` 平松雅巳 / HIRAMATU,MASAMI
2015-09-03 12:10 ` [PATCH perf/core ] perf-probe: Output the result of adding/deleting probe in buildin-probe Masami Hiramatsu
2015-09-03 12:18 ` 平松雅巳 / HIRAMATU,MASAMI
2015-09-03 17:25 ` Namhyung Kim
2015-09-03 20:28 ` Arnaldo Carvalho de Melo
2015-09-04 1:30 ` 平松雅巳 / HIRAMATU,MASAMI
2015-08-29 4:21 ` [PATCH 15/31] perf record: Add clang options for compiling BPF scripts Wang Nan
2015-08-29 4:21 ` [PATCH 16/31] perf tools: Infrastructure for compiling scriptlets when passing '.c' to --event Wang Nan
2015-08-29 4:21 ` [PATCH 17/31] perf tests: Enforce LLVM test for BPF test Wang Nan
2015-09-01 5:59 ` Wangnan (F)
2015-08-29 4:21 ` [PATCH 18/31] perf test: Add 'perf test BPF' Wang Nan
2015-09-02 12:45 ` Namhyung Kim
2015-09-05 12:21 ` Wang Nan
2015-08-29 4:21 ` [PATCH 19/31] bpf tools: Load a program with different instances using preprocessor Wang Nan
2015-08-29 4:21 ` [PATCH 20/31] perf probe: Reset args and nargs for probe_trace_event when failure Wang Nan
2015-08-29 4:21 ` [PATCH 21/31] perf tools: Move linux/filter.h to tools/include Wang Nan
2015-08-31 20:35 ` Arnaldo Carvalho de Melo
2015-09-01 19:39 ` Arnaldo Carvalho de Melo
2015-09-01 19:47 ` Arnaldo Carvalho de Melo
2015-09-01 21:08 ` pi3orama
2015-09-01 21:43 ` Arnaldo Carvalho de Melo
2015-09-08 14:31 ` [tip:perf/core] perf tools: Copy " tip-bot for He Kuang
2015-08-29 4:21 ` [PATCH 22/31] perf tools: Add BPF_PROLOGUE config options for further patches Wang Nan
2015-08-31 20:39 ` Arnaldo Carvalho de Melo
2015-09-01 6:59 ` Wang Nan
2015-09-01 6:59 ` [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86 Wang Nan
2015-09-01 11:47 ` 平松雅巳 / HIRAMATU,MASAMI
2015-09-01 13:52 ` Wangnan (F)
2015-09-01 14:50 ` Arnaldo Carvalho de Melo
2015-09-01 14:14 ` Arnaldo Carvalho de Melo
2015-09-01 15:54 ` 平松雅巳 / HIRAMATU,MASAMI
2015-09-06 6:02 ` Wangnan (F)
2015-09-06 6:04 ` [PATCH] perf test: Enforce LLVM test, add kbuild test Wang Nan
2015-09-06 6:04 ` [PATCH] perf test: Test BPF prologue Wang Nan
2015-09-02 14:08 ` [PATCH 22/31] perf tools: Add BPF_PROLOGUE config options for further patches Namhyung Kim
2015-08-29 4:21 ` [PATCH 23/31] perf tools: Introduce arch_get_reg_info() for x86 Wang Nan
2015-08-31 20:43 ` Arnaldo Carvalho de Melo
2015-09-01 2:39 ` Wangnan (F)
2015-08-29 4:21 ` [PATCH 24/31] perf tools: Add prologue for BPF programs for fetching arguments Wang Nan
2015-08-29 4:21 ` [PATCH 25/31] perf tools: Generate prologue for BPF programs Wang Nan
2015-08-29 4:22 ` [PATCH 26/31] perf tools: Use same BPF program if arguments are identical Wang Nan
2015-08-29 4:22 ` [PATCH 27/31] perf record: Support custom vmlinux path Wang Nan
2015-09-01 20:19 ` Arnaldo Carvalho de Melo
2015-09-01 20:21 ` Arnaldo Carvalho de Melo
2015-09-01 21:00 ` pi3orama
2015-09-01 21:33 ` Arnaldo Carvalho de Melo
2015-08-29 4:22 ` [PATCH 28/31] perf probe: Init symbol as kprobe Wang Nan
2015-09-01 20:11 ` Arnaldo Carvalho de Melo
2015-09-02 1:22 ` Wangnan (F)
2015-09-02 1:38 ` 平松雅巳 / HIRAMATU,MASAMI
2015-08-29 4:22 ` [PATCH 29/31] perf tools: Support attach BPF program on uprobe events Wang Nan
2015-08-29 4:22 ` [PATCH 30/31] perf tools: Fix cross compiling error Wang Nan
2015-08-29 4:22 ` [PATCH 31/31] tools lib traceevent: Support function __get_dynamic_array_len Wang Nan
2015-09-08 14:31 ` [tip:perf/core] " tip-bot for He Kuang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150903001108.GA31697@sejong \
--to=namhyung@kernel.org \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@redhat.com \
--cc=ast@plumgrid.com \
--cc=brendan.d.gregg@gmail.com \
--cc=daniel@iogearbox.net \
--cc=dsahern@gmail.com \
--cc=hekuang@huawei.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lizefan@huawei.com \
--cc=masami.hiramatsu.pt@hitachi.com \
--cc=mingo@kernel.org \
--cc=pi3orama@163.com \
--cc=wangnan0@huawei.com \
--cc=xiakaixu@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox