Commit 314add6b authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo

perf tools: change machine__findnew_thread() to set thread pid

Add a new parameter for 'pid' to machine__findnew_thread().
Change callers to pass 'pid' when it is known.

Note that callers sometimes want to find the main thread
which has the memory maps.  The main thread has tid == pid
so the usage in that case is:

	machine__findnew_thread(machine, pid, pid)

whereas the usage to find the specific thread is:

	machine__findnew_thread(machine, pid, tid)
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Acked-by: default avatarDavid Ahern <dsahern@gmail.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1377591794-30553-2-git-send-email-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 00e4cb1c
...@@ -198,7 +198,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool, ...@@ -198,7 +198,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
thread = machine__findnew_thread(machine, event->ip.pid); thread = machine__findnew_thread(machine, event->ip.pid, event->ip.pid);
if (thread == NULL) { if (thread == NULL) {
pr_err("problem processing %d event, skipping it.\n", pr_err("problem processing %d event, skipping it.\n",
event->header.type); event->header.type);
......
...@@ -305,7 +305,8 @@ static int process_sample_event(struct perf_tool *tool __maybe_unused, ...@@ -305,7 +305,8 @@ static int process_sample_event(struct perf_tool *tool __maybe_unused,
struct perf_evsel *evsel, struct perf_evsel *evsel,
struct machine *machine) struct machine *machine)
{ {
struct thread *thread = machine__findnew_thread(machine, event->ip.pid); struct thread *thread = machine__findnew_thread(machine, event->ip.pid,
event->ip.pid);
if (thread == NULL) { if (thread == NULL) {
pr_debug("problem processing %d event, skipping it.\n", pr_debug("problem processing %d event, skipping it.\n",
......
...@@ -815,7 +815,7 @@ static int process_sample_event(struct perf_tool *tool, ...@@ -815,7 +815,7 @@ static int process_sample_event(struct perf_tool *tool,
if (skip_sample(kvm, sample)) if (skip_sample(kvm, sample))
return 0; return 0;
thread = machine__findnew_thread(machine, sample->tid); thread = machine__findnew_thread(machine, sample->pid, sample->tid);
if (thread == NULL) { if (thread == NULL) {
pr_debug("problem processing %d event, skipping it.\n", pr_debug("problem processing %d event, skipping it.\n",
event->header.type); event->header.type);
......
...@@ -805,7 +805,8 @@ static int process_sample_event(struct perf_tool *tool __maybe_unused, ...@@ -805,7 +805,8 @@ static int process_sample_event(struct perf_tool *tool __maybe_unused,
struct perf_evsel *evsel, struct perf_evsel *evsel,
struct machine *machine) struct machine *machine)
{ {
struct thread *thread = machine__findnew_thread(machine, sample->tid); struct thread *thread = machine__findnew_thread(machine, sample->pid,
sample->tid);
if (thread == NULL) { if (thread == NULL) {
pr_debug("problem processing %d event, skipping it.\n", pr_debug("problem processing %d event, skipping it.\n",
......
...@@ -724,8 +724,10 @@ static int replay_fork_event(struct perf_sched *sched, ...@@ -724,8 +724,10 @@ static int replay_fork_event(struct perf_sched *sched,
{ {
struct thread *child, *parent; struct thread *child, *parent;
child = machine__findnew_thread(machine, event->fork.tid); child = machine__findnew_thread(machine, event->fork.pid,
parent = machine__findnew_thread(machine, event->fork.ptid); event->fork.tid);
parent = machine__findnew_thread(machine, event->fork.ppid,
event->fork.ptid);
if (child == NULL || parent == NULL) { if (child == NULL || parent == NULL) {
pr_debug("thread does not exist on fork event: child %p, parent %p\n", pr_debug("thread does not exist on fork event: child %p, parent %p\n",
...@@ -934,8 +936,8 @@ static int latency_switch_event(struct perf_sched *sched, ...@@ -934,8 +936,8 @@ static int latency_switch_event(struct perf_sched *sched,
return -1; return -1;
} }
sched_out = machine__findnew_thread(machine, prev_pid); sched_out = machine__findnew_thread(machine, 0, prev_pid);
sched_in = machine__findnew_thread(machine, next_pid); sched_in = machine__findnew_thread(machine, 0, next_pid);
out_events = thread_atoms_search(&sched->atom_root, sched_out, &sched->cmp_pid); out_events = thread_atoms_search(&sched->atom_root, sched_out, &sched->cmp_pid);
if (!out_events) { if (!out_events) {
...@@ -978,7 +980,7 @@ static int latency_runtime_event(struct perf_sched *sched, ...@@ -978,7 +980,7 @@ static int latency_runtime_event(struct perf_sched *sched,
{ {
const u32 pid = perf_evsel__intval(evsel, sample, "pid"); const u32 pid = perf_evsel__intval(evsel, sample, "pid");
const u64 runtime = perf_evsel__intval(evsel, sample, "runtime"); const u64 runtime = perf_evsel__intval(evsel, sample, "runtime");
struct thread *thread = machine__findnew_thread(machine, pid); struct thread *thread = machine__findnew_thread(machine, 0, pid);
struct work_atoms *atoms = thread_atoms_search(&sched->atom_root, thread, &sched->cmp_pid); struct work_atoms *atoms = thread_atoms_search(&sched->atom_root, thread, &sched->cmp_pid);
u64 timestamp = sample->time; u64 timestamp = sample->time;
int cpu = sample->cpu; int cpu = sample->cpu;
...@@ -1016,7 +1018,7 @@ static int latency_wakeup_event(struct perf_sched *sched, ...@@ -1016,7 +1018,7 @@ static int latency_wakeup_event(struct perf_sched *sched,
if (!success) if (!success)
return 0; return 0;
wakee = machine__findnew_thread(machine, pid); wakee = machine__findnew_thread(machine, 0, pid);
atoms = thread_atoms_search(&sched->atom_root, wakee, &sched->cmp_pid); atoms = thread_atoms_search(&sched->atom_root, wakee, &sched->cmp_pid);
if (!atoms) { if (!atoms) {
if (thread_atoms_insert(sched, wakee)) if (thread_atoms_insert(sched, wakee))
...@@ -1070,7 +1072,7 @@ static int latency_migrate_task_event(struct perf_sched *sched, ...@@ -1070,7 +1072,7 @@ static int latency_migrate_task_event(struct perf_sched *sched,
if (sched->profile_cpu == -1) if (sched->profile_cpu == -1)
return 0; return 0;
migrant = machine__findnew_thread(machine, pid); migrant = machine__findnew_thread(machine, 0, pid);
atoms = thread_atoms_search(&sched->atom_root, migrant, &sched->cmp_pid); atoms = thread_atoms_search(&sched->atom_root, migrant, &sched->cmp_pid);
if (!atoms) { if (!atoms) {
if (thread_atoms_insert(sched, migrant)) if (thread_atoms_insert(sched, migrant))
...@@ -1289,8 +1291,8 @@ static int map_switch_event(struct perf_sched *sched, struct perf_evsel *evsel, ...@@ -1289,8 +1291,8 @@ static int map_switch_event(struct perf_sched *sched, struct perf_evsel *evsel,
return -1; return -1;
} }
sched_out = machine__findnew_thread(machine, prev_pid); sched_out = machine__findnew_thread(machine, 0, prev_pid);
sched_in = machine__findnew_thread(machine, next_pid); sched_in = machine__findnew_thread(machine, 0, next_pid);
sched->curr_thread[this_cpu] = sched_in; sched->curr_thread[this_cpu] = sched_in;
......
...@@ -501,7 +501,8 @@ static int process_sample_event(struct perf_tool *tool __maybe_unused, ...@@ -501,7 +501,8 @@ static int process_sample_event(struct perf_tool *tool __maybe_unused,
struct machine *machine) struct machine *machine)
{ {
struct addr_location al; struct addr_location al;
struct thread *thread = machine__findnew_thread(machine, event->ip.tid); struct thread *thread = machine__findnew_thread(machine, event->ip.pid,
event->ip.tid);
if (thread == NULL) { if (thread == NULL) {
pr_debug("problem processing %d event, skipping it.\n", pr_debug("problem processing %d event, skipping it.\n",
......
...@@ -521,7 +521,8 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel, ...@@ -521,7 +521,8 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,
if (sc->filtered) if (sc->filtered)
return 0; return 0;
thread = machine__findnew_thread(&trace->host, sample->tid); thread = machine__findnew_thread(&trace->host, sample->pid,
sample->tid);
ttrace = thread__trace(thread, trace->output); ttrace = thread__trace(thread, trace->output);
if (ttrace == NULL) if (ttrace == NULL)
return -1; return -1;
...@@ -572,7 +573,8 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel, ...@@ -572,7 +573,8 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
if (sc->filtered) if (sc->filtered)
return 0; return 0;
thread = machine__findnew_thread(&trace->host, sample->tid); thread = machine__findnew_thread(&trace->host, sample->pid,
sample->tid);
ttrace = thread__trace(thread, trace->output); ttrace = thread__trace(thread, trace->output);
if (ttrace == NULL) if (ttrace == NULL)
return -1; return -1;
...@@ -628,7 +630,9 @@ static int trace__sched_stat_runtime(struct trace *trace, struct perf_evsel *evs ...@@ -628,7 +630,9 @@ static int trace__sched_stat_runtime(struct trace *trace, struct perf_evsel *evs
{ {
u64 runtime = perf_evsel__intval(evsel, sample, "runtime"); u64 runtime = perf_evsel__intval(evsel, sample, "runtime");
double runtime_ms = (double)runtime / NSEC_PER_MSEC; double runtime_ms = (double)runtime / NSEC_PER_MSEC;
struct thread *thread = machine__findnew_thread(&trace->host, sample->tid); struct thread *thread = machine__findnew_thread(&trace->host,
sample->pid,
sample->tid);
struct thread_trace *ttrace = thread__trace(thread, trace->output); struct thread_trace *ttrace = thread__trace(thread, trace->output);
if (ttrace == NULL) if (ttrace == NULL)
......
...@@ -257,7 +257,7 @@ static int process_sample_event(struct machine *machine, ...@@ -257,7 +257,7 @@ static int process_sample_event(struct machine *machine,
return -1; return -1;
} }
thread = machine__findnew_thread(machine, sample.pid); thread = machine__findnew_thread(machine, sample.pid, sample.pid);
if (!thread) { if (!thread) {
pr_debug("machine__findnew_thread failed\n"); pr_debug("machine__findnew_thread failed\n");
return -1; return -1;
...@@ -446,7 +446,7 @@ static int do_test_code_reading(bool try_kcore) ...@@ -446,7 +446,7 @@ static int do_test_code_reading(bool try_kcore)
goto out_err; goto out_err;
} }
thread = machine__findnew_thread(machine, pid); thread = machine__findnew_thread(machine, pid, pid);
if (!thread) { if (!thread) {
pr_debug("machine__findnew_thread failed\n"); pr_debug("machine__findnew_thread failed\n");
goto out_err; goto out_err;
......
...@@ -88,7 +88,8 @@ static struct machine *setup_fake_machine(struct machines *machines) ...@@ -88,7 +88,8 @@ static struct machine *setup_fake_machine(struct machines *machines)
for (i = 0; i < ARRAY_SIZE(fake_threads); i++) { for (i = 0; i < ARRAY_SIZE(fake_threads); i++) {
struct thread *thread; struct thread *thread;
thread = machine__findnew_thread(machine, fake_threads[i].pid); thread = machine__findnew_thread(machine, fake_threads[i].pid,
fake_threads[i].pid);
if (thread == NULL) if (thread == NULL)
goto out; goto out;
......
...@@ -24,7 +24,8 @@ int build_id__mark_dso_hit(struct perf_tool *tool __maybe_unused, ...@@ -24,7 +24,8 @@ int build_id__mark_dso_hit(struct perf_tool *tool __maybe_unused,
{ {
struct addr_location al; struct addr_location al;
u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
struct thread *thread = machine__findnew_thread(machine, event->ip.pid); struct thread *thread = machine__findnew_thread(machine, event->ip.pid,
event->ip.pid);
if (thread == NULL) { if (thread == NULL) {
pr_err("problem processing %d event, skipping it.\n", pr_err("problem processing %d event, skipping it.\n",
...@@ -47,7 +48,9 @@ static int perf_event__exit_del_thread(struct perf_tool *tool __maybe_unused, ...@@ -47,7 +48,9 @@ static int perf_event__exit_del_thread(struct perf_tool *tool __maybe_unused,
__maybe_unused, __maybe_unused,
struct machine *machine) struct machine *machine)
{ {
struct thread *thread = machine__findnew_thread(machine, event->fork.tid); struct thread *thread = machine__findnew_thread(machine,
event->fork.pid,
event->fork.tid);
dump_printf("(%d:%d):(%d:%d)\n", event->fork.pid, event->fork.tid, dump_printf("(%d:%d):(%d:%d)\n", event->fork.pid, event->fork.tid,
event->fork.ppid, event->fork.ptid); event->fork.ppid, event->fork.ptid);
......
...@@ -686,7 +686,8 @@ int perf_event__preprocess_sample(const union perf_event *event, ...@@ -686,7 +686,8 @@ int perf_event__preprocess_sample(const union perf_event *event,
struct perf_sample *sample) struct perf_sample *sample)
{ {
u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
struct thread *thread = machine__findnew_thread(machine, event->ip.pid); struct thread *thread = machine__findnew_thread(machine, event->ip.pid,
event->ip.pid);
if (thread == NULL) if (thread == NULL)
return -1; return -1;
......
...@@ -32,7 +32,8 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid) ...@@ -32,7 +32,8 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
return -ENOMEM; return -ENOMEM;
if (pid != HOST_KERNEL_ID) { if (pid != HOST_KERNEL_ID) {
struct thread *thread = machine__findnew_thread(machine, pid); struct thread *thread = machine__findnew_thread(machine, 0,
pid);
char comm[64]; char comm[64];
if (thread == NULL) if (thread == NULL)
...@@ -302,9 +303,10 @@ static struct thread *__machine__findnew_thread(struct machine *machine, ...@@ -302,9 +303,10 @@ static struct thread *__machine__findnew_thread(struct machine *machine,
return th; return th;
} }
struct thread *machine__findnew_thread(struct machine *machine, pid_t tid) struct thread *machine__findnew_thread(struct machine *machine, pid_t pid,
pid_t tid)
{ {
return __machine__findnew_thread(machine, 0, tid, true); return __machine__findnew_thread(machine, pid, tid, true);
} }
struct thread *machine__find_thread(struct machine *machine, pid_t tid) struct thread *machine__find_thread(struct machine *machine, pid_t tid)
...@@ -314,7 +316,9 @@ struct thread *machine__find_thread(struct machine *machine, pid_t tid) ...@@ -314,7 +316,9 @@ struct thread *machine__find_thread(struct machine *machine, pid_t tid)
int machine__process_comm_event(struct machine *machine, union perf_event *event) int machine__process_comm_event(struct machine *machine, union perf_event *event)
{ {
struct thread *thread = machine__findnew_thread(machine, event->comm.tid); struct thread *thread = machine__findnew_thread(machine,
event->comm.pid,
event->comm.tid);
if (dump_trace) if (dump_trace)
perf_event__fprintf_comm(event, stdout); perf_event__fprintf_comm(event, stdout);
...@@ -1012,7 +1016,8 @@ int machine__process_mmap_event(struct machine *machine, union perf_event *event ...@@ -1012,7 +1016,8 @@ int machine__process_mmap_event(struct machine *machine, union perf_event *event
return 0; return 0;
} }
thread = machine__findnew_thread(machine, event->mmap.pid); thread = machine__findnew_thread(machine, event->mmap.pid,
event->mmap.pid);
if (thread == NULL) if (thread == NULL)
goto out_problem; goto out_problem;
...@@ -1051,13 +1056,16 @@ static void machine__remove_thread(struct machine *machine, struct thread *th) ...@@ -1051,13 +1056,16 @@ static void machine__remove_thread(struct machine *machine, struct thread *th)
int machine__process_fork_event(struct machine *machine, union perf_event *event) int machine__process_fork_event(struct machine *machine, union perf_event *event)
{ {
struct thread *thread = machine__find_thread(machine, event->fork.tid); struct thread *thread = machine__find_thread(machine, event->fork.tid);
struct thread *parent = machine__findnew_thread(machine, event->fork.ptid); struct thread *parent = machine__findnew_thread(machine,
event->fork.ppid,
event->fork.ptid);
/* if a thread currently exists for the thread id remove it */ /* if a thread currently exists for the thread id remove it */
if (thread != NULL) if (thread != NULL)
machine__remove_thread(machine, thread); machine__remove_thread(machine, thread);
thread = machine__findnew_thread(machine, event->fork.tid); thread = machine__findnew_thread(machine, event->fork.pid,
event->fork.tid);
if (dump_trace) if (dump_trace)
perf_event__fprintf_task(event, stdout); perf_event__fprintf_task(event, stdout);
......
...@@ -106,7 +106,8 @@ static inline bool machine__is_host(struct machine *machine) ...@@ -106,7 +106,8 @@ static inline bool machine__is_host(struct machine *machine)
return machine ? machine->pid == HOST_KERNEL_ID : false; return machine ? machine->pid == HOST_KERNEL_ID : false;
} }
struct thread *machine__findnew_thread(struct machine *machine, pid_t tid); struct thread *machine__findnew_thread(struct machine *machine, pid_t pid,
pid_t tid);
size_t machine__fprintf(struct machine *machine, FILE *fp); size_t machine__fprintf(struct machine *machine, FILE *fp);
......
...@@ -1099,7 +1099,7 @@ void perf_event_header__bswap(struct perf_event_header *self) ...@@ -1099,7 +1099,7 @@ void perf_event_header__bswap(struct perf_event_header *self)
struct thread *perf_session__findnew(struct perf_session *session, pid_t pid) struct thread *perf_session__findnew(struct perf_session *session, pid_t pid)
{ {
return machine__findnew_thread(&session->machines.host, pid); return machine__findnew_thread(&session->machines.host, 0, pid);
} }
static struct thread *perf_session__register_idle_thread(struct perf_session *self) static struct thread *perf_session__register_idle_thread(struct perf_session *self)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment