From: Frederic Weisbecker <fweisbec@gmail.com>
To: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>,
Tom Zanussi <tzanussi@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>,
linux-kernel@vger.kernel.org, Mike Galbraith <efault@gmx.de>,
Paul Mackerras <paulus@samba.org>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: Re: [PATCH 1/3] perf: record TRACE_INFO only if using tracepoints and SAMPLE_RAW
Date: Tue, 4 May 2010 19:06:45 +0200 [thread overview]
Message-ID: <20100504170642.GA5427@nowhere> (raw)
In-Reply-To: <1272981607-28723-2-git-send-email-acme@infradead.org>
On Tue, May 04, 2010 at 11:00:05AM -0300, Arnaldo Carvalho de Melo wrote:
> From: Tom Zanussi <tzanussi@gmail.com>
>
> The current perf code implicitly assumes SAMPLE_RAW means tracepoints
> are being used, but doesn't check for that. It happily records the
> TRACE_INFO even if SAMPLE_RAW is used without tracepoints, but when the
> perf data is read it won't go any further when it finds TRACE_INFO but
> no tracepoints, and displays misleading errors.
>
> This adds a check for both in perf-record, and won't record TRACE_INFO
> unless both are true. This at least allows perf report -D to dump raw
> events, and avoids triggering a misleading error condition in perf
> trace. It doesn't actually enable the non-tracepoint raw events to be
> displayed in perf trace, since perf trace currently only deals with
> tracepoint events.
>
> Cc: Frédéric Weisbecker <fweisbec@gmail.com>
> Cc: Mike Galbraith <efault@gmx.de>
> Cc: Paul Mackerras <paulus@samba.org>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> LKML-Reference: <1272865861.7932.16.camel@tropicana>
> Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
> ---
> tools/perf/builtin-record.c | 35 +++++++++++++++++++++--------------
> tools/perf/util/header.c | 1 -
> tools/perf/util/parse-events.h | 1 +
> tools/perf/util/trace-event-info.c | 5 +++++
> 4 files changed, 27 insertions(+), 15 deletions(-)
>
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index ac989e9..0ff67d1 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -560,11 +560,12 @@ static int __cmd_record(int argc, const char **argv)
> return err;
> }
>
> - if (raw_samples) {
> + if (raw_samples && have_tracepoints(attrs, nr_counters)) {
> perf_header__set_feat(&session->header, HEADER_TRACE_INFO);
> } else {
Using get_tracepoints_path() is a bit costly just to check if we use
tracepoints as it allocates and fill the paths.
> for (i = 0; i < nr_counters; i++) {
> - if (attrs[i].sample_type & PERF_SAMPLE_RAW) {
> + if (attrs[i].sample_type & PERF_SAMPLE_RAW &&
> + attrs[i].type == PERF_TYPE_TRACEPOINT) {
> perf_header__set_feat(&session->header, HEADER_TRACE_INFO);
> break;
> }
In fact now we always have PERF_SAMPLE_RAW for tracepoints.
> @@ -662,19 +663,25 @@ static int __cmd_record(int argc, const char **argv)
> return err;
> }
>
> - err = event__synthesize_tracing_data(output, attrs,
> - nr_counters,
> - process_synthesized_event,
> - session);
> - /*
> - * FIXME err <= 0 here actually means that there were no tracepoints
> - * so its not really an error, just that we don't need to synthesize
> - * anything.
> - * We really have to return this more properly and also propagate
> - * errors that now are calling die()
> - */
> - if (err > 0)
> + if (have_tracepoints(attrs, nr_counters)) {
> + /*
> + * FIXME err <= 0 here actually means that
> + * there were no tracepoints so its not really
> + * an error, just that we don't need to
> + * synthesize anything. We really have to
> + * return this more properly and also
> + * propagate errors that now are calling die()
> + */
> + err = event__synthesize_tracing_data(output, attrs,
> + nr_counters,
> + process_synthesized_event,
> + session);
> + if (err <= 0) {
> + pr_err("Couldn't record tracing data.\n");
> + return err;
> + }
> advance_output(err);
> + }
> }
Now get_tracepoints_path() may be called three times. You are leaking some
memory by doing that as the paths are reallocated without beeing released.
>
> machine = perf_session__find_host_machine(session);
> diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
> index 79da0e5..2b9f898 100644
> --- a/tools/perf/util/header.c
> +++ b/tools/perf/util/header.c
> @@ -436,7 +436,6 @@ static int perf_header__adds_write(struct perf_header *self, int fd)
> trace_sec->size = lseek(fd, 0, SEEK_CUR) - trace_sec->offset;
> }
>
> -
> if (perf_header__has_feat(self, HEADER_BUILD_ID)) {
> struct perf_file_section *buildid_sec;
>
> diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
> index b8c1f64..fc4ab3f 100644
> --- a/tools/perf/util/parse-events.h
> +++ b/tools/perf/util/parse-events.h
> @@ -13,6 +13,7 @@ struct tracepoint_path {
> };
>
> extern struct tracepoint_path *tracepoint_id_to_path(u64 config);
> +extern bool have_tracepoints(struct perf_event_attr *pattrs, int nb_events);
>
> extern int nr_counters;
>
> diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
> index 30cd9b5..0a1fb9d 100644
> --- a/tools/perf/util/trace-event-info.c
> +++ b/tools/perf/util/trace-event-info.c
> @@ -487,6 +487,11 @@ get_tracepoints_path(struct perf_event_attr *pattrs, int nb_events)
> return nr_tracepoints > 0 ? path.next : NULL;
> }
>
> +bool have_tracepoints(struct perf_event_attr *pattrs, int nb_events)
> +{
> + return get_tracepoints_path(pattrs, nb_events) ? true : false;
> +}
> +
> int read_tracing_data(int fd, struct perf_event_attr *pattrs, int nb_events)
> {
> char buf[BUFSIZ];
> --
> 1.6.2.5
>
next prev parent reply other threads:[~2010-05-04 17:06 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-04 14:00 [GIT PULL 0/3] perf fixes (inject, report, record) Arnaldo Carvalho de Melo
2010-05-04 14:00 ` [PATCH 1/3] perf: record TRACE_INFO only if using tracepoints and SAMPLE_RAW Arnaldo Carvalho de Melo
2010-05-04 17:06 ` Frederic Weisbecker [this message]
2010-05-04 21:18 ` Arnaldo Carvalho de Melo
2010-05-05 3:39 ` Tom Zanussi
2010-05-05 4:26 ` Frederic Weisbecker
2010-05-05 16:52 ` [tip:perf/core] perf/record: simplify TRACE_INFO tracepoint check tip-bot for Tom Zanussi
2010-05-04 14:00 ` [PATCH 2/3] perf inject: Add missing bits Arnaldo Carvalho de Melo
2010-05-05 4:18 ` Tom Zanussi
2010-05-04 14:00 ` [PATCH 3/3] perf: Fix performance issue with perf report Arnaldo Carvalho de Melo
2010-05-04 16:32 ` [GIT PULL 0/3] perf fixes (inject, report, record) Ingo Molnar
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=20100504170642.GA5427@nowhere \
--to=fweisbec@gmail.com \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@ghostprotocols.net \
--cc=acme@redhat.com \
--cc=efault@gmx.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=paulus@samba.org \
--cc=tzanussi@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.