Skip to content

Commit 5b92fc0

Browse files
captain5050acmel
authored andcommitted
perf json: Pipe mode --to-ctf support
In pipe mode the environment may not be fully initialized so be robust to fields being NULL. Add default handling of attr events, use the feature events to populate the ctf writer environment. Signed-off-by: Ian Rogers <irogers@google.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Derek Foreman <derek.foreman@collabora.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@linaro.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
1 parent 6db2f7c commit 5b92fc0

1 file changed

Lines changed: 52 additions & 2 deletions

File tree

tools/perf/util/data-convert-bt.c

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "clockid.h"
3636
#include "util/sample.h"
3737
#include "util/time-utils.h"
38+
#include "header.h"
3839

3940
#ifdef HAVE_LIBTRACEEVENT
4041
#include <event-parse.h>
@@ -1338,7 +1339,8 @@ static void cleanup_events(struct perf_session *session)
13381339
struct evsel_priv *priv;
13391340

13401341
priv = evsel->priv;
1341-
bt_ctf_event_class_put(priv->event_class);
1342+
if (priv)
1343+
bt_ctf_event_class_put(priv->event_class);
13421344
zfree(&evsel->priv);
13431345
}
13441346

@@ -1387,7 +1389,7 @@ static int ctf_writer__setup_env(struct ctf_writer *cw,
13871389

13881390
#define ADD(__n, __v) \
13891391
do { \
1390-
if (bt_ctf_writer_add_environment_field(writer, __n, __v)) \
1392+
if (__v && bt_ctf_writer_add_environment_field(writer, __n, __v)) \
13911393
return -1; \
13921394
} while (0)
13931395

@@ -1403,6 +1405,52 @@ do { \
14031405
return 0;
14041406
}
14051407

1408+
static int process_feature_event(const struct perf_tool *tool,
1409+
struct perf_session *session,
1410+
union perf_event *event)
1411+
{
1412+
struct convert *c = container_of(tool, struct convert, tool);
1413+
struct ctf_writer *cw = &c->writer;
1414+
struct perf_record_header_feature *fe = &event->feat;
1415+
1416+
if (event->feat.feat_id < HEADER_LAST_FEATURE) {
1417+
int ret = perf_event__process_feature(session, event);
1418+
1419+
if (ret)
1420+
return ret;
1421+
}
1422+
1423+
switch (fe->feat_id) {
1424+
case HEADER_HOSTNAME:
1425+
if (session->header.env.hostname) {
1426+
return bt_ctf_writer_add_environment_field(cw->writer, "host",
1427+
session->header.env.hostname);
1428+
}
1429+
break;
1430+
case HEADER_OSRELEASE:
1431+
if (session->header.env.os_release) {
1432+
return bt_ctf_writer_add_environment_field(cw->writer, "release",
1433+
session->header.env.os_release);
1434+
}
1435+
break;
1436+
case HEADER_VERSION:
1437+
if (session->header.env.version) {
1438+
return bt_ctf_writer_add_environment_field(cw->writer, "version",
1439+
session->header.env.version);
1440+
}
1441+
break;
1442+
case HEADER_ARCH:
1443+
if (session->header.env.arch) {
1444+
return bt_ctf_writer_add_environment_field(cw->writer, "machine",
1445+
session->header.env.arch);
1446+
}
1447+
break;
1448+
default:
1449+
break;
1450+
}
1451+
return 0;
1452+
}
1453+
14061454
static int ctf_writer__setup_clock(struct ctf_writer *cw,
14071455
struct perf_session *session,
14081456
bool tod)
@@ -1635,6 +1683,8 @@ int bt_convert__perf2ctf(const char *input, const char *path,
16351683
c.tool.tracing_data = perf_event__process_tracing_data;
16361684
c.tool.build_id = perf_event__process_build_id;
16371685
c.tool.namespaces = perf_event__process_namespaces;
1686+
c.tool.attr = perf_event__process_attr;
1687+
c.tool.feature = process_feature_event;
16381688
c.tool.ordering_requires_timestamps = true;
16391689

16401690
if (opts->all) {

0 commit comments

Comments
 (0)