Show the "-- kernel --" marker in kernel threads
authorSøren Sandmann Pedersen <sandmann@daimi.au.dk>
Wed, 21 Oct 2009 16:28:43 +0000 (12:28 -0400)
committerSøren Sandmann Pedersen <sandmann@daimi.au.dk>
Wed, 21 Oct 2009 16:28:43 +0000 (12:28 -0400)
The innermost context is normally user mode, so we don't show. For
kernel threads, the innermost context is the kernel, so don't filter
it out.

tracker.c

index 9cadcea..ac60cf5 100644 (file)
--- a/tracker.c
+++ b/tracker.c
@@ -932,7 +932,7 @@ process_sample (state_t *state, StackStash *resolved, sample_t *sample)
        return;
     }
     
-    len = 4;
+    len = 5;
     for (n = sample->trace; n != NULL; n = n->parent)
        len++;
 
@@ -969,6 +969,17 @@ process_sample (state_t *state, StackStash *resolved, sample_t *sample)
            resolved_traces[len++] = POINTER_TO_U64 (symbol);
     }
 
+    if (context && context->context != PERF_CONTEXT_USER)
+    {
+       /* Kernel threads do not have a user part, so we end up here
+        * without ever getting a user context. If this happens,
+        * add the '- - kernel - - ' name, so that kernel threads
+        * are properly blamed on the kernel
+        */
+       resolved_traces[len++] =
+           POINTER_TO_U64 (unique_dup (state->unique_symbols, context->name));
+    }
+       
     cmdline = make_message (state, "[%s]", process->comm);
     
     resolved_traces[len++] = POINTER_TO_U64 (cmdline);