Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf maps: Use a pointer for kmaps

struct maps is reference counted, using a pointer is more idiomatic.

Committer notes:

Delay:

maps = machine__kernel_maps(&vmlinux);

To after:

machine__init(&vmlinux, "", HOST_KERNEL_ID);

To avoid this on f34:

In file included from /var/home/acme/git/perf/tools/perf/util/build-id.h:10,
from /var/home/acme/git/perf/tools/perf/util/dso.h:13,
from tests/vmlinux-kallsyms.c:8:
In function ‘machine__kernel_maps’,
inlined from ‘test__vmlinux_matches_kallsyms’ at tests/vmlinux-kallsyms.c:122:22:
/var/home/acme/git/perf/tools/perf/util/machine.h:86:23: error: ‘vmlinux.kmaps’ is used uninitialized [-Werror=uninitialized]
86 | return machine->kmaps;
| ~~~~~~~^~~~~~~
tests/vmlinux-kallsyms.c: In function ‘test__vmlinux_matches_kallsyms’:
tests/vmlinux-kallsyms.c:121:34: note: ‘vmlinux’ declared here
121 | struct machine kallsyms, vmlinux;
| ^~~~~~~
cc1: all warnings being treated as errors

Signed-off-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: André Almeida <andrealmeid@collabora.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Darren Hart <dvhart@infradead.org>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Dmitriy Vyukov <dvyukov@google.com>
Cc: Eric Dumazet <edumazet@google.com>
Cc: German Gomez <german.gomez@arm.com>
Cc: Hao Luo <haoluo@google.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Garry <john.garry@huawei.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Miaoqian Lin <linmq006@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Riccardo Mancini <rickyman7@gmail.com>
Cc: Shunsuke Nakamura <nakamura.shun@fujitsu.com>
Cc: Song Liu <song@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Stephen Brennan <stephen.s.brennan@oracle.com>
Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Yury Norov <yury.norov@gmail.com>
Link: http://lore.kernel.org/lkml/20220211103415.2737789-6-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Ian Rogers and committed by
Arnaldo Carvalho de Melo
1a97cee6 e8eaadf4

