File libperf-add-perf_evlist__init-function.patch of Package perf
117
1
From: Jiri Olsa <jolsa@kernel.org>
2
Date: Sun, 21 Jul 2019 13:24:25 +0200
3
Subject: libperf: Add perf_evlist__init() function
4
Git-commit: 4562a7393996bb28bf629277903a561bfefea177
5
Patch-mainline: v5.4-rc1
6
References: jsc#SLE-13661
7
8
Add the perf_evlist__init() function to initialize a perf_evlist struct.
9
10
Committer testing:
11
12
Fix a change in init ordering that was causing this backtrace:
13
14
(gdb) run stat sleep 1
15
Starting program: /root/bin/perf stat sleep 1
16
Program received signal SIGSEGV, Segmentation fault.
17
0x00000000004f6b55 in __perf_evlist__propagate_maps (evlist=0xbb34c0, evsel=0x0) at util/evlist.c:161
18
161 if (!evsel->own_cpus || evlist->has_user_cpus) {
19
Missing separate debuginfos, use: dnf debuginfo-install bzip2-libs-1.0.6-29.fc30.x86_64 elfutils-libelf-0.176-3.fc30.x86_64 elfutils-libs-0.176-3.fc30.x86_64 glib2-2.60.4-1.fc30.x86_64 libbabeltrace-1.5.6-2.fc30.x86_64 libgcc-9.1.1-1.fc30.x86_64 libunwind-1.3.1-2.fc30.x86_64 libuuid-2.33.2-1.fc30.x86_64 libxcrypt-4.4.6-2.fc30.x86_64 libzstd-1.4.0-1.fc30.x86_64 numactl-libs-2.0.12-2.fc30.x86_64 pcre-8.43-2.fc30.x86_64 perl-libs-5.28.2-436.fc30.x86_64 popt-1.16-17.fc30.x86_64 python2-libs-2.7.16-2.fc30.x86_64 slang-2.3.2-5.fc30.x86_64 xz-libs-5.2.4-5.fc30.x86_64 zlib-1.2.11-15.fc30.x86_64
20
(gdb) bt
21
#0 0x00000000004f6b55 in __perf_evlist__propagate_maps (evlist=0xbb34c0, evsel=0x0) at util/evlist.c:161
22
#1 0x00000000004f6c7a in perf_evlist__propagate_maps (evlist=0xbb34c0) at util/evlist.c:178
23
#2 0x00000000004f955e in perf_evlist__set_maps (evlist=0xbb34c0, cpus=0x0, threads=0x0) at util/evlist.c:1128
24
#3 0x00000000004f66f8 in evlist__init (evlist=0xbb34c0, cpus=0x0, threads=0x0) at util/evlist.c:52
25
#4 0x00000000004f6790 in evlist__new () at util/evlist.c:64
26
#5 0x0000000000456071 in cmd_stat (argc=3, argv=0x7fffffffd670) at builtin-stat.c:1705
27
#6 0x00000000004dd0fa in run_builtin (p=0xa21e00 <commands+288>, argc=3, argv=0x7fffffffd670) at perf.c:304
28
#7 0x00000000004dd367 in handle_internal_command (argc=3, argv=0x7fffffffd670) at perf.c:356
29
#8 0x00000000004dd4ae in run_argv (argcp=0x7fffffffd4cc, argv=0x7fffffffd4c0) at perf.c:400
30
#9 0x00000000004dd81a in main (argc=3, argv=0x7fffffffd670) at perf.c:522
31
(gdb) bt
32
33
So move the initialization of the core evlist (calling
34
perf_evlist__init()) to before perf_evlist__set_maps() in
35
evlist__init().
36
37
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
38
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
39
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
40
Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
41
Cc: Andi Kleen <ak@linux.intel.com>
42
Cc: Michael Petlan <mpetlan@redhat.com>
43
Cc: Namhyung Kim <namhyung@kernel.org>
44
Cc: Peter Zijlstra <peterz@infradead.org>
45
Link: http://lkml.kernel.org/r/20190721112506.12306-39-jolsa@kernel.org
46
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
47
Signed-off-by: Tony Jones <tonyj@suse.de>
48
---
49
tools/perf/lib/evlist.c | 5 +++++
50
tools/perf/lib/include/perf/evlist.h | 4 ++++
51
tools/perf/lib/libperf.map | 1 +
52
tools/perf/util/evlist.c | 3 ++-
53
4 files changed, 12 insertions(+), 1 deletion(-)
54
55
diff --git a/tools/perf/lib/evlist.c b/tools/perf/lib/evlist.c
56
index 646bdd518793..fdc8c1894b37 100644
57
--- a/tools/perf/lib/evlist.c
58
+++ b/tools/perf/lib/evlist.c
59
60
#include <perf/evlist.h>
61
#include <linux/list.h>
62
#include <internal/evlist.h>
63
+
64
+void perf_evlist__init(struct perf_evlist *evlist)
65
+{
66
+ INIT_LIST_HEAD(&evlist->entries);
67
+}
68
diff --git a/tools/perf/lib/include/perf/evlist.h b/tools/perf/lib/include/perf/evlist.h
69
index 92b0eb39caec..1ddfcca0bd01 100644
70
--- a/tools/perf/lib/include/perf/evlist.h
71
+++ b/tools/perf/lib/include/perf/evlist.h
72
73
#ifndef __LIBPERF_EVLIST_H
74
#define __LIBPERF_EVLIST_H
75
76
+#include <perf/core.h>
77
+
78
struct perf_evlist;
79
80
+LIBPERF_API void perf_evlist__init(struct perf_evlist *evlist);
81
+
82
#endif /* __LIBPERF_EVLIST_H */
83
diff --git a/tools/perf/lib/libperf.map b/tools/perf/lib/libperf.map
84
index 54f8503c6d82..5ca6ff6fcdfa 100644
85
--- a/tools/perf/lib/libperf.map
86
+++ b/tools/perf/lib/libperf.map
87
88
perf_thread_map__get;
89
perf_thread_map__put;
90
perf_evsel__init;
91
+ perf_evlist__init;
92
local:
93
*;
94
};
95
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
96
index faf3ffd81d4c..f4aa6cf80559 100644
97
--- a/tools/perf/util/evlist.c
98
+++ b/tools/perf/util/evlist.c
99
100
#include <linux/log2.h>
101
#include <linux/err.h>
102
#include <linux/zalloc.h>
103
+#include <perf/evlist.h>
104
105
#ifdef LACKS_SIGQUEUE_PROTOTYPE
106
int sigqueue(pid_t pid, int sig, const union sigval value);
107
108
109
for (i = 0; i < PERF_EVLIST__HLIST_SIZE; ++i)
110
INIT_HLIST_HEAD(&evlist->heads[i]);
111
- INIT_LIST_HEAD(&evlist->core.entries);
112
+ perf_evlist__init(&evlist->core);
113
perf_evlist__set_maps(evlist, cpus, threads);
114
fdarray__init(&evlist->pollfd, 64);
115
evlist->workload.pid = -1;
116
117