perf tools: Add PERF_RECORD_NAMESPACES to include namespaces related info
Introduce a new option to record PERF_RECORD_NAMESPACES events emitted by the kernel when fork, clone, setns or unshare are invoked. And update perf-record documentation with the new option to record namespace events. Committer notes: Combined it with a later patch to allow printing it via 'perf report -D' and be able to test the feature introduced in this patch. Had to move here also perf_ns__name(), that was introduced in another later patch. Also used PRIu64 and PRIx64 to fix the build in some enfironments wrt: util/event.c:1129:39: error: format '%lx' expects argument of type 'long unsigned int', but argument 6 has type 'long long unsigned int' [-Werror=format=] ret += fprintf(fp, "%u/%s: %lu/0x%lx%s", idx ^ Testing it: # perf record --namespaces -a ^C[ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 1.083 MB perf.data (423 samples) ] # # perf report -D <SNIP> 3 2028902078892 0x115140 [0xa0]: PERF_RECORD_NAMESPACES 14783/14783 - nr_namespaces: 7 [0/net: 3/0xf0000081, 1/uts: 3/0xeffffffe, 2/ipc: 3/0xefffffff, 3/pid: 3/0xeffffffc, 4/user: 3/0xeffffffd, 5/mnt: 3/0xf0000000, 6/cgroup: 3/0xeffffffb] 0x1151e0 [0x30]: event: 9 . . ... raw event: size 48 bytes . 0000: 09 00 00 00 02 00 30 00 c4 71 82 68 0c 7f 00 00 ......0..q.h.... . 0010: a9 39 00 00 a9 39 00 00 94 28 fe 63 d8 01 00 00 .9...9...(.c.... . 0020: 03 00 00 00 00 00 00 00 ce c4 02 00 00 00 00 00 ................ <SNIP> NAMESPACES events: 1 <SNIP> # Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Alexei Starovoitov <ast@fb.com> Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com> Cc: Aravinda Prasad <aravinda@linux.vnet.ibm.com> Cc: Brendan Gregg <brendan.d.gregg@gmail.com> Cc: Daniel Borkmann <daniel@iogearbox.net> Cc: Eric Biederman <ebiederm@xmission.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Sargun Dhillon <sargun@sargun.me> Cc: Steven Rostedt <rostedt@goodmis.org> Link: http://lkml.kernel.org/r/148891930386.25309.18412039920746995488.stgit@hbathini.in.ibm.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:

committed by
Arnaldo Carvalho de Melo

parent
e422267322
commit
f3b3614a28
@@ -31,6 +31,7 @@ static const char *perf_event__names[] = {
|
||||
[PERF_RECORD_LOST_SAMPLES] = "LOST_SAMPLES",
|
||||
[PERF_RECORD_SWITCH] = "SWITCH",
|
||||
[PERF_RECORD_SWITCH_CPU_WIDE] = "SWITCH_CPU_WIDE",
|
||||
[PERF_RECORD_NAMESPACES] = "NAMESPACES",
|
||||
[PERF_RECORD_HEADER_ATTR] = "ATTR",
|
||||
[PERF_RECORD_HEADER_EVENT_TYPE] = "EVENT_TYPE",
|
||||
[PERF_RECORD_HEADER_TRACING_DATA] = "TRACING_DATA",
|
||||
@@ -49,6 +50,16 @@ static const char *perf_event__names[] = {
|
||||
[PERF_RECORD_TIME_CONV] = "TIME_CONV",
|
||||
};
|
||||
|
||||
static const char *perf_ns__names[] = {
|
||||
[NET_NS_INDEX] = "net",
|
||||
[UTS_NS_INDEX] = "uts",
|
||||
[IPC_NS_INDEX] = "ipc",
|
||||
[PID_NS_INDEX] = "pid",
|
||||
[USER_NS_INDEX] = "user",
|
||||
[MNT_NS_INDEX] = "mnt",
|
||||
[CGROUP_NS_INDEX] = "cgroup",
|
||||
};
|
||||
|
||||
const char *perf_event__name(unsigned int id)
|
||||
{
|
||||
if (id >= ARRAY_SIZE(perf_event__names))
|
||||
@@ -58,6 +69,13 @@ const char *perf_event__name(unsigned int id)
|
||||
return perf_event__names[id];
|
||||
}
|
||||
|
||||
static const char *perf_ns__name(unsigned int id)
|
||||
{
|
||||
if (id >= ARRAY_SIZE(perf_ns__names))
|
||||
return "UNKNOWN";
|
||||
return perf_ns__names[id];
|
||||
}
|
||||
|
||||
static int perf_tool__process_synth_event(struct perf_tool *tool,
|
||||
union perf_event *event,
|
||||
struct machine *machine,
|
||||
@@ -1008,6 +1026,33 @@ size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp)
|
||||
return fprintf(fp, "%s: %s:%d/%d\n", s, event->comm.comm, event->comm.pid, event->comm.tid);
|
||||
}
|
||||
|
||||
size_t perf_event__fprintf_namespaces(union perf_event *event, FILE *fp)
|
||||
{
|
||||
size_t ret = 0;
|
||||
struct perf_ns_link_info *ns_link_info;
|
||||
u32 nr_namespaces, idx;
|
||||
|
||||
ns_link_info = event->namespaces.link_info;
|
||||
nr_namespaces = event->namespaces.nr_namespaces;
|
||||
|
||||
ret += fprintf(fp, " %d/%d - nr_namespaces: %u\n\t\t[",
|
||||
event->namespaces.pid,
|
||||
event->namespaces.tid,
|
||||
nr_namespaces);
|
||||
|
||||
for (idx = 0; idx < nr_namespaces; idx++) {
|
||||
if (idx && (idx % 4 == 0))
|
||||
ret += fprintf(fp, "\n\t\t ");
|
||||
|
||||
ret += fprintf(fp, "%u/%s: %" PRIu64 "/%#" PRIx64 "%s", idx,
|
||||
perf_ns__name(idx), (u64)ns_link_info[idx].dev,
|
||||
(u64)ns_link_info[idx].ino,
|
||||
((idx + 1) != nr_namespaces) ? ", " : "]\n");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int perf_event__process_comm(struct perf_tool *tool __maybe_unused,
|
||||
union perf_event *event,
|
||||
struct perf_sample *sample,
|
||||
@@ -1016,6 +1061,14 @@ int perf_event__process_comm(struct perf_tool *tool __maybe_unused,
|
||||
return machine__process_comm_event(machine, event, sample);
|
||||
}
|
||||
|
||||
int perf_event__process_namespaces(struct perf_tool *tool __maybe_unused,
|
||||
union perf_event *event,
|
||||
struct perf_sample *sample,
|
||||
struct machine *machine)
|
||||
{
|
||||
return machine__process_namespaces_event(machine, event, sample);
|
||||
}
|
||||
|
||||
int perf_event__process_lost(struct perf_tool *tool __maybe_unused,
|
||||
union perf_event *event,
|
||||
struct perf_sample *sample,
|
||||
@@ -1196,6 +1249,9 @@ size_t perf_event__fprintf(union perf_event *event, FILE *fp)
|
||||
case PERF_RECORD_MMAP:
|
||||
ret += perf_event__fprintf_mmap(event, fp);
|
||||
break;
|
||||
case PERF_RECORD_NAMESPACES:
|
||||
ret += perf_event__fprintf_namespaces(event, fp);
|
||||
break;
|
||||
case PERF_RECORD_MMAP2:
|
||||
ret += perf_event__fprintf_mmap2(event, fp);
|
||||
break;
|
||||
|
Reference in New Issue
Block a user