+37 -31
+1 -1
tools/perf/arch/x86/util/event.c
··· 18 18 { 19 19 int rc = 0; 20 20 struct map *pos; 21 - struct maps *kmaps = &machine->kmaps; 21 + struct maps *kmaps = machine__kernel_maps(machine); 22 22 union perf_event *event = zalloc(sizeof(event->mmap) + 23 23 machine->id_hdr_size); 24 24
+5 -3
tools/perf/tests/vmlinux-kallsyms.c
··· 119 119 struct symbol *sym; 120 120 struct map *kallsyms_map, *vmlinux_map, *map; 121 121 struct machine kallsyms, vmlinux; 122 - struct maps *maps = machine__kernel_maps(&vmlinux); 122 + struct maps *maps; 123 123 u64 mem_start, mem_end; 124 124 bool header_printed; 125 125 ··· 131 131 */ 132 132 machine__init(&kallsyms, "", HOST_KERNEL_ID); 133 133 machine__init(&vmlinux, "", HOST_KERNEL_ID); 134 + 135 + maps = machine__kernel_maps(&vmlinux); 134 136 135 137 /* 136 138 * Step 2: ··· 295 293 * so use the short name, less descriptive but the same ("[kernel]" in 296 294 * both cases. 297 295 */ 298 - pair = maps__find_by_name(&kallsyms.kmaps, (map->dso->kernel ? 296 + pair = maps__find_by_name(kallsyms.kmaps, (map->dso->kernel ? 299 297 map->dso->short_name : 300 298 map->dso->name)); 301 299 if (pair) { ··· 317 315 mem_start = vmlinux_map->unmap_ip(vmlinux_map, map->start); 318 316 mem_end = vmlinux_map->unmap_ip(vmlinux_map, map->end); 319 317 320 - pair = maps__find(&kallsyms.kmaps, mem_start); 318 + pair = maps__find(kallsyms.kmaps, mem_start); 321 319 if (pair == NULL || pair->priv) 322 320 continue; 323 321
+1 -1
tools/perf/util/bpf-event.c
··· 105 105 for (i = 0; i < info_linear->info.nr_jited_ksyms; i++) { 106 106 u64 *addrs = (u64 *)(uintptr_t)(info_linear->info.jited_ksyms); 107 107 u64 addr = addrs[i]; 108 - struct map *map = maps__find(&machine->kmaps, addr); 108 + struct map *map = maps__find(machine__kernel_maps(machine), addr); 109 109 110 110 if (map) { 111 111 map->dso->binary_type = DSO_BINARY_TYPE__BPF_PROG_INFO;
+1 -1
tools/perf/util/callchain.c
··· 1119 1119 goto out; 1120 1120 } 1121 1121 1122 - if (al->maps == &al->maps->machine->kmaps) { 1122 + if (al->maps == machine__kernel_maps(al->maps->machine)) { 1123 1123 if (machine__is_host(al->maps->machine)) { 1124 1124 al->cpumode = PERF_RECORD_MISC_KERNEL; 1125 1125 al->level = 'k';
+3 -3
tools/perf/util/event.c
··· 484 484 if (machine) { 485 485 struct addr_location al; 486 486 487 - al.map = maps__find(&machine->kmaps, tp->addr); 487 + al.map = maps__find(machine__kernel_maps(machine), tp->addr); 488 488 if (al.map && map__load(al.map) >= 0) { 489 489 al.addr = al.map->map_ip(al.map, tp->addr); 490 490 al.sym = map__find_symbol(al.map, al.addr); ··· 587 587 588 588 if (cpumode == PERF_RECORD_MISC_KERNEL && perf_host) { 589 589 al->level = 'k'; 590 - al->maps = maps = &machine->kmaps; 590 + al->maps = maps = machine__kernel_maps(machine); 591 591 load_map = true; 592 592 } else if (cpumode == PERF_RECORD_MISC_USER && perf_host) { 593 593 al->level = '.'; 594 594 } else if (cpumode == PERF_RECORD_MISC_GUEST_KERNEL && perf_guest) { 595 595 al->level = 'g'; 596 - al->maps = maps = &machine->kmaps; 596 + al->maps = maps = machine__kernel_maps(machine); 597 597 load_map = true; 598 598 } else if (cpumode == PERF_RECORD_MISC_GUEST_USER && perf_guest) { 599 599 al->level = 'u';
+21 -17
tools/perf/util/machine.c
··· 89 89 int err = -ENOMEM; 90 90 91 91 memset(machine, 0, sizeof(*machine)); 92 - maps__init(&machine->kmaps, machine); 92 + machine->kmaps = maps__new(machine); 93 + if (machine->kmaps == NULL) 94 + return -ENOMEM; 95 + 93 96 RB_CLEAR_NODE(&machine->rb_node); 94 97 dsos__init(&machine->dsos); 95 98 ··· 111 108 112 109 machine->root_dir = strdup(root_dir); 113 110 if (machine->root_dir == NULL) 114 - return -ENOMEM; 111 + goto out; 115 112 116 113 if (machine__set_mmap_name(machine)) 117 114 goto out; ··· 134 131 135 132 out: 136 133 if (err) { 134 + zfree(&machine->kmaps); 137 135 zfree(&machine->root_dir); 138 136 zfree(&machine->mmap_name); 139 137 } ··· 224 220 return; 225 221 226 222 machine__destroy_kernel_maps(machine); 227 - maps__exit(&machine->kmaps); 223 + maps__delete(machine->kmaps); 228 224 dsos__exit(&machine->dsos); 229 225 machine__exit_vdso(machine); 230 226 zfree(&machine->root_dir); ··· 782 778 struct perf_sample *sample __maybe_unused) 783 779 { 784 780 struct symbol *sym; 785 - struct map *map = maps__find(&machine->kmaps, event->ksymbol.addr); 781 + struct map *map = maps__find(machine__kernel_maps(machine), event->ksymbol.addr); 786 782 787 783 if (!map) { 788 784 struct dso *dso = dso__new(event->ksymbol.name); ··· 805 801 806 802 map->start = event->ksymbol.addr; 807 803 map->end = map->start + event->ksymbol.len; 808 - maps__insert(&machine->kmaps, map); 804 + maps__insert(machine__kernel_maps(machine), map); 809 805 map__put(map); 810 806 dso__set_loaded(dso); 811 807 ··· 831 827 struct symbol *sym; 832 828 struct map *map; 833 829 834 - map = maps__find(&machine->kmaps, event->ksymbol.addr); 830 + map = maps__find(machine__kernel_maps(machine), event->ksymbol.addr); 835 831 if (!map) 836 832 return 0; 837 833 838 834 if (map != machine->vmlinux_map) 839 - maps__remove(&machine->kmaps, map); 835 + maps__remove(machine__kernel_maps(machine), map); 840 836 else { 841 837 sym = dso__find_symbol(map->dso, map->map_ip(map, map->start)); 842 838 if (sym) ··· 862 858 int machine__process_text_poke(struct machine *machine, union perf_event *event, 863 859 struct perf_sample *sample __maybe_unused) 864 860 { 865 - struct map *map = maps__find(&machine->kmaps, event->text_poke.addr); 861 + struct map *map = maps__find(machine__kernel_maps(machine), event->text_poke.addr); 866 862 u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; 867 863 868 864 if (dump_trace) ··· 918 914 if (map == NULL) 919 915 goto out; 920 916 921 - maps__insert(&machine->kmaps, map); 917 + maps__insert(machine__kernel_maps(machine), map); 922 918 923 919 /* Put the map here because maps__insert already got it */ 924 920 map__put(map); ··· 1104 1100 1105 1101 strlcpy(kmap->name, xm->name, KMAP_NAME_LEN); 1106 1102 1107 - maps__insert(&machine->kmaps, map); 1103 + maps__insert(machine__kernel_maps(machine), map); 1108 1104 1109 1105 pr_debug2("Added extra kernel map %s %" PRIx64 "-%" PRIx64 "\n", 1110 1106 kmap->name, map->start, map->end); ··· 1149 1145 int machine__map_x86_64_entry_trampolines(struct machine *machine, 1150 1146 struct dso *kernel) 1151 1147 { 1152 - struct maps *kmaps = &machine->kmaps; 1148 + struct maps *kmaps = machine__kernel_maps(machine); 1153 1149 int nr_cpus_avail, cpu; 1154 1150 bool found = false; 1155 1151 struct map *map; ··· 1219 1215 return -1; 1220 1216 1221 1217 machine->vmlinux_map->map_ip = machine->vmlinux_map->unmap_ip = identity__map_ip; 1222 - maps__insert(&machine->kmaps, machine->vmlinux_map); 1218 + maps__insert(machine__kernel_maps(machine), machine->vmlinux_map); 1223 1219 return 0; 1224 1220 } 1225 1221 ··· 1232 1228 return; 1233 1229 1234 1230 kmap = map__kmap(map); 1235 - maps__remove(&machine->kmaps, map); 1231 + maps__remove(machine__kernel_maps(machine), map); 1236 1232 if (kmap && kmap->ref_reloc_sym) { 1237 1233 zfree((char **)&kmap->ref_reloc_sym->name); 1238 1234 zfree(&kmap->ref_reloc_sym); ··· 1327 1323 * kernel, with modules between them, fixup the end of all 1328 1324 * sections. 1329 1325 */ 1330 - maps__fixup_end(&machine->kmaps); 1326 + maps__fixup_end(machine__kernel_maps(machine)); 1331 1327 } 1332 1328 1333 1329 return ret; ··· 1475 1471 machine->root_dir, version); 1476 1472 free(version); 1477 1473 1478 - return maps__set_modules_path_dir(&machine->kmaps, modules_path, 0); 1474 + return maps__set_modules_path_dir(machine__kernel_maps(machine), modules_path, 0); 1479 1475 } 1480 1476 int __weak arch__fix_module_text_start(u64 *start __maybe_unused, 1481 1477 u64 *size __maybe_unused, ··· 1548 1544 struct map *map = machine__kernel_map(machine); 1549 1545 1550 1546 map__get(map); 1551 - maps__remove(&machine->kmaps, map); 1547 + maps__remove(machine__kernel_maps(machine), map); 1552 1548 1553 1549 machine__set_kernel_mmap(machine, start, end); 1554 1550 1555 - maps__insert(&machine->kmaps, map); 1551 + maps__insert(machine__kernel_maps(machine), map); 1556 1552 map__put(map); 1557 1553 } 1558 1554
+4 -4
tools/perf/util/machine.h
··· 51 51 struct vdso_info *vdso_info; 52 52 struct perf_env *env; 53 53 struct dsos dsos; 54 - struct maps kmaps; 54 + struct maps *kmaps; 55 55 struct map *vmlinux_map; 56 56 u64 kernel_start; 57 57 pid_t *current_tid; ··· 83 83 static inline 84 84 struct maps *machine__kernel_maps(struct machine *machine) 85 85 { 86 - return &machine->kmaps; 86 + return machine->kmaps; 87 87 } 88 88 89 89 int machine__get_kernel_start(struct machine *machine); ··· 223 223 struct symbol *machine__find_kernel_symbol(struct machine *machine, u64 addr, 224 224 struct map **mapp) 225 225 { 226 - return maps__find_symbol(&machine->kmaps, addr, mapp); 226 + return maps__find_symbol(machine->kmaps, addr, mapp); 227 227 } 228 228 229 229 static inline ··· 231 231 const char *name, 232 232 struct map **mapp) 233 233 { 234 - return maps__find_symbol_by_name(&machine->kmaps, name, mapp); 234 + return maps__find_symbol_by_name(machine->kmaps, name, mapp); 235 235 } 236 236 237 237 int arch__fix_module_text_start(u64 *start, u64 *size, const char *name);
+1 -1
tools/perf/util/probe-event.c
··· 332 332 char module_name[128]; 333 333 334 334 snprintf(module_name, sizeof(module_name), "[%s]", module); 335 - map = maps__find_by_name(&host_machine->kmaps, module_name); 335 + map = maps__find_by_name(machine__kernel_maps(host_machine), module_name); 336 336 if (map) { 337 337 dso = map->dso; 338 338 goto found;