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__synthesize_namespaces(struct perf_tool *tool, union perf_event *event, pid_t pid, pid_t tgid, perf_event__handler_t process, struct machine *machine) { u32 idx; struct perf_ns_link_info *ns_link_info; if (!tool || !tool->namespace_events) return 0; memset(&event->namespaces, 0, (sizeof(event->namespaces) + (NR_NAMESPACES * sizeof(struct perf_ns_link_info)) + machine->id_hdr_size)); event->namespaces.pid = tgid; event->namespaces.tid = pid; event->namespaces.nr_namespaces = NR_NAMESPACES; ns_link_info = event->namespaces.link_info; for (idx = 0; idx < event->namespaces.nr_namespaces; idx++) perf_event__get_ns_link_info(pid, perf_ns__name(idx), &ns_link_info[idx]); event->namespaces.header.type = PERF_RECORD_NAMESPACES; event->namespaces.header.size = (sizeof(event->namespaces) + (NR_NAMESPACES * sizeof(struct perf_ns_link_info)) + machine->id_hdr_size); if (perf_tool__process_synth_event(tool, event, machine, process) != 0) return -1; return 0; }