Comment 25 for bug 1828166

Revision history for this message
bugproxy (bugproxy) wrote : Comment bridged from LTC Bugzilla

------- Comment From <email address hidden> 2019-07-05 07:48 EDT-------
I have tried to last 2 days to find a patch series to apply the required patch which failed above.

The difference between upstream linux kernel 5.2.0rc7 and the ubuntu
18.04 kernel I downloaded from
url = git://kernel.ubuntu.com/ubuntu/ubuntu-bionic
branch master-next
in regards to the function machine__create_kernel_maps() in file tools/perf/util/machine.c
is very big.

Command
git log --oneline '-L: machine__create_kernel_maps:tools/perf/util/machine.c'
identifies the difference of applied patches. The following patches
are missing in ubuntu version:

Commit-ID Description
ed9adb2035b5 perf machine: Read also the end of the kernel
977c7a6d1e26 perf machine: Update kernel map address and re-order properly
1c5aae7710bb perf machine: Create maps for x86 PTI entry trampolines
3183f8ca304f perf symbols: Unify symbol maps
ee05d21791db perf machine: Set main kernel end address properly
1fb87b8e9599 perf machine: Don't search for active kernel start in __machine__create_kernel_maps

Already the first patch missing:
Commit-ID Description
1fb87b8e9599 perf machine: Don't search for active kernel start in __machine__create_kernel_maps

does not apply because in this patch a function named machine__set_kernel_mmap()
is moved in file perf/tools/util/machine.c but this function is missing
in the ubuntu 18.04 master-next tree.
It turned out that this tree also misses patch:

Commit-ID Description
05db6ff73d80 perf machine: Generalize machine__set_kernel_mmap()

Having found the starting patch, I can applied the following patch sequence:
root@s8360046:~/ubuntu-bionic# patch -p1 < ../patches/0001-perf-machine-Generalize- machine__set_kernel_mmap.patch
patching file tools/perf/util/machine.c
Hunk #1 succeeded at 1255 (offset -7 lines).
Hunk #2 succeeded at 1370 (offset -5 lines).
root@s8360046:~/ubuntu-bionic# patch -p1 < ../patches/0001-perf-machine-Don-t-search-for-active-kernel-start-in.patch
patching file tools/perf/util/machine.c
Hunk #1 succeeded at 849 (offset -7 lines).
Hunk #2 succeeded at 861 (offset -7 lines).
Hunk #3 succeeded at 1212 (offset -7 lines).
Hunk #4 succeeded at 1254 (offset -7 lines).
patching file tools/perf/util/machine.h
Hunk #1 succeeded at 239 (offset 1 line).
root@s8360046:~/ubuntu-bionic# patch -p1 < ../patches/0001-perf-machine-Set-main-kernel-end-address-properly.patch
patching file tools/perf/util/machine.c
Hunk #1 succeeded at 1020 (offset 1 line).
Hunk #2 succeeded at 1227 (offset 1 line).
Hunk #3 succeeded at 1254 (offset 1 line).
root@s8360046:~/ubuntu-bionic# patch -p1 < ../patches/0001-perf-machine-Update-kernel-map-address-and-re-order-.patch
patching file tools/perf/util/machine.c
Hunk #1 succeeded at 1223 with fuzz 1 (offset -198 lines).
Hunk #2 succeeded at 1269 with fuzz 1 (offset -198 lines).
Hunk #3 succeeded at 1381 (offset -226 lines).
root@s8360046:~/ubuntu-bionic# patch -p1 < ../patches/0001-perf-machine-Read-also-the-end-of-the-kernel.patch
patching file tools/perf/util/machine.c
Hunk #1 succeeded at 821 (offset -103 lines).
Hunk #2 succeeded at 847 (offset -103 lines).
Hunk #3 succeeded at 1248 (offset -199 lines).
Hunk #4 FAILED at 1466.
Hunk #5 FAILED at 1478.
2 out of 5 hunks FAILED -- saving rejects to file tools/perf/util/machine.c.rej
root@s8360046:~/ubuntu-bionic#

The last patch is the one we need and it fails.
Refering to above patch list, I do not want to apply these two patches:

Commit-ID Description
1c5aae7710bb perf machine: Create maps for x86 PTI entry trampolines
3183f8ca304f perf symbols: Unify symbol maps

Both patches require tremendous change in the symbol table code of perf and
introduce trampoline functionality to handle security fixes in the kernel for x86.
If you want to apply these two patch, better upgrade the perf tool completely.

Appling the last patch, the last 2 hunks fail because of missing context.
The changes itself are trivial, but I can not do the changes as the code of the last patch is not from IBM.

Here is the difference from the file tools/perf/util/machine.c.rej:
-- tools/perf/util/machine.c
+++ tools/perf/util/machine.c
@@ -1466,9 +1472,9 @@ int machine__create_kernel_maps(struct machine *machine)
"continuing anyway...\n", machine->pid);
}

- if (!machine__get_running_kernel_start(machine, &name, &addr)) {
+ if (!machine__get_running_kernel_start(machine, &name, &start, &end)) {
if (name &&
- map__set_kallsyms_ref_reloc_sym(machine->vmlinux_map, name, addr)) {
+ map__set_kallsyms_ref_reloc_sym(machine->vmlinux_map, name, start)) {
machine__destroy_kernel_maps(machine);
ret = -1;
goto out_put;
@@ -1478,16 +1484,19 @@ int machine__create_kernel_maps(struct machine *machine)

* we have a real start address now, so re-order the kmaps
* assume it's the last in the kmaps
*/
- machine__update_kernel_mmap(machine, addr, ~0ULL);
+ machine__update_kernel_mmap(machine, start, end);
}

if (machine__create_extra_kernel_maps(machine, kernel))
pr_debug("Problems creating extra kernel maps, continuing anyway...\n");

- /* update end address of the kernel map using adjacent module address */
- map = map__next(machine__kernel_map(machine));
- if (map)
- machine__set_kernel_mmap(machine, addr, map->start);
+ if (end == ~0ULL) {
+ /* update end address of the kernel map using adjacent module address */
+ map = map__next(machine__kernel_map(machine));
+ if (map)
+ machine__set_kernel_mmap(machine, start, map->start);
+ }
+
out_put:
dso__put(kernel);
return ret;

Hope this helps. Sorry that I did not come to a better solution. The differences between both
versions of perf is just too big.
Ubuntu 18.04 is based on Linux 4.15 whereas the reqired patch was made for linux 5.2.

I have not compiled the perf tool nor tested the result