[PATCH 2/4] perf tools: pass thread info in event synthesization

From: kan . liang
Date: Fri Oct 13 2017 - 10:10:50 EST


From: Kan Liang <Kan.liang@xxxxxxxxx>

Pass the thread idx to process function, which is used by the following
patch.

Signed-off-by: Kan Liang <Kan.liang@xxxxxxxxx>
---
tools/perf/builtin-record.c | 4 +-
tools/perf/tests/dwarf-unwind.c | 3 +-
tools/perf/util/event.c | 98 ++++++++++++++++++++++++++---------------
tools/perf/util/event.h | 9 ++--
4 files changed, 72 insertions(+), 42 deletions(-)

diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index f53c1163..4ede9bf 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -922,7 +922,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
tgid = perf_event__synthesize_comm(tool, event,
rec->evlist->workload.pid,
process_synthesized_event,
- machine);
+ machine, NULL);
free(event);

if (tgid == -1)
@@ -942,7 +942,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
perf_event__synthesize_namespaces(tool, event,
rec->evlist->workload.pid,
tgid, process_synthesized_event,
- machine);
+ machine, NULL);
free(event);

perf_evlist__start_workload(rec->evlist);
diff --git a/tools/perf/tests/dwarf-unwind.c b/tools/perf/tests/dwarf-unwind.c
index 5ed2271..792c277 100644
--- a/tools/perf/tests/dwarf-unwind.c
+++ b/tools/perf/tests/dwarf-unwind.c
@@ -34,7 +34,8 @@ static int init_live_machine(struct machine *machine)
pid_t pid = getpid();

return perf_event__synthesize_mmap_events(NULL, &event, pid, pid,
- mmap_handler, machine, true, 500);
+ mmap_handler, machine,
+ true, 500, NULL);
}

