* [PATCH 0/6] perf ctf: Convert comm, fork and exit events to CTF
@ 2016-06-23 9:16 Wang Nan
2016-06-23 9:16 ` [PATCH 1/6] perf ctf: Add value_set_string() helper Wang Nan
` (5 more replies)
0 siblings, 6 replies; 9+ messages in thread
From: Wang Nan @ 2016-06-23 9:16 UTC (permalink / raw)
To: acme, jolsa; +Cc: linux-kernel, pi3orama, Wang Nan
After converting perf.data to CTF, we lost pid-tid-comm mapping. Which
makes inconvience. For example, in perf script output we know which
process issue an event like this:
compiz 19361 [001] 3275709.313929: raw_syscalls:sys_exit: NR 7 = 0
After converting to CTF, we only get this:
[3275709.313929985] (+0.110646118) raw_syscalls:sys_exit: { cpu_id = 1 }, { perf_ip = 0xFFFFFFFF8107B2E8, perf_tid = 19361, perf_pid = 19361, perf_id = 18920, perf_period = 1, common_type = 16, common_flags = 0, common_preempt_count = 1, common_pid = 19361, id = 7, ret = 0 }
Currently, if we want to find the name and parent of a process, we
have to collect 'sched:sched_switch' event.
This patch set add a '--all' option to 'perf convert', converts comm,
fork and exit events to CTF output. CTF user now can track the mapping
by their own.
Wang Nan (6):
perf ctf: Add value_set_string() helper
perf ctf: Pass convert options through structure
perf ctf: Add non_sample option
perf ctf: Generate comm event to CTF output
perf ctf: Add '--all' option for 'perf data convert'
perf ctf: Generate fork and exit events to CTF output
tools/perf/Documentation/perf-data.txt | 5 +-
tools/perf/builtin-data.c | 11 +-
tools/perf/util/data-convert-bt.c | 185 ++++++++++++++++++++++++++++++++-
tools/perf/util/data-convert-bt.h | 4 +-
tools/perf/util/data-convert.h | 9 ++
5 files changed, 207 insertions(+), 7 deletions(-)
create mode 100644 tools/perf/util/data-convert.h
--
1.8.3.4
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/6] perf ctf: Add value_set_string() helper
2016-06-23 9:16 [PATCH 0/6] perf ctf: Convert comm, fork and exit events to CTF Wang Nan
@ 2016-06-23 9:16 ` Wang Nan
2016-06-23 9:16 ` [PATCH 2/6] perf ctf: Pass convert options through structure Wang Nan
` (4 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Wang Nan @ 2016-06-23 9:16 UTC (permalink / raw)
To: acme, jolsa; +Cc: linux-kernel, pi3orama, Wang Nan, Arnaldo Carvalho de Melo
There are many value_set_##x helper for integer, but only for integer.
This patch adds value_set_string() helper to help following commits
create string fields.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
---
tools/perf/util/data-convert-bt.c | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
index 9f53020..d31a1c1 100644
--- a/tools/perf/util/data-convert-bt.c
+++ b/tools/perf/util/data-convert-bt.c
@@ -140,6 +140,36 @@ FUNC_VALUE_SET(s64)
FUNC_VALUE_SET(u64)
__FUNC_VALUE_SET(u64_hex, u64)
+static int string_set_value(struct bt_ctf_field *field, const char *string);
+static __maybe_unused int
+value_set_string(struct ctf_writer *cw, struct bt_ctf_event *event,
+ const char *name, const char *string)
+{
+ struct bt_ctf_field_type *type = cw->data.string;
+ struct bt_ctf_field *field;
+ int ret = 0;
+
+ field = bt_ctf_field_create(type);
+ if (!field) {
+ pr_err("failed to create a field %s\n", name);
+ return -1;
+ }
+
+ ret = string_set_value(field, string);
+ if (ret) {
+ pr_err("failed to set value %s\n", name);
+ goto err_put_field;
+ }
+
+ ret = bt_ctf_event_set_payload(event, name, field);
+ if (ret)
+ pr_err("failed to set payload %s\n", name);
+
+err_put_field:
+ bt_ctf_field_put(field);
+ return ret;
+}
+
static struct bt_ctf_field_type*
get_tracepoint_field_type(struct ctf_writer *cw, struct format_field *field)
{
--
1.8.3.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/6] perf ctf: Pass convert options through structure
2016-06-23 9:16 [PATCH 0/6] perf ctf: Convert comm, fork and exit events to CTF Wang Nan
2016-06-23 9:16 ` [PATCH 1/6] perf ctf: Add value_set_string() helper Wang Nan
@ 2016-06-23 9:16 ` Wang Nan
2016-06-23 9:16 ` [PATCH 3/6] perf ctf: Add non_sample option Wang Nan
` (3 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Wang Nan @ 2016-06-23 9:16 UTC (permalink / raw)
To: acme, jolsa; +Cc: linux-kernel, pi3orama, Wang Nan, Arnaldo Carvalho de Melo
Following commits will add new option to 'perf data convert'. All options
should be grouped into a structure and passed to low level converter
(currently there's only one converter).
Introduce data-convert.h and define 'struct perf_data_convert_opts' in
it. Pass 'force' through opts.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
---
tools/perf/builtin-data.c | 9 ++++++---
tools/perf/util/data-convert-bt.c | 5 +++--
tools/perf/util/data-convert-bt.h | 4 +++-
tools/perf/util/data-convert.h | 8 ++++++++
4 files changed, 20 insertions(+), 6 deletions(-)
create mode 100644 tools/perf/util/data-convert.h
diff --git a/tools/perf/builtin-data.c b/tools/perf/builtin-data.c
index b97bc15..38111a9 100644
--- a/tools/perf/builtin-data.c
+++ b/tools/perf/builtin-data.c
@@ -3,6 +3,7 @@
#include "perf.h"
#include "debug.h"
#include <subcmd/parse-options.h>
+#include "data-convert.h"
#include "data-convert-bt.h"
typedef int (*data_cmd_fn_t)(int argc, const char **argv, const char *prefix);
@@ -53,14 +54,16 @@ static int cmd_data_convert(int argc, const char **argv,
const char *prefix __maybe_unused)
{
const char *to_ctf = NULL;
- bool force = false;
+ struct perf_data_convert_opts opts = {
+ .force = false,
+ };
const struct option options[] = {
OPT_INCR('v', "verbose", &verbose, "be more verbose"),
OPT_STRING('i', "input", &input_name, "file", "input file name"),
#ifdef HAVE_LIBBABELTRACE_SUPPORT
OPT_STRING(0, "to-ctf", &to_ctf, NULL, "Convert to CTF format"),
#endif
- OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
+ OPT_BOOLEAN('f', "force", &opts.force, "don't complain, do it"),
OPT_END()
};
@@ -78,7 +81,7 @@ static int cmd_data_convert(int argc, const char **argv,
if (to_ctf) {
#ifdef HAVE_LIBBABELTRACE_SUPPORT
- return bt_convert__perf2ctf(input_name, to_ctf, force);
+ return bt_convert__perf2ctf(input_name, to_ctf, &opts);
#else
pr_err("The libbabeltrace support is not compiled in.\n");
return -1;
diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
index d31a1c1..0bc3ee2 100644
--- a/tools/perf/util/data-convert-bt.c
+++ b/tools/perf/util/data-convert-bt.c
@@ -1303,13 +1303,14 @@ static int convert__config(const char *var, const char *value, void *cb)
return 0;
}
-int bt_convert__perf2ctf(const char *input, const char *path, bool force)
+int bt_convert__perf2ctf(const char *input, const char *path,
+ struct perf_data_convert_opts *opts)
{
struct perf_session *session;
struct perf_data_file file = {
.path = input,
.mode = PERF_DATA_MODE_READ,
- .force = force,
+ .force = opts->force,
};
struct convert c = {
.tool = {
diff --git a/tools/perf/util/data-convert-bt.h b/tools/perf/util/data-convert-bt.h
index 4c20434..9a3b587 100644
--- a/tools/perf/util/data-convert-bt.h
+++ b/tools/perf/util/data-convert-bt.h
@@ -1,8 +1,10 @@
#ifndef __DATA_CONVERT_BT_H
#define __DATA_CONVERT_BT_H
+#include "data-convert.h"
#ifdef HAVE_LIBBABELTRACE_SUPPORT
-int bt_convert__perf2ctf(const char *input_name, const char *to_ctf, bool force);
+int bt_convert__perf2ctf(const char *input_name, const char *to_ctf,
+ struct perf_data_convert_opts *opts);
#endif /* HAVE_LIBBABELTRACE_SUPPORT */
#endif /* __DATA_CONVERT_BT_H */
diff --git a/tools/perf/util/data-convert.h b/tools/perf/util/data-convert.h
new file mode 100644
index 0000000..97cfd36
--- /dev/null
+++ b/tools/perf/util/data-convert.h
@@ -0,0 +1,8 @@
+#ifndef __DATA_CONVERT_H
+#define __DATA_CONVERT_H
+
+struct perf_data_convert_opts {
+ bool force;
+};
+
+#endif /* __DATA_CONVERT_H */
--
1.8.3.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/6] perf ctf: Add non_sample option
2016-06-23 9:16 [PATCH 0/6] perf ctf: Convert comm, fork and exit events to CTF Wang Nan
2016-06-23 9:16 ` [PATCH 1/6] perf ctf: Add value_set_string() helper Wang Nan
2016-06-23 9:16 ` [PATCH 2/6] perf ctf: Pass convert options through structure Wang Nan
@ 2016-06-23 9:16 ` Wang Nan
2016-06-23 9:16 ` [PATCH 4/6] perf ctf: Generate comm event to CTF output Wang Nan
` (2 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Wang Nan @ 2016-06-23 9:16 UTC (permalink / raw)
To: acme, jolsa; +Cc: linux-kernel, pi3orama, Wang Nan, Arnaldo Carvalho de Melo
If non_sample option is selected, 'perf data convert' should convert
not only samples, but non-sample events such as comm and fork. Add this
option in perf_data_convert_opts. Following commits will add cmdline
option to select it.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
---
tools/perf/builtin-data.c | 1 +
tools/perf/util/data-convert.h | 1 +
2 files changed, 2 insertions(+)
diff --git a/tools/perf/builtin-data.c b/tools/perf/builtin-data.c
index 38111a9..a011a56 100644
--- a/tools/perf/builtin-data.c
+++ b/tools/perf/builtin-data.c
@@ -56,6 +56,7 @@ static int cmd_data_convert(int argc, const char **argv,
const char *to_ctf = NULL;
struct perf_data_convert_opts opts = {
.force = false,
+ .non_sample = false,
};
const struct option options[] = {
OPT_INCR('v', "verbose", &verbose, "be more verbose"),
diff --git a/tools/perf/util/data-convert.h b/tools/perf/util/data-convert.h
index 97cfd36..66f2b2a 100644
--- a/tools/perf/util/data-convert.h
+++ b/tools/perf/util/data-convert.h
@@ -3,6 +3,7 @@
struct perf_data_convert_opts {
bool force;
+ bool non_sample;
};
#endif /* __DATA_CONVERT_H */
--
1.8.3.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/6] perf ctf: Generate comm event to CTF output
2016-06-23 9:16 [PATCH 0/6] perf ctf: Convert comm, fork and exit events to CTF Wang Nan
` (2 preceding siblings ...)
2016-06-23 9:16 ` [PATCH 3/6] perf ctf: Add non_sample option Wang Nan
@ 2016-06-23 9:16 ` Wang Nan
2016-06-24 7:07 ` Jiri Olsa
2016-06-23 9:16 ` [PATCH 5/6] perf ctf: Add '--all' option for 'perf data convert' Wang Nan
2016-06-23 9:16 ` [PATCH 6/6] perf ctf: Generate fork and exit events to CTF output Wang Nan
5 siblings, 1 reply; 9+ messages in thread
From: Wang Nan @ 2016-06-23 9:16 UTC (permalink / raw)
To: acme, jolsa; +Cc: linux-kernel, pi3orama, Wang Nan, Arnaldo Carvalho de Melo
If non_sample is selected, convert comm event to output CTF stream.
setup_non_sample_events() is called if non_sample is selected. It creates
a comm_class for comm event.
Use macros to generate and process_comm_event and add_comm_event. These
macros can be reused for other non-sample events.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
---
tools/perf/util/data-convert-bt.c | 108 ++++++++++++++++++++++++++++++++++++++
1 file changed, 108 insertions(+)
diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
index 0bc3ee2..bc6d42b 100644
--- a/tools/perf/util/data-convert-bt.c
+++ b/tools/perf/util/data-convert-bt.c
@@ -68,6 +68,7 @@ struct ctf_writer {
};
struct bt_ctf_field_type *array[6];
} data;
+ struct bt_ctf_event_class *comm_class;
};
struct convert {
@@ -761,6 +762,55 @@ static int process_sample_event(struct perf_tool *tool,
return cs ? 0 : -1;
}
+#define __NON_SAMPLE_SET_FIELD(_name, _type, _field) \
+do { \
+ ret = value_set_##_type(cw, event, #_field, _event->_name._field);\
+ if (ret) \
+ return -1; \
+} while(0)
+
+#define __FUNC_PROCESS_NON_SAMPLE(_name, body) \
+static int process_##_name##_event(struct perf_tool *tool, \
+ union perf_event *_event, \
+ struct perf_sample *sample, \
+ struct machine *machine) \
+{ \
+ struct convert *c = container_of(tool, struct convert, tool);\
+ struct ctf_writer *cw = &c->writer; \
+ struct bt_ctf_event_class *event_class = cw->_name##_class;\
+ struct bt_ctf_event *event; \
+ struct ctf_stream *cs; \
+ int ret; \
+ \
+ event = bt_ctf_event_create(event_class); \
+ if (!event) { \
+ pr_err("Failed to create an CTF event\n"); \
+ return -1; \
+ } \
+ \
+ bt_ctf_clock_set_time(cw->clock, sample->time); \
+ body \
+ cs = ctf_stream(cw, 0); \
+ if (cs) { \
+ if (is_flush_needed(cs)) \
+ ctf_stream__flush(cs); \
+ \
+ cs->count++; \
+ bt_ctf_stream_append_event(cs->stream, event); \
+ } \
+ bt_ctf_event_put(event); \
+ \
+ return perf_event__process_##_name(tool, _event, sample, machine);\
+}
+
+__FUNC_PROCESS_NON_SAMPLE(comm,
+ __NON_SAMPLE_SET_FIELD(comm, u32, pid);
+ __NON_SAMPLE_SET_FIELD(comm, u32, tid);
+ __NON_SAMPLE_SET_FIELD(comm, string, comm);
+)
+#undef __NON_SAMPLE_SET_FIELD
+#undef __FUNC_PROCESS_NON_SAMPLE
+
/* If dup < 0, add a prefix. Else, add _dupl_X suffix. */
static char *change_name(char *name, char *orig_name, int dup)
{
@@ -1035,6 +1085,58 @@ static int setup_events(struct ctf_writer *cw, struct perf_session *session)
return 0;
}
+#define __NON_SAMPLE_ADD_FIELD(t, n) \
+ do { \
+ pr2(" field '%s'\n", #n); \
+ if (bt_ctf_event_class_add_field(event_class, cw->data.t, #n)) {\
+ pr_err("Failed to add field '%s';\n", #n);\
+ return -1; \
+ } \
+ } while(0)
+
+#define __FUNC_ADD_NON_SAMPLE_EVENT_CLASS(_name, body) \
+static int add_##_name##_event(struct ctf_writer *cw) \
+{ \
+ struct bt_ctf_event_class *event_class; \
+ int ret; \
+ \
+ pr("Adding "#_name" event\n"); \
+ event_class = bt_ctf_event_class_create("perf_" #_name);\
+ if (!event_class) \
+ return -1; \
+ body \
+ \
+ ret = bt_ctf_stream_class_add_event_class(cw->stream_class, event_class);\
+ if (ret) { \
+ pr("Failed to add event class '"#_name"' into stream.\n");\
+ return ret; \
+ } \
+ \
+ cw->_name##_class = event_class; \
+ bt_ctf_event_class_put(event_class); \
+ return 0; \
+}
+
+__FUNC_ADD_NON_SAMPLE_EVENT_CLASS(comm,
+ __NON_SAMPLE_ADD_FIELD(u32, pid);
+ __NON_SAMPLE_ADD_FIELD(u32, tid);
+ __NON_SAMPLE_ADD_FIELD(string, comm);
+)
+
+#undef __NON_SAMPLE_ADD_FIELD
+#undef __FUNC_ADD_NON_SAMPLE_EVENT_CLASS
+
+static int setup_non_sample_events(struct ctf_writer *cw,
+ struct perf_session *session __maybe_unused)
+{
+ int ret;
+
+ ret = add_comm_event(cw);
+ if (ret)
+ return ret;
+ return 0;
+}
+
static void cleanup_events(struct perf_session *session)
{
struct perf_evlist *evlist = session->evlist;
@@ -1330,6 +1432,9 @@ int bt_convert__perf2ctf(const char *input, const char *path,
struct ctf_writer *cw = &c.writer;
int err = -1;
+ if (opts->non_sample)
+ c.tool.comm = process_comm_event;
+
perf_config(convert__config, &c);
/* CTF writer */
@@ -1354,6 +1459,9 @@ int bt_convert__perf2ctf(const char *input, const char *path,
if (setup_events(cw, session))
goto free_session;
+ if (opts->non_sample && setup_non_sample_events(cw, session))
+ goto free_session;
+
if (setup_streams(cw, session))
goto free_session;
--
1.8.3.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 5/6] perf ctf: Add '--all' option for 'perf data convert'
2016-06-23 9:16 [PATCH 0/6] perf ctf: Convert comm, fork and exit events to CTF Wang Nan
` (3 preceding siblings ...)
2016-06-23 9:16 ` [PATCH 4/6] perf ctf: Generate comm event to CTF output Wang Nan
@ 2016-06-23 9:16 ` Wang Nan
2016-06-24 7:07 ` Jiri Olsa
2016-06-23 9:16 ` [PATCH 6/6] perf ctf: Generate fork and exit events to CTF output Wang Nan
5 siblings, 1 reply; 9+ messages in thread
From: Wang Nan @ 2016-06-23 9:16 UTC (permalink / raw)
To: acme, jolsa; +Cc: linux-kernel, pi3orama, Wang Nan, Arnaldo Carvalho de Melo
After this patch, 'perf data convert' convert comm events to output
CTF stream.
Result:
# perf record -a sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.771 MB perf.data (79 samples) ]
# perf data convert --to-ctf ./out.ctf
[ perf data convert: Converted 'perf.data' into CTF data './out.ctf' ]
[ perf data convert: Converted and wrote 0.004 MB (79 samples) ]
# babeltrace ./out.ctf/
[20:59:41.942633169] (+?.?????????) cycles:ppp: { cpu_id = 0 }, { perf_ip = 0xFFFFFFFF81065AF4, perf_tid = 0, perf_pid = 0, perf_period = 1 }
[20:59:41.942636194] (+0.000003025) cycles:ppp: { cpu_id = 0 }, { perf_ip = 0xFFFFFFFF81065AF4, perf_tid = 0, perf_pid = 0, perf_period = 1 }
... // only sample event is converted
# perf data convert --all --to-ctf ./out.ctf
[ perf data convert: Converted 'perf.data' into CTF data './out.ctf' ]
[ perf data convert: Converted and wrote 0.004 MB (79 samples) ]
# babeltrace ./out.ctf/
[00:00:00.000000000] (+?.?????????) perf_comm: { cpu_id = 0 }, { comm = "init", pid = 1, tid = 1 }
[00:00:00.000000000] (+0.000000000) perf_comm: { cpu_id = 0 }, { comm = "kthreadd", pid = 2, tid = 2 }
[00:00:00.000000000] (+0.000000000) perf_comm: { cpu_id = 0 }, { comm = "ksoftirqd/0", pid = 3, tid = 3 }
... // comm events are converted
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
---
tools/perf/Documentation/perf-data.txt | 5 ++++-
tools/perf/builtin-data.c | 1 +
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/tools/perf/Documentation/perf-data.txt b/tools/perf/Documentation/perf-data.txt
index be8fa1a..f8ada39 100644
--- a/tools/perf/Documentation/perf-data.txt
+++ b/tools/perf/Documentation/perf-data.txt
@@ -34,7 +34,10 @@ OPTIONS for 'convert'
--verbose::
Be more verbose (show counter open errors, etc).
-SEE ALSO
+--all::
+ Convert all events, including non-sample events (comm, fork, ...), to output.
+ Default is off, only convert samples.
+
--------
linkperf:perf[1]
[1] Common Trace Format - http://www.efficios.com/ctf
diff --git a/tools/perf/builtin-data.c b/tools/perf/builtin-data.c
index a011a56..a87c964 100644
--- a/tools/perf/builtin-data.c
+++ b/tools/perf/builtin-data.c
@@ -65,6 +65,7 @@ static int cmd_data_convert(int argc, const char **argv,
OPT_STRING(0, "to-ctf", &to_ctf, NULL, "Convert to CTF format"),
#endif
OPT_BOOLEAN('f', "force", &opts.force, "don't complain, do it"),
+ OPT_BOOLEAN(0, "all", &opts.non_sample, "Convert all events"),
OPT_END()
};
--
1.8.3.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 6/6] perf ctf: Generate fork and exit events to CTF output
2016-06-23 9:16 [PATCH 0/6] perf ctf: Convert comm, fork and exit events to CTF Wang Nan
` (4 preceding siblings ...)
2016-06-23 9:16 ` [PATCH 5/6] perf ctf: Add '--all' option for 'perf data convert' Wang Nan
@ 2016-06-23 9:16 ` Wang Nan
5 siblings, 0 replies; 9+ messages in thread
From: Wang Nan @ 2016-06-23 9:16 UTC (permalink / raw)
To: acme, jolsa; +Cc: linux-kernel, pi3orama, Wang Nan, Arnaldo Carvalho de Melo
If non_sample is selected, convert fork and exit events to output CTF stream.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
---
tools/perf/util/data-convert-bt.c | 44 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 43 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
index bc6d42b..2c972fd 100644
--- a/tools/perf/util/data-convert-bt.c
+++ b/tools/perf/util/data-convert-bt.c
@@ -69,6 +69,8 @@ struct ctf_writer {
struct bt_ctf_field_type *array[6];
} data;
struct bt_ctf_event_class *comm_class;
+ struct bt_ctf_event_class *exit_class;
+ struct bt_ctf_event_class *fork_class;
};
struct convert {
@@ -808,6 +810,21 @@ __FUNC_PROCESS_NON_SAMPLE(comm,
__NON_SAMPLE_SET_FIELD(comm, u32, tid);
__NON_SAMPLE_SET_FIELD(comm, string, comm);
)
+__FUNC_PROCESS_NON_SAMPLE(fork,
+ __NON_SAMPLE_SET_FIELD(fork, u32, pid);
+ __NON_SAMPLE_SET_FIELD(fork, u32, ppid);
+ __NON_SAMPLE_SET_FIELD(fork, u32, tid);
+ __NON_SAMPLE_SET_FIELD(fork, u32, ptid);
+ __NON_SAMPLE_SET_FIELD(fork, u64, time);
+)
+
+__FUNC_PROCESS_NON_SAMPLE(exit,
+ __NON_SAMPLE_SET_FIELD(fork, u32, pid);
+ __NON_SAMPLE_SET_FIELD(fork, u32, ppid);
+ __NON_SAMPLE_SET_FIELD(fork, u32, tid);
+ __NON_SAMPLE_SET_FIELD(fork, u32, ptid);
+ __NON_SAMPLE_SET_FIELD(fork, u64, time);
+)
#undef __NON_SAMPLE_SET_FIELD
#undef __FUNC_PROCESS_NON_SAMPLE
@@ -1123,6 +1140,22 @@ __FUNC_ADD_NON_SAMPLE_EVENT_CLASS(comm,
__NON_SAMPLE_ADD_FIELD(string, comm);
)
+__FUNC_ADD_NON_SAMPLE_EVENT_CLASS(fork,
+ __NON_SAMPLE_ADD_FIELD(u32, pid);
+ __NON_SAMPLE_ADD_FIELD(u32, ppid);
+ __NON_SAMPLE_ADD_FIELD(u32, tid);
+ __NON_SAMPLE_ADD_FIELD(u32, ptid);
+ __NON_SAMPLE_ADD_FIELD(u64, time);
+)
+
+__FUNC_ADD_NON_SAMPLE_EVENT_CLASS(exit,
+ __NON_SAMPLE_ADD_FIELD(u32, pid);
+ __NON_SAMPLE_ADD_FIELD(u32, ppid);
+ __NON_SAMPLE_ADD_FIELD(u32, tid);
+ __NON_SAMPLE_ADD_FIELD(u32, ptid);
+ __NON_SAMPLE_ADD_FIELD(u64, time);
+)
+
#undef __NON_SAMPLE_ADD_FIELD
#undef __FUNC_ADD_NON_SAMPLE_EVENT_CLASS
@@ -1134,6 +1167,12 @@ static int setup_non_sample_events(struct ctf_writer *cw,
ret = add_comm_event(cw);
if (ret)
return ret;
+ ret = add_exit_event(cw);
+ if (ret)
+ return ret;
+ ret = add_fork_event(cw);
+ if (ret)
+ return ret;
return 0;
}
@@ -1432,8 +1471,11 @@ int bt_convert__perf2ctf(const char *input, const char *path,
struct ctf_writer *cw = &c.writer;
int err = -1;
- if (opts->non_sample)
+ if (opts->non_sample) {
c.tool.comm = process_comm_event;
+ c.tool.exit = process_exit_event;
+ c.tool.fork = process_fork_event;
+ }
perf_config(convert__config, &c);
--
1.8.3.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 5/6] perf ctf: Add '--all' option for 'perf data convert'
2016-06-23 9:16 ` [PATCH 5/6] perf ctf: Add '--all' option for 'perf data convert' Wang Nan
@ 2016-06-24 7:07 ` Jiri Olsa
0 siblings, 0 replies; 9+ messages in thread
From: Jiri Olsa @ 2016-06-24 7:07 UTC (permalink / raw)
To: Wang Nan; +Cc: acme, linux-kernel, pi3orama, Arnaldo Carvalho de Melo
On Thu, Jun 23, 2016 at 09:16:22AM +0000, Wang Nan wrote:
> After this patch, 'perf data convert' convert comm events to output
> CTF stream.
>
> Result:
>
> # perf record -a sleep 1
> [ perf record: Woken up 1 times to write data ]
> [ perf record: Captured and wrote 0.771 MB perf.data (79 samples) ]
>
> # perf data convert --to-ctf ./out.ctf
> [ perf data convert: Converted 'perf.data' into CTF data './out.ctf' ]
> [ perf data convert: Converted and wrote 0.004 MB (79 samples) ]
>
> # babeltrace ./out.ctf/
> [20:59:41.942633169] (+?.?????????) cycles:ppp: { cpu_id = 0 }, { perf_ip = 0xFFFFFFFF81065AF4, perf_tid = 0, perf_pid = 0, perf_period = 1 }
> [20:59:41.942636194] (+0.000003025) cycles:ppp: { cpu_id = 0 }, { perf_ip = 0xFFFFFFFF81065AF4, perf_tid = 0, perf_pid = 0, perf_period = 1 }
> ... // only sample event is converted
>
> # perf data convert --all --to-ctf ./out.ctf
> [ perf data convert: Converted 'perf.data' into CTF data './out.ctf' ]
> [ perf data convert: Converted and wrote 0.004 MB (79 samples) ]
>
> # babeltrace ./out.ctf/
> [00:00:00.000000000] (+?.?????????) perf_comm: { cpu_id = 0 }, { comm = "init", pid = 1, tid = 1 }
> [00:00:00.000000000] (+0.000000000) perf_comm: { cpu_id = 0 }, { comm = "kthreadd", pid = 2, tid = 2 }
> [00:00:00.000000000] (+0.000000000) perf_comm: { cpu_id = 0 }, { comm = "ksoftirqd/0", pid = 3, tid = 3 }
> ... // comm events are converted
>
> Signed-off-by: Wang Nan <wangnan0@huawei.com>
> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
> Cc: Jiri Olsa <jolsa@redhat.com>
> ---
> tools/perf/Documentation/perf-data.txt | 5 ++++-
> tools/perf/builtin-data.c | 1 +
> 2 files changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/tools/perf/Documentation/perf-data.txt b/tools/perf/Documentation/perf-data.txt
> index be8fa1a..f8ada39 100644
> --- a/tools/perf/Documentation/perf-data.txt
> +++ b/tools/perf/Documentation/perf-data.txt
> @@ -34,7 +34,10 @@ OPTIONS for 'convert'
> --verbose::
> Be more verbose (show counter open errors, etc).
>
> -SEE ALSO
> +--all::
> + Convert all events, including non-sample events (comm, fork, ...), to output.
> + Default is off, only convert samples.
you removed the 'SEE ALSO' header ;-)
> +
> --------
> linkperf:perf[1]
> [1] Common Trace Format - http://www.efficios.com/ctf
> diff --git a/tools/perf/builtin-data.c b/tools/perf/builtin-data.c
> index a011a56..a87c964 100644
> --- a/tools/perf/builtin-data.c
> +++ b/tools/perf/builtin-data.c
> @@ -65,6 +65,7 @@ static int cmd_data_convert(int argc, const char **argv,
> OPT_STRING(0, "to-ctf", &to_ctf, NULL, "Convert to CTF format"),
> #endif
> OPT_BOOLEAN('f', "force", &opts.force, "don't complain, do it"),
> + OPT_BOOLEAN(0, "all", &opts.non_sample, "Convert all events"),
IMO opts.all would suite better I think,
but we can always change it if needed
thanks,
jirka
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 4/6] perf ctf: Generate comm event to CTF output
2016-06-23 9:16 ` [PATCH 4/6] perf ctf: Generate comm event to CTF output Wang Nan
@ 2016-06-24 7:07 ` Jiri Olsa
0 siblings, 0 replies; 9+ messages in thread
From: Jiri Olsa @ 2016-06-24 7:07 UTC (permalink / raw)
To: Wang Nan; +Cc: acme, linux-kernel, pi3orama, Arnaldo Carvalho de Melo
On Thu, Jun 23, 2016 at 09:16:21AM +0000, Wang Nan wrote:
> If non_sample is selected, convert comm event to output CTF stream.
>
> setup_non_sample_events() is called if non_sample is selected. It creates
> a comm_class for comm event.
>
> Use macros to generate and process_comm_event and add_comm_event. These
> macros can be reused for other non-sample events.
>
> Signed-off-by: Wang Nan <wangnan0@huawei.com>
> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
> Cc: Jiri Olsa <jolsa@redhat.com>
> ---
> tools/perf/util/data-convert-bt.c | 108 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 108 insertions(+)
>
> diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
> index 0bc3ee2..bc6d42b 100644
> --- a/tools/perf/util/data-convert-bt.c
> +++ b/tools/perf/util/data-convert-bt.c
> @@ -68,6 +68,7 @@ struct ctf_writer {
> };
> struct bt_ctf_field_type *array[6];
> } data;
> + struct bt_ctf_event_class *comm_class;
> };
>
> struct convert {
> @@ -761,6 +762,55 @@ static int process_sample_event(struct perf_tool *tool,
> return cs ? 0 : -1;
> }
>
> +#define __NON_SAMPLE_SET_FIELD(_name, _type, _field) \
> +do { \
> + ret = value_set_##_type(cw, event, #_field, _event->_name._field);\
> + if (ret) \
> + return -1; \
> +} while(0)
> +
> +#define __FUNC_PROCESS_NON_SAMPLE(_name, body) \
> +static int process_##_name##_event(struct perf_tool *tool, \
> + union perf_event *_event, \
> + struct perf_sample *sample, \
> + struct machine *machine) \
> +{ \
> + struct convert *c = container_of(tool, struct convert, tool);\
> + struct ctf_writer *cw = &c->writer; \
> + struct bt_ctf_event_class *event_class = cw->_name##_class;\
> + struct bt_ctf_event *event; \
> + struct ctf_stream *cs; \
> + int ret; \
> + \
> + event = bt_ctf_event_create(event_class); \
> + if (!event) { \
> + pr_err("Failed to create an CTF event\n"); \
> + return -1; \
> + } \
> + \
> + bt_ctf_clock_set_time(cw->clock, sample->time); \
coudl you please also add the global stats update,
so we get the statistics straight at the end?
/* update stats */
c->events_count++;
c->events_size += _event->header.size;
thanks,
jirka
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2016-06-24 7:07 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-23 9:16 [PATCH 0/6] perf ctf: Convert comm, fork and exit events to CTF Wang Nan
2016-06-23 9:16 ` [PATCH 1/6] perf ctf: Add value_set_string() helper Wang Nan
2016-06-23 9:16 ` [PATCH 2/6] perf ctf: Pass convert options through structure Wang Nan
2016-06-23 9:16 ` [PATCH 3/6] perf ctf: Add non_sample option Wang Nan
2016-06-23 9:16 ` [PATCH 4/6] perf ctf: Generate comm event to CTF output Wang Nan
2016-06-24 7:07 ` Jiri Olsa
2016-06-23 9:16 ` [PATCH 5/6] perf ctf: Add '--all' option for 'perf data convert' Wang Nan
2016-06-24 7:07 ` Jiri Olsa
2016-06-23 9:16 ` [PATCH 6/6] perf ctf: Generate fork and exit events to CTF output Wang Nan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).