From: Namhyung Kim <namhyung....@lge.com>

The cpumode and level in struct addr_localtion was set for a sample
and but updated as cumulative callchains were added.  This led to have
non-matching symbol and cpumode in the output.

Update it accordingly based on the fact whether the map is a part of
the kernel or not.

Cc: Arun Sharma <asha...@fb.com>
Cc: Frederic Weisbecker <fweis...@gmail.com>
Signed-off-by: Namhyung Kim <namhy...@kernel.org>
---
 tools/perf/builtin-report.c | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 92cbd5cd1ab1..1b152a8b7f51 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -80,6 +80,7 @@ struct add_entry_iter {
        struct perf_report *rep;
        struct perf_evsel *evsel;
        struct perf_sample *sample;
+       struct machine *machine;
        struct hist_entry *he;
        struct symbol *parent;
        void *priv;
@@ -388,7 +389,7 @@ iter_finish_normal_entry(struct add_entry_iter *iter, 
struct addr_location *al)
 
 static int
 iter_prepare_cumulative_entry(struct add_entry_iter *iter,
-                             struct machine *machine __maybe_unused,
+                             struct machine *machine,
                              struct perf_evsel *evsel,
                              struct addr_location *al __maybe_unused,
                              struct perf_sample *sample)
@@ -404,6 +405,7 @@ iter_prepare_cumulative_entry(struct add_entry_iter *iter,
 
        iter->evsel = evsel;
        iter->sample = sample;
+       iter->machine = machine;
        return 0;
 }
 
@@ -468,6 +470,27 @@ iter_next_cumulative_entry(struct add_entry_iter *iter 
__maybe_unused,
        if (al->sym == NULL)
                return 0;
 
+       if (al->map->groups == &iter->machine->kmaps) {
+               if (machine__is_host(iter->machine)) {
+                       al->cpumode = PERF_RECORD_MISC_KERNEL;
+                       al->level = 'k';
+               } else {
+                       al->cpumode = PERF_RECORD_MISC_GUEST_KERNEL;
+                       al->level = 'g';
+               }
+       } else {
+               if (machine__is_host(iter->machine)) {
+                       al->cpumode = PERF_RECORD_MISC_USER;
+                       al->level = '.';
+               } else if (perf_guest) {
+                       al->cpumode = PERF_RECORD_MISC_GUEST_USER;
+                       al->level = 'u';
+               } else {
+                       al->cpumode = PERF_RECORD_MISC_HYPERVISOR;
+                       al->level = 'H';
+               }
+       }
+
        callchain_cursor_advance(&callchain_cursor);
        return 1;
 }
-- 
1.7.11.7

--
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