File perf-map-no-need-to-adjust-the-long-name-of-modules.patch of Package perf
245
1
From: Arnaldo Carvalho de Melo <acme@redhat.com>
2
Date: Thu, 14 Nov 2019 10:46:45 -0300
3
Subject: perf map: No need to adjust the long name of modules
4
Git-commit: f068435d9bb2d825d59e3c101bc579f09315ee01
5
Patch-mainline: v5.5-rc1
6
References: git-fixes
7
8
At some point in the past we needed to make sure we would get the long
9
name of modules and not just what we get from /proc/modules, but that
10
need, as described in the cset that introduced the adjustment function:
11
12
Fixes: c03d5184f0e9 ("perf machine: Adjust dso->long_name for offline module")
13
14
Without using the buildid-cache:
15
16
# lsmod | grep trusted
17
# insmod trusted.ko
18
# lsmod | grep trusted
19
trusted 24576 0
20
# strace -e open,openat perf probe -m ./trusted.ko key_seal |& grep trusted
21
openat(AT_FDCWD, "/sys/module/trusted/notes/.note.gnu.build-id", O_RDONLY) = 4
22
openat(AT_FDCWD, "/sys/module/trusted/notes/.note.gnu.build-id", O_RDONLY) = 7
23
openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
24
openat(AT_FDCWD, "/root/.debug/root/trusted.ko/dd3d355d567394d540f527e093e0f64b95879584/probes", O_RDWR|O_CREAT, 0644) = 3
25
openat(AT_FDCWD, "/usr/lib/debug/root/trusted.ko.debug", O_RDONLY) = -1 ENOENT (No such file or directory)
26
openat(AT_FDCWD, "/usr/lib/debug/root/trusted.ko", O_RDONLY) = -1 ENOENT (No such file or directory)
27
openat(AT_FDCWD, "/root/.debug/trusted.ko", O_RDONLY) = -1 ENOENT (No such file or directory)
28
openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
29
openat(AT_FDCWD, "trusted.ko.debug", O_RDONLY) = -1 ENOENT (No such file or directory)
30
openat(AT_FDCWD, ".debug/trusted.ko.debug", O_RDONLY) = -1 ENOENT (No such file or directory)
31
openat(AT_FDCWD, "trusted.ko.debug", O_RDONLY) = -1 ENOENT (No such file or directory)
32
openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
33
openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
34
openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 4
35
openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
36
probe:key_seal (on key_seal in trusted)
37
# perf probe -l
38
probe:key_seal (on key_seal in trusted)
39
#
40
41
No attempt at opening '[trusted]'.
42
43
Now using the build-id cache:
44
45
# rmmod trusted
46
# perf buildid-cache --add ./trusted.ko
47
# insmod trusted.ko
48
# strace -e open,openat perf probe -m ./trusted.ko key_seal |& grep trusted
49
openat(AT_FDCWD, "/sys/module/trusted/notes/.note.gnu.build-id", O_RDONLY) = 4
50
openat(AT_FDCWD, "/sys/module/trusted/notes/.note.gnu.build-id", O_RDONLY) = 7
51
openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
52
openat(AT_FDCWD, "/root/.debug/root/trusted.ko/dd3d355d567394d540f527e093e0f64b95879584/probes", O_RDWR|O_CREAT, 0644) = 3
53
openat(AT_FDCWD, "/usr/lib/debug/root/trusted.ko.debug", O_RDONLY) = -1 ENOENT (No such file or directory)
54
openat(AT_FDCWD, "/usr/lib/debug/root/trusted.ko", O_RDONLY) = -1 ENOENT (No such file or directory)
55
openat(AT_FDCWD, "/root/.debug/trusted.ko", O_RDONLY) = -1 ENOENT (No such file or directory)
56
openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
57
openat(AT_FDCWD, "trusted.ko.debug", O_RDONLY) = -1 ENOENT (No such file or directory)
58
openat(AT_FDCWD, ".debug/trusted.ko.debug", O_RDONLY) = -1 ENOENT (No such file or directory)
59
openat(AT_FDCWD, "trusted.ko.debug", O_RDONLY) = -1 ENOENT (No such file or directory)
60
openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
61
openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
62
openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 4
63
openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
64
#
65
66
Again, no attempt at reading '[trusted]'.
67
68
Finally, adding a probe to that function and then using:
69
70
[root@quaco ~]# perf trace -e probe_perf:*/max-stack=16/ --max-events=2
71
0.000 perf/13456 probe_perf:dso__adjust_kmod_long_name(__probe_ip: 5492263)
72
dso__adjust_kmod_long_name (/home/acme/bin/perf)
73
machine__process_kernel_mmap_event (/home/acme/bin/perf)
74
machine__process_mmap_event (/home/acme/bin/perf)
75
perf_event__process_mmap (/home/acme/bin/perf)
76
machines__deliver_event (/home/acme/bin/perf)
77
perf_session__deliver_event (/home/acme/bin/perf)
78
perf_session__process_event (/home/acme/bin/perf)
79
process_simple (/home/acme/bin/perf)
80
reader__process_events (/home/acme/bin/perf)
81
__perf_session__process_events (/home/acme/bin/perf)
82
perf_session__process_events (/home/acme/bin/perf)
83
process_buildids (/home/acme/bin/perf)
84
record__finish_output (/home/acme/bin/perf)
85
__cmd_record (/home/acme/bin/perf)
86
cmd_record (/home/acme/bin/perf)
87
run_builtin (/home/acme/bin/perf)
88
0.055 perf/13456 probe_perf:dso__adjust_kmod_long_name(__probe_ip: 5492263)
89
dso__adjust_kmod_long_name (/home/acme/bin/perf)
90
machine__process_kernel_mmap_event (/home/acme/bin/perf)
91
machine__process_mmap_event (/home/acme/bin/perf)
92
perf_event__process_mmap (/home/acme/bin/perf)
93
machines__deliver_event (/home/acme/bin/perf)
94
perf_session__deliver_event (/home/acme/bin/perf)
95
perf_session__process_event (/home/acme/bin/perf)
96
process_simple (/home/acme/bin/perf)
97
reader__process_events (/home/acme/bin/perf)
98
__perf_session__process_events (/home/acme/bin/perf)
99
perf_session__process_events (/home/acme/bin/perf)
100
process_buildids (/home/acme/bin/perf)
101
record__finish_output (/home/acme/bin/perf)
102
__cmd_record (/home/acme/bin/perf)
103
cmd_record (/home/acme/bin/perf)
104
run_builtin (/home/acme/bin/perf)
105
#
106
107
This was the only path I could find using the perf tools that reach at this
108
function, then as of november/2019, if we put a probe in the line where the
109
actuall setting of the dso->long_name is done:
110
111
# perf trace -e probe_perf:*
112
^C[root@quaco ~]
113
# perf stat -e probe_perf:* -I 2000
114
2.000404265 0 probe_perf:dso__adjust_kmod_long_name
115
4.001142200 0 probe_perf:dso__adjust_kmod_long_name
116
6.001704120 0 probe_perf:dso__adjust_kmod_long_name
117
8.002398316 0 probe_perf:dso__adjust_kmod_long_name
118
10.002984010 0 probe_perf:dso__adjust_kmod_long_name
119
12.003597851 0 probe_perf:dso__adjust_kmod_long_name
120
14.004113303 0 probe_perf:dso__adjust_kmod_long_name
121
16.004582773 0 probe_perf:dso__adjust_kmod_long_name
122
18.005176373 0 probe_perf:dso__adjust_kmod_long_name
123
20.005801605 0 probe_perf:dso__adjust_kmod_long_name
124
22.006467540 0 probe_perf:dso__adjust_kmod_long_name
125
^C 23.683261941 0 probe_perf:dso__adjust_kmod_long_name
126
127
#
128
129
Its not being used at all.
130
131
To further test this I used kvm.ko as the offline module, i.e. removed
132
if from the buildid-cache by nuking it completely (rm -rf ~/.debug) and
133
moved it from the normal kernel distro path, removed the modules, stoped
134
the kvm guest, and then installed it manually, etc.
135
136
# rmmod kvm-intel
137
# rmmod kvm
138
# lsmod | grep kvm
139
# modprobe kvm-intel
140
modprobe: ERROR: ctx=0x55d3b1722260 path=/lib/modules/5.3.8-200.fc30.x86_64/kernel/arch/x86/kvm/kvm.ko.xz error=No such file or directory
141
modprobe: ERROR: ctx=0x55d3b1722260 path=/lib/modules/5.3.8-200.fc30.x86_64/kernel/arch/x86/kvm/kvm.ko.xz error=No such file or directory
142
modprobe: ERROR: could not insert 'kvm_intel': Unknown symbol in module, or unknown parameter (see dmesg)
143
# insmod ./kvm.ko
144
# modprobe kvm-intel
145
modprobe: ERROR: ctx=0x562f34026260 path=/lib/modules/5.3.8-200.fc30.x86_64/kernel/arch/x86/kvm/kvm.ko.xz error=No such file or directory
146
modprobe: ERROR: ctx=0x562f34026260 path=/lib/modules/5.3.8-200.fc30.x86_64/kernel/arch/x86/kvm/kvm.ko.xz error=No such file or directory
147
# lsmod | grep kvm
148
kvm_intel 299008 0
149
kvm 765952 1 kvm_intel
150
irqbypass 16384 1 kvm
151
#
152
# perf probe -x ~/bin/perf machine__findnew_module_map:12 mname=m.name:string filename=filename:string 'dso_long_name=map->dso->long_name:string' 'dso_name=map->dso->name:string'
153
# perf probe -l
154
probe_perf:machine__findnew_module_map (on machine__findnew_module_map:12@util/machine.c in /home/acme/bin/perf with mname filename dso_long_name dso_name)
155
# perf record
156
^C[ perf record: Woken up 2 times to write data ]
157
[ perf record: Captured and wrote 3.416 MB perf.data (33956 samples) ]
158
# perf trace -e probe_perf:machine*
159
<SNIP>
160
6.322 perf/23099 probe_perf:machine__findnew_module_map(__probe_ip: 5492493, mname: "[salsa20_generic]", filename: "/lib/modules/5.3.8-200.fc30.x86_64/kernel/crypto/salsa20_generic.ko.xz", dso_long_name: "/lib/modules/5.3.8-200.fc30.x86_64/kernel/crypto/salsa20_generic.ko.xz", dso_name: "[salsa20_generic]")
161
6.375 perf/23099 probe_perf:machine__findnew_module_map(__probe_ip: 5492493, mname: "[kvm]", filename: "[kvm]", dso_long_name: "[kvm]", dso_name: "[kvm]")
162
<SNIP>
163
164
The filename doesn't come with the path, no point in trying to set the dso->long_name.
165
166
[root@quaco ~]# strace -e open,openat perf probe -m ./kvm.ko kvm_apic_local_deliver |& egrep 'open.*kvm'
167
openat(AT_FDCWD, "/sys/module/kvm_intel/notes/.note.gnu.build-id", O_RDONLY) = 4
168
openat(AT_FDCWD, "/sys/module/kvm/notes/.note.gnu.build-id", O_RDONLY) = 4
169
openat(AT_FDCWD, "/lib/modules/5.3.8-200.fc30.x86_64/kernel/arch/x86/kvm", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 7
170
openat(AT_FDCWD, "/sys/module/kvm_intel/notes/.note.gnu.build-id", O_RDONLY) = 8
171
openat(AT_FDCWD, "/root/kvm.ko", O_RDONLY) = 3
172
openat(AT_FDCWD, "/root/.debug/root/kvm.ko/5955f426cb93f03f30f3e876814be2db80ab0b55/probes", O_RDWR|O_CREAT, 0644) = 3
173
openat(AT_FDCWD, "/usr/lib/debug/root/kvm.ko.debug", O_RDONLY) = -1 ENOENT (No such file or directory)
174
openat(AT_FDCWD, "/usr/lib/debug/root/kvm.ko", O_RDONLY) = -1 ENOENT (No such file or directory)
175
openat(AT_FDCWD, "/root/.debug/kvm.ko", O_RDONLY) = -1 ENOENT (No such file or directory)
176
openat(AT_FDCWD, "/root/kvm.ko", O_RDONLY) = 3
177
openat(AT_FDCWD, "kvm.ko.debug", O_RDONLY) = -1 ENOENT (No such file or directory)
178
openat(AT_FDCWD, ".debug/kvm.ko.debug", O_RDONLY) = -1 ENOENT (No such file or directory)
179
openat(AT_FDCWD, "kvm.ko.debug", O_RDONLY) = -1 ENOENT (No such file or directory)
180
openat(AT_FDCWD, "/root/kvm.ko", O_RDONLY) = 3
181
openat(AT_FDCWD, "/root/kvm.ko", O_RDONLY) = 3
182
openat(AT_FDCWD, "/root/kvm.ko", O_RDONLY) = 4
183
openat(AT_FDCWD, "/root/kvm.ko", O_RDONLY) = 3
184
[root@quaco ~]#
185
186
Cc: Adrian Hunter <adrian.hunter@intel.com>
187
Cc: Andi Kleen <ak@linux.intel.com>
188
Cc: Jiri Olsa <jolsa@kernel.org>
189
Cc: Namhyung Kim <namhyung@kernel.org>
190
Cc: Wang Nan <wangnan0@huawei.com>
191
Link: https://lkml.kernel.org/n/tip-jlfew3lyb24d58egrp0o72o2@git.kernel.org
192
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
193
Signed-off-by: Tony Jones <tonyj@suse.de>
194
---
195
tools/perf/util/machine.c | 27 +--------------------------
196
1 file changed, 1 insertion(+), 26 deletions(-)
197
198
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
199
index 6a0f5c25ce3e..6804c8247782 100644
200
--- a/tools/perf/util/machine.c
201
+++ b/tools/perf/util/machine.c
202
203
return machine__process_ksymbol_register(machine, event, sample);
204
}
205
206
-static void dso__adjust_kmod_long_name(struct dso *dso, const char *filename)
207
-{
208
- const char *dup_filename;
209
-
210
- if (!filename || !dso || !dso->long_name)
211
- return;
212
- if (dso->long_name[0] != '[')
213
- return;
214
- if (!strchr(filename, '/'))
215
- return;
216
-
217
- dup_filename = strdup(filename);
218
- if (!dup_filename)
219
- return;
220
-
221
- dso__set_long_name(dso, dup_filename, true);
222
-}
223
-
224
struct map *machine__findnew_module_map(struct machine *machine, u64 start,
225
const char *filename)
226
{
227
228
return NULL;
229
230
map = map_groups__find_by_name(&machine->kmaps, m.name);
231
- if (map) {
232
- /*
233
- * If the map's dso is an offline module, give dso__load()
234
- * a chance to find the file path of that module by fixing
235
- * long_name.
236
- */
237
- dso__adjust_kmod_long_name(map->dso, filename);
238
+ if (map)
239
goto out;
240
- }
241
242
dso = machine__findnew_module_dso(machine, &m, filename);
243
if (dso == NULL)
244
245