When machine__findnew_thread_time() creates a new thread, it puts the
thread in the missing_threads tree assuming it's rare case that missed
related task/mmap events during the recorded header file.

However this is not the case of live profiling - so it should be
treated differently.  This patch fixes NULL thread->mg reference in
case of missing threads in live profiling.

Signed-off-by: Namhyung Kim <namhy...@kernel.org>
---
 tools/perf/builtin-top.c |  5 ++++-
 tools/perf/util/event.c  | 24 ++++++++++++++++++------
 tools/perf/util/event.h  |  5 +++++
 3 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 818ae35cbd7b..2d75a7fab470 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -699,6 +699,7 @@ static void perf_event__process_sample(struct perf_tool 
*tool,
 {
        struct perf_top *top = container_of(tool, struct perf_top, tool);
        struct addr_location al;
+       struct thread *thread;
        int err;
 
        if (!machine && perf_guest) {
@@ -724,7 +725,9 @@ static void perf_event__process_sample(struct perf_tool 
*tool,
        if (event->header.misc & PERF_RECORD_MISC_EXACT_IP)
                top->exact_samples++;
 
-       if (perf_event__preprocess_sample(event, machine, &al, sample) < 0)
+       /* Always use current thread tree for live profiling */
+       thread = machine__findnew_thread(machine, sample->pid, sample->tid);
+       if (__perf_event__preprocess_sample(event, machine, thread, &al, 
sample) < 0)
                return;
 
        if (!top->kptr_restrict_warned &&
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index 3bb186a26314..452af8f4b0f3 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -863,14 +863,13 @@ void thread__find_addr_location_time(struct thread 
*thread, u8 cpumode,
                al->sym = NULL;
 }
 
-int perf_event__preprocess_sample(const union perf_event *event,
-                                 struct machine *machine,
-                                 struct addr_location *al,
-                                 struct perf_sample *sample)
+int __perf_event__preprocess_sample(const union perf_event *event,
+                                   struct machine *machine,
+                                   struct thread *thread,
+                                   struct addr_location *al,
+                                   struct perf_sample *sample)
 {
        u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
-       struct thread *thread = machine__findnew_thread_time(machine, 
sample->pid,
-                                                            sample->tid, 
sample->time);
 
        if (thread == NULL)
                return -1;
@@ -928,6 +927,19 @@ int perf_event__preprocess_sample(const union perf_event 
*event,
        return 0;
 }
 
+int perf_event__preprocess_sample(const union perf_event *event,
+                                 struct machine *machine,
+                                 struct addr_location *al,
+                                 struct perf_sample *sample)
+{
+       struct thread *thread;
+
+       thread = machine__findnew_thread_time(machine, sample->pid,
+                                             sample->tid, sample->time);
+       return __perf_event__preprocess_sample(event, machine, thread,
+                                              al, sample);
+}
+
 bool is_bts_event(struct perf_event_attr *attr)
 {
        return attr->type == PERF_TYPE_HARDWARE &&
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 5f66abfa61ca..1fbd37864241 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -352,6 +352,11 @@ int perf_event__process(struct perf_tool *tool,
 
 struct addr_location;
 
+int __perf_event__preprocess_sample(const union perf_event *event,
+                                   struct machine *machine,
+                                   struct thread *thread,
+                                   struct addr_location *al,
+                                   struct perf_sample *sample);
 int perf_event__preprocess_sample(const union perf_event *event,
                                  struct machine *machine,
                                  struct addr_location *al,
-- 
2.1.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to