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) {
                pr_err("problem processing %d event, skipping it.\n",
                       event->header.type);
 
                                struct perf_evsel *evsel,
                                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) {
                pr_debug("problem processing %d event, skipping it.\n",
 
        if (skip_sample(kvm, sample))
                return 0;
 
-       thread = machine__findnew_thread(machine, sample->tid);
+       thread = machine__findnew_thread(machine, sample->pid, sample->tid);
        if (thread == NULL) {
                pr_debug("problem processing %d event, skipping it.\n",
                        event->header.type);
 
                                struct perf_evsel *evsel,
                                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) {
                pr_debug("problem processing %d event, skipping it.\n",
 
 {
        struct thread *child, *parent;
 
-       child = machine__findnew_thread(machine, event->fork.tid);
-       parent = machine__findnew_thread(machine, event->fork.ptid);
+       child = machine__findnew_thread(machine, event->fork.pid,
+                                       event->fork.tid);
+       parent = machine__findnew_thread(machine, event->fork.ppid,
+                                        event->fork.ptid);
 
        if (child == NULL || parent == NULL) {
                pr_debug("thread does not exist on fork event: child %p, parent %p\n",
                return -1;
        }
 
-       sched_out = machine__findnew_thread(machine, prev_pid);
-       sched_in = machine__findnew_thread(machine, next_pid);
+       sched_out = machine__findnew_thread(machine, 0, prev_pid);
+       sched_in = machine__findnew_thread(machine, 0, next_pid);
 
        out_events = thread_atoms_search(&sched->atom_root, sched_out, &sched->cmp_pid);
        if (!out_events) {
 {
        const u32 pid      = perf_evsel__intval(evsel, sample, "pid");
        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);
        u64 timestamp = sample->time;
        int cpu = sample->cpu;
        if (!success)
                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);
        if (!atoms) {
                if (thread_atoms_insert(sched, wakee))
        if (sched->profile_cpu == -1)
                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);
        if (!atoms) {
                if (thread_atoms_insert(sched, migrant))
                return -1;
        }
 
-       sched_out = machine__findnew_thread(machine, prev_pid);
-       sched_in = machine__findnew_thread(machine, next_pid);
+       sched_out = machine__findnew_thread(machine, 0, prev_pid);
+       sched_in = machine__findnew_thread(machine, 0, next_pid);
 
        sched->curr_thread[this_cpu] = sched_in;
 
 
                                struct machine *machine)
 {
        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) {
                pr_debug("problem processing %d event, skipping it.\n",
 
        if (sc->filtered)
                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);
        if (ttrace == NULL)
                return -1;
        if (sc->filtered)
                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);
        if (ttrace == NULL)
                return -1;
 {
         u64 runtime = perf_evsel__intval(evsel, sample, "runtime");
        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);
 
        if (ttrace == NULL)
 
                return -1;
        }
 
-       thread = machine__findnew_thread(machine, sample.pid);
+       thread = machine__findnew_thread(machine, sample.pid, sample.pid);
        if (!thread) {
                pr_debug("machine__findnew_thread failed\n");
                return -1;
                goto out_err;
        }
 
-       thread = machine__findnew_thread(machine, pid);
+       thread = machine__findnew_thread(machine, pid, pid);
        if (!thread) {
                pr_debug("machine__findnew_thread failed\n");
                goto out_err;
 
        for (i = 0; i < ARRAY_SIZE(fake_threads); i++) {
                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)
                        goto out;
 
 
 {
        struct addr_location al;
        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) {
                pr_err("problem processing %d event, skipping it.\n",
                                       __maybe_unused,
                                       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,
                    event->fork.ppid, event->fork.ptid);
 
                                  struct perf_sample *sample)
 {
        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)
                return -1;
 
                return -ENOMEM;
 
        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];
 
                if (thread == NULL)
        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)
 
 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)
                perf_event__fprintf_comm(event, stdout);
                return 0;
        }
 
-       thread = machine__findnew_thread(machine, event->mmap.pid);
+       thread = machine__findnew_thread(machine, event->mmap.pid,
+                                        event->mmap.pid);
        if (thread == NULL)
                goto out_problem;
 
 int machine__process_fork_event(struct machine *machine, union perf_event *event)
 {
        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 (thread != NULL)
                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)
                perf_event__fprintf_task(event, stdout);
 
 
        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);
 
 
 
 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)