From: tip-bot for Tom Zanussi <tzanussi@gmail.com>
To: linux-tip-commits@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, hpa@zytor.com, mingo@redhat.com,
tzanussi@gmail.com, tglx@linutronix.de, mingo@elte.hu
Subject: [tip:perf/live] perf: Convert perf event types into event type events
Date: Wed, 14 Apr 2010 10:05:04 GMT [thread overview]
Message-ID: <tip-cd19a035f3b63fee6dcbdb5371c4b22276f7dc8c@git.kernel.org> (raw)
In-Reply-To: <1270184365-8281-7-git-send-email-tzanussi@gmail.com>
Commit-ID: cd19a035f3b63fee6dcbdb5371c4b22276f7dc8c
Gitweb: http://git.kernel.org/tip/cd19a035f3b63fee6dcbdb5371c4b22276f7dc8c
Author: Tom Zanussi <tzanussi@gmail.com>
AuthorDate: Thu, 1 Apr 2010 23:59:20 -0500
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Wed, 14 Apr 2010 11:56:07 +0200
perf: Convert perf event types into event type events
Bypasses the event type perf header code and replaces it with a
synthesized event and processing function that accomplishes the
same thing, used when reading/writing perf data to/from a pipe.
Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Cc: fweisbec@gmail.com
Cc: rostedt@goodmis.org
Cc: k-keiichi@bx.jp.nec.com
Cc: acme@ghostprotocols.net
LKML-Reference: <1270184365-8281-7-git-send-email-tzanussi@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
tools/perf/builtin-record.c | 7 +++++
tools/perf/builtin-report.c | 1 +
tools/perf/builtin-trace.c | 1 +
tools/perf/util/event.h | 14 +++++++++
| 62 ++++++++++++++++++++++++++++++++++++++-----
| 9 ++++++
tools/perf/util/session.c | 12 ++++++++
tools/perf/util/session.h | 3 +-
8 files changed, 101 insertions(+), 8 deletions(-)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 289d9cf..c4c1322 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -592,6 +592,13 @@ static int __cmd_record(int argc, const char **argv)
pr_err("Couldn't synthesize attrs.\n");
return err;
}
+
+ err = event__synthesize_event_types(process_synthesized_event,
+ session);
+ if (err < 0) {
+ pr_err("Couldn't synthesize event_types.\n");
+ return err;
+ }
}
err = event__synthesize_kernel_mmap(process_synthesized_event,
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index f0486ce..e59d012 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -268,6 +268,7 @@ static struct perf_event_ops event_ops = {
.lost = event__process_lost,
.read = process_read_event,
.attr = event__process_attr,
+ .event_type = event__process_event_type,
};
extern volatile int session_done;
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index e30eac6..eb884a7 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -105,6 +105,7 @@ static struct perf_event_ops event_ops = {
.sample = process_sample_event,
.comm = event__process_comm,
.attr = event__process_attr,
+ .event_type = event__process_event_type,
};
extern volatile int session_done;
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index b4fbf25..c720fe0 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -85,6 +85,7 @@ struct build_id_event {
enum perf_header_event_type { /* above any possible kernel type */
PERF_RECORD_HEADER_ATTR = 64,
+ PERF_RECORD_HEADER_EVENT_TYPE = 65,
PERF_RECORD_HEADER_MAX
};
@@ -94,6 +95,18 @@ struct attr_event {
u64 id[];
};
+#define MAX_EVENT_NAME 64
+
+struct perf_trace_event_type {
+ u64 event_id;
+ char name[MAX_EVENT_NAME];
+};
+
+struct event_type_event {
+ struct perf_event_header header;
+ struct perf_trace_event_type event_type;
+};
+
typedef union event_union {
struct perf_event_header header;
struct ip_event ip;
@@ -104,6 +117,7 @@ typedef union event_union {
struct read_event read;
struct sample_event sample;
struct attr_event attr;
+ struct event_type_event event_type;
} event_t;
struct events_stats {
--git a/tools/perf/util/header.c b/tools/perf/util/header.c
index e361739..4463799 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -99,13 +99,6 @@ int perf_header__add_attr(struct perf_header *self,
return 0;
}
-#define MAX_EVENT_NAME 64
-
-struct perf_trace_event_type {
- u64 event_id;
- char name[MAX_EVENT_NAME];
-};
-
static int event_count;
static struct perf_trace_event_type *events;
@@ -886,3 +879,58 @@ int event__process_attr(event_t *self, struct perf_session *session)
return 0;
}
+
+int event__synthesize_event_type(u64 event_id, char *name,
+ event__handler_t process,
+ struct perf_session *session)
+{
+ event_t ev;
+ size_t size = 0;
+ int err = 0;
+
+ memset(&ev, 0, sizeof(ev));
+
+ ev.event_type.event_type.event_id = event_id;
+ memset(ev.event_type.event_type.name, 0, MAX_EVENT_NAME);
+ strncpy(ev.event_type.event_type.name, name, MAX_EVENT_NAME - 1);
+
+ ev.event_type.header.type = PERF_RECORD_HEADER_EVENT_TYPE;
+ size = strlen(name);
+ size = ALIGN(size, sizeof(u64));
+ ev.event_type.header.size = sizeof(ev.event_type) -
+ (sizeof(ev.event_type.event_type.name) - size);
+
+ err = process(&ev, session);
+
+ return err;
+}
+
+int event__synthesize_event_types(event__handler_t process,
+ struct perf_session *session)
+{
+ struct perf_trace_event_type *type;
+ int i, err = 0;
+
+ for (i = 0; i < event_count; i++) {
+ type = &events[i];
+
+ err = event__synthesize_event_type(type->event_id, type->name,
+ process, session);
+ if (err) {
+ pr_debug("failed to create perf header event type\n");
+ return err;
+ }
+ }
+
+ return err;
+}
+
+int event__process_event_type(event_t *self,
+ struct perf_session *session __unused)
+{
+ if (perf_header__push_event(self->event_type.event_type.event_id,
+ self->event_type.event_type.name) < 0)
+ return -ENOMEM;
+
+ return 0;
+}
--git a/tools/perf/util/header.h b/tools/perf/util/header.h
index e916ac5..afeb618 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -103,4 +103,13 @@ int event__synthesize_attrs(struct perf_header *self,
struct perf_session *session);
int event__process_attr(event_t *self, struct perf_session *session);
+int event__synthesize_event_type(u64 event_id, char *name,
+ event__handler_t process,
+ struct perf_session *session);
+int event__synthesize_event_types(event__handler_t process,
+ struct perf_session *session);
+int event__process_event_type(event_t *self,
+ struct perf_session *session);
+
+
#endif /* __PERF_HEADER_H */
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index bc81864..96c4629 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -202,6 +202,8 @@ static void perf_event_ops__fill_defaults(struct perf_event_ops *handler)
handler->unthrottle = process_event_stub;
if (handler->attr == NULL)
handler->attr = process_event_stub;
+ if (handler->event_type == NULL)
+ handler->event_type = process_event_stub;
}
static const char *event__name[] = {
@@ -216,6 +218,7 @@ static const char *event__name[] = {
[PERF_RECORD_READ] = "READ",
[PERF_RECORD_SAMPLE] = "SAMPLE",
[PERF_RECORD_HEADER_ATTR] = "ATTR",
+ [PERF_RECORD_HEADER_EVENT_TYPE] = "EVENT_TYPE",
};
unsigned long event__total[PERF_RECORD_HEADER_MAX];
@@ -302,6 +305,12 @@ static void event__attr_swap(event_t *self)
mem_bswap_64(self->attr.id, size);
}
+static void event__event_type_swap(event_t *self)
+{
+ self->event_type.event_type.event_id =
+ bswap_64(self->event_type.event_type.event_id);
+}
+
typedef void (*event__swap_op)(event_t *self);
static event__swap_op event__swap_ops[] = {
@@ -313,6 +322,7 @@ static event__swap_op event__swap_ops[] = {
[PERF_RECORD_READ] = event__read_swap,
[PERF_RECORD_SAMPLE] = event__all64_swap,
[PERF_RECORD_HEADER_ATTR] = event__attr_swap,
+ [PERF_RECORD_HEADER_EVENT_TYPE] = event__event_type_swap,
[PERF_RECORD_HEADER_MAX] = NULL,
};
@@ -355,6 +365,8 @@ static int perf_session__process_event(struct perf_session *self,
return ops->unthrottle(event, self);
case PERF_RECORD_HEADER_ATTR:
return ops->attr(event, self);
+ case PERF_RECORD_HEADER_EVENT_TYPE:
+ return ops->event_type(event, self);
default:
self->unknown_events++;
return -1;
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
index 45a1374..0dac1f4 100644
--- a/tools/perf/util/session.h
+++ b/tools/perf/util/session.h
@@ -45,7 +45,8 @@ struct perf_event_ops {
read,
throttle,
unthrottle,
- attr;
+ attr,
+ event_type;
};
struct perf_session *perf_session__new(const char *filename, int mode, bool force);
next prev parent reply other threads:[~2010-04-14 10:05 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-02 4:59 [RFC v2][PATCH 0/7] perf: 'live mode' Tom Zanussi
2010-04-02 4:59 ` [RFC v2][PATCH 01/11] perf: add pipe-specific header read/write and event processing code Tom Zanussi
2010-04-14 10:03 ` [tip:perf/live] perf: Add " tip-bot for Tom Zanussi
2010-04-02 4:59 ` [RFC v2][PATCH 02/11] perf record: introduce special handling for pipe output Tom Zanussi
2010-04-14 10:03 ` [tip:perf/live] perf record: Introduce " tip-bot for Tom Zanussi
2010-04-02 4:59 ` [RFC v2][PATCH 03/11] perf report: introduce special handling for pipe input Tom Zanussi
2010-04-14 10:04 ` [tip:perf/live] perf report: Introduce " tip-bot for Tom Zanussi
2010-04-02 4:59 ` [RFC v2][PATCH 04/11] perf trace: introduce " Tom Zanussi
2010-04-14 10:04 ` [tip:perf/live] perf trace: Introduce " tip-bot for Tom Zanussi
2010-04-02 4:59 ` [RFC v2][PATCH 05/11] perf: convert perf header attrs into attr events Tom Zanussi
2010-04-14 10:04 ` [tip:perf/live] perf: Convert " tip-bot for Tom Zanussi
2010-04-02 4:59 ` [RFC v2][PATCH 06/11] perf: convert perf event types into event type events Tom Zanussi
2010-04-14 10:05 ` tip-bot for Tom Zanussi [this message]
2010-04-02 4:59 ` [RFC v2][PATCH 07/11] perf: convert perf tracing data into a tracing_data event Tom Zanussi
2010-04-14 10:05 ` [tip:perf/live] perf: Convert " tip-bot for Tom Zanussi
2010-04-02 4:59 ` [RFC v2][PATCH 08/11] perf: convert perf header build_ids into build_id events Tom Zanussi
2010-04-03 13:54 ` Arnaldo Carvalho de Melo
2010-04-14 10:05 ` [tip:perf/live] perf: Convert " tip-bot for Tom Zanussi
2010-04-02 4:59 ` [RFC v2][PATCH 09/11] perf trace/scripting: rwtop and sctop scripts Tom Zanussi
2010-04-14 10:05 ` [tip:perf/live] perf trace/scripting: Add " tip-bot for Tom Zanussi
2010-04-02 4:59 ` [RFC v2][PATCH 10/11] perf trace/scripting: enable scripting shell scripts for live mode Tom Zanussi
2010-04-14 10:06 ` [tip:perf/live] perf trace/scripting: Enable " tip-bot for Tom Zanussi
2010-04-02 4:59 ` [RFC v2][PATCH 11/11] perf trace: invoke live mode automatically if record/report not specified Tom Zanussi
2010-04-14 10:06 ` [tip:perf/live] perf trace: Invoke " tip-bot for Tom Zanussi
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=tip-cd19a035f3b63fee6dcbdb5371c4b22276f7dc8c@git.kernel.org \
--to=tzanussi@gmail.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=mingo@redhat.com \
--cc=tglx@linutronix.de \
/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.