#define MAX_STACK 8
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index fd523ca7..43e1dfa 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -90,7 +90,8 @@ static const char *perf_ns__name(unsigned int id)
static int perf_tool__process_synth_event(struct perf_tool *tool,
union perf_event *event,
struct machine *machine,
- perf_event__handler_t process)
+ perf_event__handler_t process,
+ struct thread_info *thread)
{
struct perf_sample synth_sample = {
.pid = -1,
@@ -102,7 +103,7 @@ static int perf_tool__process_synth_event(struct perf_tool *tool,
.cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK,
};

- return process(tool, event, &synth_sample, machine, NULL);
+ return process(tool, event, &synth_sample, machine, thread);
};

/*
@@ -219,14 +220,16 @@ static int perf_event__prepare_comm(union perf_event *event, pid_t pid,
pid_t perf_event__synthesize_comm(struct perf_tool *tool,
union perf_event *event, pid_t pid,
perf_event__handler_t process,
- struct machine *machine)
+ struct machine *machine,
+ struct thread_info *thread)
{
pid_t tgid, ppid;

if (perf_event__prepare_comm(event, pid, machine, &tgid, &ppid) != 0)
return -1;

- if (perf_tool__process_synth_event(tool, event, machine, process) != 0)
+ if (perf_tool__process_synth_event(tool, event, machine,
+ process, thread) != 0)
return -1;

return tgid;
@@ -249,7 +252,8 @@ 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)
+ struct machine *machine,
+ struct thread_info *thread)
{
u32 idx;
struct perf_ns_link_info *ns_link_info;
@@ -278,7 +282,8 @@ int perf_event__synthesize_namespaces(struct perf_tool *tool,
(NR_NAMESPACES * sizeof(struct perf_ns_link_info)) +
machine->id_hdr_size);

- if (perf_tool__process_synth_event(tool, event, machine, process) != 0)
+ if (perf_tool__process_synth_event(tool, event, machine,
+ process, thread) != 0)
return -1;

return 0;
@@ -288,7 +293,8 @@ static int perf_event__synthesize_fork(struct perf_tool *tool,
union perf_event *event,
pid_t pid, pid_t tgid, pid_t ppid,
perf_event__handler_t process,
- struct machine *machine)
+ struct machine *machine,
+ struct thread_info *thread)
{
memset(&event->fork, 0, sizeof(event->fork) + machine->id_hdr_size);

@@ -310,7 +316,8 @@ static int perf_event__synthesize_fork(struct perf_tool *tool,

event->fork.header.size = (sizeof(event->fork) + machine->id_hdr_size);

- if (perf_tool__process_synth_event(tool, event, machine, process) != 0)
+ if (perf_tool__process_synth_event(tool, event, machine,
+ process, thread) != 0)
return -1;

return 0;
@@ -322,7 +329,8 @@ int perf_event__synthesize_mmap_events(struct perf_tool *tool,
perf_event__handler_t process,
struct machine *machine,
bool mmap_data,
- unsigned int proc_map_timeout)
+ unsigned int proc_map_timeout,
+ struct thread_info *thread)
{
char filename[PATH_MAX];
FILE *fp;
@@ -444,7 +452,8 @@ int perf_event__synthesize_mmap_events(struct perf_tool *tool,
event->mmap2.pid = tgid;
event->mmap2.tid = pid;

- if (perf_tool__process_synth_event(tool, event, machine, process) != 0) {
+ if (perf_tool__process_synth_event(tool, event, machine,
+ process, thread) != 0) {
rc = -1;
break;
}
@@ -502,7 +511,8 @@ int perf_event__synthesize_modules(struct perf_tool *tool,

memcpy(event->mmap.filename, pos->dso->long_name,
pos->dso->long_name_len + 1);
- if (perf_tool__process_synth_event(tool, event, machine, process) != 0) {
+ if (perf_tool__process_synth_event(tool, event, machine,
+ process, NULL) != 0) {
rc = -1;
break;
}
@@ -521,7 +531,8 @@ static int __event__synthesize_thread(union perf_event *comm_event,
struct perf_tool *tool,
struct machine *machine,
bool mmap_data,
- unsigned int proc_map_timeout)
+ unsigned int proc_map_timeout,
+ struct thread_info *thread)
{
char filename[PATH_MAX];
DIR *tasks;
@@ -532,19 +543,22 @@ static int __event__synthesize_thread(union perf_event *comm_event,
/* special case: only send one comm event using passed in pid */
if (!full) {
tgid = perf_event__synthesize_comm(tool, comm_event, pid,
- process, machine);
+ process, machine, thread);

if (tgid == -1)
return -1;

- if (perf_event__synthesize_namespaces(tool, namespaces_event, pid,
- tgid, process, machine) < 0)
+ if (perf_event__synthesize_namespaces(tool, namespaces_event,
+ pid, tgid, process,
+ machine, thread) < 0)
return -1;


- return perf_event__synthesize_mmap_events(tool, mmap_event, pid, tgid,
- process, machine, mmap_data,
- proc_map_timeout);
+ return perf_event__synthesize_mmap_events(tool, mmap_event,
+ pid, tgid, process,
+ machine, mmap_data,
+ proc_map_timeout,
+ thread);
}

if (machine__is_default_guest(machine))
@@ -572,25 +586,30 @@ static int __event__synthesize_thread(union perf_event *comm_event,
&tgid, &ppid) != 0)
break;

- if (perf_event__synthesize_fork(tool, fork_event, _pid, tgid,
- ppid, process, machine) < 0)
+ if (perf_event__synthesize_fork(tool, fork_event, _pid,
+ tgid, ppid, process,
+ machine, thread) < 0)
break;

- if (perf_event__synthesize_namespaces(tool, namespaces_event, _pid,
- tgid, process, machine) < 0)
+ if (perf_event__synthesize_namespaces(tool, namespaces_event,
+ _pid, tgid, process,
+ machine, thread) < 0)
break;

/*
* Send the prepared comm event
*/
- if (perf_tool__process_synth_event(tool, comm_event, machine, process) != 0)
+ if (perf_tool__process_synth_event(tool, comm_event, machine,
+ process, thread) != 0)
break;

