On 2015/9/10 3:50, Arnaldo Carvalho de Melo wrote:
From: Arnaldo Carvalho de Melo <[email protected]>

As al.cpu may be -1, i.e. no PERF_SAMPLE_CPU, and env->cpu may be NULL.

Rely instead on the work now done in perf_event__preprocess_sample(),
that does all those checks.

Reported-by: Wang Nan <[email protected]>
Based-on-a-patch-by: Jiri Olsa <[email protected]>
Cc: Adrian Hunter <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Kan Liang <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Stephane Eranian <[email protected]>
Cc: Wang Nan <[email protected]>
Link: http://lkml.kernel.org/n/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
  tools/perf/builtin-report.c | 4 ----
  1 file changed, 4 deletions(-)

diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 4b432453922f..9b5083630a56 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -150,7 +150,6 @@ static int process_sample_event(struct perf_tool *tool,
                .add_entry_cb           = hist_iter__report_callback,
        };
        int ret = 0;
-       struct perf_env *env = evsel->evlist->env;
if (perf_event__preprocess_sample(event, machine, &al, sample) < 0) {
                pr_debug("problem processing %d event, skipping it.\n",
@@ -158,9 +157,6 @@ static int process_sample_event(struct perf_tool *tool,
                return -1;
        }
- /* read socket id from perf.data for perf report */
-       al.socket = env->cpu[al.cpu].socket_id;
-
        if (rep->hide_unresolved && al.sym == NULL)
                goto out_put;

I tested this patch on an 8 cores SOC. No segfault found now.

Normal case:

 # ./perf record -a ls
 # ...
 # ./perf_arm64 report -v  --stdio -s socket,cpu
 build id event received for [kernel.kallsyms]: ...
# To display the perf.data header info, please use --header/--header-only options.
 #
 symsrc__init: cannot get elf header.
 Looking at the vmlinux_path (7 entries long)
Failed to open /proc/kcore. Note /proc/kcore requires CAP_SYS_RAWIO capability to access.
 Using /proc/kallsyms for symbols
 Failed to open /sbin/adbd, continuing without symbols
 #
 # Total Lost Samples: 0
 #
 # Samples: 291  of event 'cycles'
 # Event count (approx.): 40968659
 #
 # Overhead  Socket  CPU
 # ........  ......  ...
 #
     58.01%     000  004
     35.61%     000  007
      3.65%     000  005
      1.23%     001  000
      1.18%     001  001
      0.19%     000  006
      0.08%     001  002
      0.07%     001  003

If one of CPUs is offlined before 'perf record':

 # ./perf record -a ls
 # ...
 # ./perf_arm64 report -v  --stdio -s socket,cpu
build id event received for [kernel.kallsyms]: d287ff3393fb1a01d3a785c3a1dac6e63d973bce # To display the perf.data header info, please use --header/--header-only options.
 #
 symsrc__init: cannot get elf header.
 Looking at the vmlinux_path (7 entries long)
Failed to open /proc/kcore. Note /proc/kcore requires CAP_SYS_RAWIO capability to access.
 Using /proc/kallsyms for symbols
 Failed to open /sbin/adbd, continuing without symbols
 #
 # Total Lost Samples: 0
 #
 # Samples: 304  of event 'cycles'
 # Event count (approx.): 42027298
 #
 # Overhead  Socket  CPU
 # ........  ......  ...
 #
     60.25%    -001  004
     32.69%    -001  007
      5.00%    -001  005
      1.34%    -001  003
      0.37%    -001  000
      0.20%    -001  006
      0.08%    -001  002
      0.07%    -001  001

And if CPU is offlined during perf record (between build_cpu_topology() and perf_env__read_cpu_topology_map()):

 # ./perf report -v  --stdio -s socket,cpu
 build id event received for [kernel.kallsyms]: ...
core_id number is too big.You may need to upgrade the perf tool. <--- *please see this line* # To display the perf.data header info, please use --header/--header-only options.
 #
 symsrc__init: cannot get elf header.
 Looking at the vmlinux_path (7 entries long)
Failed to open /proc/kcore. Note /proc/kcore requires CAP_SYS_RAWIO capability to access.
 Using /proc/kallsyms for symbols
 #
 # Total Lost Samples: 0
 #
 # Samples: 278  of event 'cycles'
 # Event count (approx.): 37729429
 #
 # Overhead  Socket  CPU
 # ........  ......  ...
 #
     59.06%    -001  004
     36.93%    -001  007
      1.33%    -001  000
      1.18%    -001  005
      0.82%    -001  006
      0.50%    -001  001
      0.08%    -001  002
      0.08%    -001  003


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
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