rc = 0;
if (_pid == pid) {
/* process the parent's maps too */
- rc = perf_event__synthesize_mmap_events(tool, mmap_event, pid, tgid,
- process, machine, mmap_data, proc_map_timeout);
+ rc = perf_event__synthesize_mmap_events(tool,
+ mmap_event, pid, tgid,
+ process, machine, mmap_data,
+ proc_map_timeout, thread);
if (rc)
break;
}
@@ -633,9 +652,10 @@ int perf_event__synthesize_thread_map(struct perf_tool *tool,
for (thread = 0; thread < threads->nr; ++thread) {
if (__event__synthesize_thread(comm_event, mmap_event,
fork_event, namespaces_event,
- thread_map__pid(threads, thread), 0,
- process, tool, machine,
- mmap_data, proc_map_timeout)) {
+ thread_map__pid(threads, thread),
+ 0, process, tool, machine,
+ mmap_data, proc_map_timeout,
+ NULL)) {
err = -1;
break;
}
@@ -658,10 +678,13 @@ int perf_event__synthesize_thread_map(struct perf_tool *tool,
/* if not, generate events for it */
if (need_leader &&
__event__synthesize_thread(comm_event, mmap_event,
- fork_event, namespaces_event,
+ fork_event,
+ namespaces_event,
comm_event->comm.pid, 0,
process, tool, machine,
- mmap_data, proc_map_timeout)) {
+ mmap_data,
+ proc_map_timeout,
+ NULL)) {
err = -1;
break;
}
@@ -684,8 +707,8 @@ static int __perf_event__synthesize_threads(struct perf_tool *tool,
bool mmap_data,
unsigned int proc_map_timeout,
struct dirent **dirent,
- int start,
- int num)
+ int start, int num,
+ struct thread_info *thread)
{
union perf_event *comm_event, *mmap_event, *fork_event;
union perf_event *namespaces_event;
@@ -727,7 +750,7 @@ static int __perf_event__synthesize_threads(struct perf_tool *tool,
__event__synthesize_thread(comm_event, mmap_event, fork_event,
namespaces_event, pid, 1, process,
tool, machine, mmap_data,
- proc_map_timeout);
+ proc_map_timeout, thread);
}
err = 0;

@@ -751,6 +774,7 @@ struct synthesize_threads_arg {
struct dirent **dirent;
int num;
int start;
+ struct thread_info thread;
};

static void *synthesize_threads_worker(void *arg)
@@ -760,7 +784,7 @@ static void *synthesize_threads_worker(void *arg)
__perf_event__synthesize_threads(args->tool, args->process,
args->machine, args->mmap_data,
args->proc_map_timeout, args->dirent,
- args->start, args->num);
+ args->start, args->num, &args->thread);
return NULL;
}

@@ -799,7 +823,7 @@ int perf_event__synthesize_threads(struct perf_tool *tool,
err = __perf_event__synthesize_threads(tool, process,
machine, mmap_data,
proc_map_timeout,
- dirent, base, n);
+ dirent, base, n, NULL);
goto free_dirent;
}
if (thread_nr > n)
@@ -822,6 +846,7 @@ int perf_event__synthesize_threads(struct perf_tool *tool,
args[i].mmap_data = mmap_data;
args[i].proc_map_timeout = proc_map_timeout;
args[i].dirent = dirent;
+ args[i].thread.idx = i;
}
for (i = 0; i < m; i++) {
args[i].num = num_per_thread + 1;
@@ -940,7 +965,8 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
event->mmap.len = map->end - event->mmap.start;
event->mmap.pid = machine->pid;

- err = perf_tool__process_synth_event(tool, event, machine, process);
+ err = perf_tool__process_synth_event(tool, event, machine,
+ process, NULL);
free(event);

return err;
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 200f3f8..6e7b08b3 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -785,13 +785,15 @@ int perf_event__synthesize_sample(union perf_event *event, u64 type,
pid_t perf_event__synthesize_comm(struct perf_tool *tool,
union perf_event *event, pid_t pid,
perf_event__handler_t process,
- struct machine *machine);
+ struct machine *machine,
+ struct thread_info *thread);

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);
+ struct machine *machine,
+ struct thread_info *thread);

int perf_event__synthesize_mmap_events(struct perf_tool *tool,
union perf_event *event,
@@ -799,7 +801,8 @@ int perf_event__synthesize_mmap_events(struct perf_tool *tool,
perf_event__handler_t process,
struct machine *machine,
bool mmap_data,
- unsigned int proc_map_timeout);
+ unsigned int proc_map_timeout,
+ struct thread_info *thread);

size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp);
size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp);
--
2.7.4