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

Merge branch 'perf' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux-2.6 into perf/core

+726 -352
+22
tools/perf/Documentation/perf-test.txt
··· 1 + perf-test(1) 2 + ============ 3 + 4 + NAME 5 + ---- 6 + perf-test - Runs sanity tests. 7 + 8 + SYNOPSIS 9 + -------- 10 + [verse] 11 + 'perf test <options>' 12 + 13 + DESCRIPTION 14 + ----------- 15 + This command does assorted sanity tests, initially thru linked routines but 16 + also will look for a directory with more tests in the form of scripts. 17 + 18 + OPTIONS 19 + ------- 20 + -v:: 21 + --verbose:: 22 + Be more verbose.
+3
tools/perf/Makefile
··· 187 187 ARCH := x86 188 188 endif 189 189 190 + $(shell sh -c 'mkdir -p $(OUTPUT)arch/$(ARCH)/util/' 2> /dev/null) 191 + 190 192 # CFLAGS and LDFLAGS are for the users to override from the command line. 191 193 192 194 # ··· 490 488 BUILTIN_OBJS += $(OUTPUT)builtin-kmem.o 491 489 BUILTIN_OBJS += $(OUTPUT)builtin-lock.o 492 490 BUILTIN_OBJS += $(OUTPUT)builtin-kvm.o 491 + BUILTIN_OBJS += $(OUTPUT)builtin-test.o 493 492 494 493 PERFLIBS = $(LIB_FILE) 495 494
+1 -1
tools/perf/builtin-annotate.c
··· 571 571 perf_session__fprintf(session, stdout); 572 572 573 573 if (verbose > 2) 574 - dsos__fprintf(&session->kerninfo_root, stdout); 574 + perf_session__fprintf_dsos(session, stdout); 575 575 576 576 perf_session__collapse_resort(&session->hists); 577 577 perf_session__output_resort(&session->hists, session->event_total[0]);
+1 -1
tools/perf/builtin-buildid-list.c
··· 46 46 if (with_hits) 47 47 perf_session__process_events(session, &build_id__mark_dso_hit_ops); 48 48 49 - dsos__fprintf_buildid(&session->kerninfo_root, stdout, with_hits); 49 + perf_session__fprintf_dsos_buildid(session, stdout, with_hits); 50 50 51 51 perf_session__delete(session); 52 52 return err;
+4 -6
tools/perf/builtin-kmem.c
··· 352 352 int n_lines, int is_caller) 353 353 { 354 354 struct rb_node *next; 355 - struct kernel_info *kerninfo; 355 + struct machine *machine; 356 356 357 357 printf("%.102s\n", graph_dotted_line); 358 358 printf(" %-34s |", is_caller ? "Callsite": "Alloc Ptr"); ··· 361 361 362 362 next = rb_first(root); 363 363 364 - kerninfo = kerninfo__findhost(&session->kerninfo_root); 365 - if (!kerninfo) { 364 + machine = perf_session__find_host_machine(session); 365 + if (!machine) { 366 366 pr_err("__print_result: couldn't find kernel information\n"); 367 367 return; 368 368 } ··· 370 370 struct alloc_stat *data = rb_entry(next, struct alloc_stat, 371 371 node); 372 372 struct symbol *sym = NULL; 373 - struct map_groups *kmaps = &kerninfo->kmaps; 374 373 struct map *map; 375 374 char buf[BUFSIZ]; 376 375 u64 addr; ··· 377 378 if (is_caller) { 378 379 addr = data->call_site; 379 380 if (!raw_ip) 380 - sym = map_groups__find_function(kmaps, addr, 381 - &map, NULL); 381 + sym = machine__find_kernel_function(machine, addr, &map, NULL); 382 382 } else 383 383 addr = data->ptr; 384 384
+17 -19
tools/perf/builtin-record.c
··· 456 456 } 457 457 } 458 458 459 - static void event__synthesize_guest_os(struct kernel_info *kerninfo, 460 - void *data __attribute__((unused))) 459 + static void event__synthesize_guest_os(struct machine *machine, void *data) 461 460 { 462 461 int err; 463 462 char *guest_kallsyms; 464 463 char path[PATH_MAX]; 464 + struct perf_session *psession = data; 465 465 466 - if (is_host_kernel(kerninfo)) 466 + if (machine__is_host(machine)) 467 467 return; 468 468 469 469 /* ··· 475 475 *in module instead of in guest kernel. 476 476 */ 477 477 err = event__synthesize_modules(process_synthesized_event, 478 - session, 479 - kerninfo); 478 + psession, machine); 480 479 if (err < 0) 481 480 pr_err("Couldn't record guest kernel [%d]'s reference" 482 - " relocation symbol.\n", kerninfo->pid); 481 + " relocation symbol.\n", machine->pid); 483 482 484 - if (is_default_guest(kerninfo)) 483 + if (machine__is_default_guest(machine)) 485 484 guest_kallsyms = (char *) symbol_conf.default_guest_kallsyms; 486 485 else { 487 - sprintf(path, "%s/proc/kallsyms", kerninfo->root_dir); 486 + sprintf(path, "%s/proc/kallsyms", machine->root_dir); 488 487 guest_kallsyms = path; 489 488 } 490 489 ··· 492 493 * have no _text sometimes. 493 494 */ 494 495 err = event__synthesize_kernel_mmap(process_synthesized_event, 495 - session, kerninfo, "_text"); 496 + psession, machine, "_text"); 496 497 if (err < 0) 497 498 err = event__synthesize_kernel_mmap(process_synthesized_event, 498 - session, kerninfo, "_stext"); 499 + psession, machine, "_stext"); 499 500 if (err < 0) 500 501 pr_err("Couldn't record guest kernel [%d]'s reference" 501 - " relocation symbol.\n", kerninfo->pid); 502 + " relocation symbol.\n", machine->pid); 502 503 } 503 504 504 505 static int __cmd_record(int argc, const char **argv) ··· 512 513 int child_ready_pipe[2], go_pipe[2]; 513 514 const bool forks = argc > 0; 514 515 char buf; 515 - struct kernel_info *kerninfo; 516 + struct machine *machine; 516 517 517 518 page_size = sysconf(_SC_PAGE_SIZE); 518 519 ··· 681 682 advance_output(err); 682 683 } 683 684 684 - kerninfo = kerninfo__findhost(&session->kerninfo_root); 685 - if (!kerninfo) { 685 + machine = perf_session__find_host_machine(session); 686 + if (!machine) { 686 687 pr_err("Couldn't find native kernel information.\n"); 687 688 return -1; 688 689 } 689 690 690 691 err = event__synthesize_kernel_mmap(process_synthesized_event, 691 - session, kerninfo, "_text"); 692 + session, machine, "_text"); 692 693 if (err < 0) 693 694 err = event__synthesize_kernel_mmap(process_synthesized_event, 694 - session, kerninfo, "_stext"); 695 + session, machine, "_stext"); 695 696 if (err < 0) { 696 697 pr_err("Couldn't record kernel reference relocation symbol.\n"); 697 698 return err; 698 699 } 699 700 700 701 err = event__synthesize_modules(process_synthesized_event, 701 - session, kerninfo); 702 + session, machine); 702 703 if (err < 0) { 703 704 pr_err("Couldn't record kernel reference relocation symbol.\n"); 704 705 return err; 705 706 } 706 707 if (perf_guest) 707 - kerninfo__process_allkernels(&session->kerninfo_root, 708 - event__synthesize_guest_os, session); 708 + perf_session__process_machines(session, event__synthesize_guest_os); 709 709 710 710 if (!system_wide && profile_cpu == -1) 711 711 event__synthesize_thread(target_tid, process_synthesized_event,
+1 -1
tools/perf/builtin-report.c
··· 313 313 perf_session__fprintf(session, stdout); 314 314 315 315 if (verbose > 2) 316 - dsos__fprintf(&session->kerninfo_root, stdout); 316 + perf_session__fprintf_dsos(session, stdout); 317 317 318 318 next = rb_first(&session->stats_by_id); 319 319 while (next) {
+281
tools/perf/builtin-test.c
··· 1 + /* 2 + * builtin-test.c 3 + * 4 + * Builtin regression testing command: ever growing number of sanity tests 5 + */ 6 + #include "builtin.h" 7 + 8 + #include "util/cache.h" 9 + #include "util/debug.h" 10 + #include "util/parse-options.h" 11 + #include "util/session.h" 12 + #include "util/symbol.h" 13 + #include "util/thread.h" 14 + 15 + static long page_size; 16 + 17 + static int vmlinux_matches_kallsyms_filter(struct map *map __used, struct symbol *sym) 18 + { 19 + bool *visited = symbol__priv(sym); 20 + *visited = true; 21 + return 0; 22 + } 23 + 24 + static int test__vmlinux_matches_kallsyms(void) 25 + { 26 + int err = -1; 27 + struct rb_node *nd; 28 + struct symbol *sym; 29 + struct map *kallsyms_map, *vmlinux_map; 30 + struct machine kallsyms, vmlinux; 31 + enum map_type type = MAP__FUNCTION; 32 + struct ref_reloc_sym ref_reloc_sym = { .name = "_stext", }; 33 + 34 + /* 35 + * Step 1: 36 + * 37 + * Init the machines that will hold kernel, modules obtained from 38 + * both vmlinux + .ko files and from /proc/kallsyms split by modules. 39 + */ 40 + machine__init(&kallsyms, "", HOST_KERNEL_ID); 41 + machine__init(&vmlinux, "", HOST_KERNEL_ID); 42 + 43 + /* 44 + * Step 2: 45 + * 46 + * Create the kernel maps for kallsyms and the DSO where we will then 47 + * load /proc/kallsyms. Also create the modules maps from /proc/modules 48 + * and find the .ko files that match them in /lib/modules/`uname -r`/. 49 + */ 50 + if (machine__create_kernel_maps(&kallsyms) < 0) { 51 + pr_debug("machine__create_kernel_maps "); 52 + return -1; 53 + } 54 + 55 + /* 56 + * Step 3: 57 + * 58 + * Load and split /proc/kallsyms into multiple maps, one per module. 59 + */ 60 + if (machine__load_kallsyms(&kallsyms, "/proc/kallsyms", type, NULL) <= 0) { 61 + pr_debug("dso__load_kallsyms "); 62 + goto out; 63 + } 64 + 65 + /* 66 + * Step 4: 67 + * 68 + * kallsyms will be internally on demand sorted by name so that we can 69 + * find the reference relocation * symbol, i.e. the symbol we will use 70 + * to see if the running kernel was relocated by checking if it has the 71 + * same value in the vmlinux file we load. 72 + */ 73 + kallsyms_map = machine__kernel_map(&kallsyms, type); 74 + 75 + sym = map__find_symbol_by_name(kallsyms_map, ref_reloc_sym.name, NULL); 76 + if (sym == NULL) { 77 + pr_debug("dso__find_symbol_by_name "); 78 + goto out; 79 + } 80 + 81 + ref_reloc_sym.addr = sym->start; 82 + 83 + /* 84 + * Step 5: 85 + * 86 + * Now repeat step 2, this time for the vmlinux file we'll auto-locate. 87 + */ 88 + if (machine__create_kernel_maps(&vmlinux) < 0) { 89 + pr_debug("machine__create_kernel_maps "); 90 + goto out; 91 + } 92 + 93 + vmlinux_map = machine__kernel_map(&vmlinux, type); 94 + map__kmap(vmlinux_map)->ref_reloc_sym = &ref_reloc_sym; 95 + 96 + /* 97 + * Step 6: 98 + * 99 + * Locate a vmlinux file in the vmlinux path that has a buildid that 100 + * matches the one of the running kernel. 101 + * 102 + * While doing that look if we find the ref reloc symbol, if we find it 103 + * we'll have its ref_reloc_symbol.unrelocated_addr and then 104 + * maps__reloc_vmlinux will notice and set proper ->[un]map_ip routines 105 + * to fixup the symbols. 106 + */ 107 + if (machine__load_vmlinux_path(&vmlinux, type, 108 + vmlinux_matches_kallsyms_filter) <= 0) { 109 + pr_debug("machine__load_vmlinux_path "); 110 + goto out; 111 + } 112 + 113 + err = 0; 114 + /* 115 + * Step 7: 116 + * 117 + * Now look at the symbols in the vmlinux DSO and check if we find all of them 118 + * in the kallsyms dso. For the ones that are in both, check its names and 119 + * end addresses too. 120 + */ 121 + for (nd = rb_first(&vmlinux_map->dso->symbols[type]); nd; nd = rb_next(nd)) { 122 + struct symbol *pair; 123 + 124 + sym = rb_entry(nd, struct symbol, rb_node); 125 + pair = machine__find_kernel_symbol(&kallsyms, type, sym->start, NULL, NULL); 126 + 127 + if (pair && pair->start == sym->start) { 128 + next_pair: 129 + if (strcmp(sym->name, pair->name) == 0) { 130 + /* 131 + * kallsyms don't have the symbol end, so we 132 + * set that by using the next symbol start - 1, 133 + * in some cases we get this up to a page 134 + * wrong, trace_kmalloc when I was developing 135 + * this code was one such example, 2106 bytes 136 + * off the real size. More than that and we 137 + * _really_ have a problem. 138 + */ 139 + s64 skew = sym->end - pair->end; 140 + if (llabs(skew) < page_size) 141 + continue; 142 + 143 + pr_debug("%#Lx: diff end addr for %s v: %#Lx k: %#Lx\n", 144 + sym->start, sym->name, sym->end, pair->end); 145 + } else { 146 + struct rb_node *nnd = rb_prev(&pair->rb_node); 147 + 148 + if (nnd) { 149 + struct symbol *next = rb_entry(nnd, struct symbol, rb_node); 150 + 151 + if (next->start == sym->start) { 152 + pair = next; 153 + goto next_pair; 154 + } 155 + } 156 + pr_debug("%#Lx: diff name v: %s k: %s\n", 157 + sym->start, sym->name, pair->name); 158 + } 159 + } else 160 + pr_debug("%#Lx: %s not on kallsyms\n", sym->start, sym->name); 161 + 162 + err = -1; 163 + } 164 + 165 + if (!verbose) 166 + goto out; 167 + 168 + pr_info("Maps only in vmlinux:\n"); 169 + 170 + for (nd = rb_first(&vmlinux.kmaps.maps[type]); nd; nd = rb_next(nd)) { 171 + struct map *pos = rb_entry(nd, struct map, rb_node), *pair; 172 + /* 173 + * If it is the kernel, kallsyms is always "[kernel.kallsyms]", while 174 + * the kernel will have the path for the vmlinux file being used, 175 + * so use the short name, less descriptive but the same ("[kernel]" in 176 + * both cases. 177 + */ 178 + pair = map_groups__find_by_name(&kallsyms.kmaps, type, 179 + (pos->dso->kernel ? 180 + pos->dso->short_name : 181 + pos->dso->name)); 182 + if (pair) 183 + pair->priv = 1; 184 + else 185 + map__fprintf(pos, stderr); 186 + } 187 + 188 + pr_info("Maps in vmlinux with a different name in kallsyms:\n"); 189 + 190 + for (nd = rb_first(&vmlinux.kmaps.maps[type]); nd; nd = rb_next(nd)) { 191 + struct map *pos = rb_entry(nd, struct map, rb_node), *pair; 192 + 193 + pair = map_groups__find(&kallsyms.kmaps, type, pos->start); 194 + if (pair == NULL || pair->priv) 195 + continue; 196 + 197 + if (pair->start == pos->start) { 198 + pair->priv = 1; 199 + pr_info(" %Lx-%Lx %Lx %s in kallsyms as", 200 + pos->start, pos->end, pos->pgoff, pos->dso->name); 201 + if (pos->pgoff != pair->pgoff || pos->end != pair->end) 202 + pr_info(": \n*%Lx-%Lx %Lx", 203 + pair->start, pair->end, pair->pgoff); 204 + pr_info(" %s\n", pair->dso->name); 205 + pair->priv = 1; 206 + } 207 + } 208 + 209 + pr_info("Maps only in kallsyms:\n"); 210 + 211 + for (nd = rb_first(&kallsyms.kmaps.maps[type]); 212 + nd; nd = rb_next(nd)) { 213 + struct map *pos = rb_entry(nd, struct map, rb_node); 214 + 215 + if (!pos->priv) 216 + map__fprintf(pos, stderr); 217 + } 218 + out: 219 + return err; 220 + } 221 + 222 + static struct test { 223 + const char *desc; 224 + int (*func)(void); 225 + } tests[] = { 226 + { 227 + .desc = "vmlinux symtab matches kallsyms", 228 + .func = test__vmlinux_matches_kallsyms, 229 + }, 230 + { 231 + .func = NULL, 232 + }, 233 + }; 234 + 235 + static int __cmd_test(void) 236 + { 237 + int i = 0; 238 + 239 + page_size = sysconf(_SC_PAGE_SIZE); 240 + 241 + while (tests[i].func) { 242 + int err; 243 + pr_info("%2d: %s:", i + 1, tests[i].desc); 244 + pr_debug("\n--- start ---\n"); 245 + err = tests[i].func(); 246 + pr_debug("---- end ----\n%s:", tests[i].desc); 247 + pr_info(" %s\n", err ? "FAILED!\n" : "Ok"); 248 + ++i; 249 + } 250 + 251 + return 0; 252 + } 253 + 254 + static const char * const test_usage[] = { 255 + "perf test [<options>]", 256 + NULL, 257 + }; 258 + 259 + static const struct option test_options[] = { 260 + OPT_BOOLEAN('v', "verbose", &verbose, 261 + "be more verbose (show symbol address, etc)"), 262 + OPT_END() 263 + }; 264 + 265 + int cmd_test(int argc, const char **argv, const char *prefix __used) 266 + { 267 + argc = parse_options(argc, argv, test_options, test_usage, 0); 268 + if (argc) 269 + usage_with_options(test_usage, test_options); 270 + 271 + symbol_conf.priv_size = sizeof(int); 272 + symbol_conf.sort_by_name = true; 273 + symbol_conf.try_vmlinux_path = true; 274 + 275 + if (symbol__init() < 0) 276 + return -1; 277 + 278 + setup_pager(); 279 + 280 + return __cmd_test(); 281 + }
+7 -8
tools/perf/builtin-top.c
··· 854 854 case 'Q': 855 855 printf("exiting.\n"); 856 856 if (dump_symtab) 857 - dsos__fprintf(&session->kerninfo_root, stderr); 857 + perf_session__fprintf_dsos(session, stderr); 858 858 exit(0); 859 859 case 's': 860 860 prompt_symbol(&sym_filter_entry, "Enter details symbol"); ··· 982 982 u64 ip = self->ip.ip; 983 983 struct sym_entry *syme; 984 984 struct addr_location al; 985 - struct kernel_info *kerninfo; 985 + struct machine *machine; 986 986 u8 origin = self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; 987 987 988 988 ++samples; ··· 992 992 ++us_samples; 993 993 if (hide_user_symbols) 994 994 return; 995 - kerninfo = kerninfo__findhost(&session->kerninfo_root); 995 + machine = perf_session__find_host_machine(session); 996 996 break; 997 997 case PERF_RECORD_MISC_KERNEL: 998 998 ++kernel_samples; 999 999 if (hide_kernel_symbols) 1000 1000 return; 1001 - kerninfo = kerninfo__findhost(&session->kerninfo_root); 1001 + machine = perf_session__find_host_machine(session); 1002 1002 break; 1003 1003 case PERF_RECORD_MISC_GUEST_KERNEL: 1004 1004 ++guest_kernel_samples; 1005 - kerninfo = kerninfo__find(&session->kerninfo_root, 1006 - self->ip.pid); 1005 + machine = perf_session__find_machine(session, self->ip.pid); 1007 1006 break; 1008 1007 case PERF_RECORD_MISC_GUEST_USER: 1009 1008 ++guest_us_samples; ··· 1015 1016 return; 1016 1017 } 1017 1018 1018 - if (!kerninfo && perf_guest) { 1019 + if (!machine && perf_guest) { 1019 1020 pr_err("Can't find guest [%d]'s kernel information\n", 1020 1021 self->ip.pid); 1021 1022 return; ··· 1040 1041 * --hide-kernel-symbols, even if the user specifies an 1041 1042 * invalid --vmlinux ;-) 1042 1043 */ 1043 - if (al.map == kerninfo->vmlinux_maps[MAP__FUNCTION] && 1044 + if (al.map == machine->vmlinux_maps[MAP__FUNCTION] && 1044 1045 RB_EMPTY_ROOT(&al.map->dso->symbols[MAP__FUNCTION])) { 1045 1046 pr_err("The %s file can't be used\n", 1046 1047 symbol_conf.vmlinux_name);
+1
tools/perf/builtin.h
··· 33 33 extern int cmd_kmem(int argc, const char **argv, const char *prefix); 34 34 extern int cmd_lock(int argc, const char **argv, const char *prefix); 35 35 extern int cmd_kvm(int argc, const char **argv, const char *prefix); 36 + extern int cmd_test(int argc, const char **argv, const char *prefix); 36 37 37 38 #endif
+1
tools/perf/command-list.txt
··· 20 20 perf-kmem mainporcelain common 21 21 perf-lock mainporcelain common 22 22 perf-kvm mainporcelain common 23 + perf-test mainporcelain common
+1
tools/perf/perf.c
··· 308 308 { "kmem", cmd_kmem, 0 }, 309 309 { "lock", cmd_lock, 0 }, 310 310 { "kvm", cmd_kvm, 0 }, 311 + { "test", cmd_test, 0 }, 311 312 }; 312 313 unsigned int i; 313 314 static const char ext[] = STRIP_EXTENSION;
+42 -47
tools/perf/util/event.c
··· 172 172 173 173 int event__synthesize_modules(event__handler_t process, 174 174 struct perf_session *session, 175 - struct kernel_info *kerninfo) 175 + struct machine *machine) 176 176 { 177 177 struct rb_node *nd; 178 - struct map_groups *kmaps = &kerninfo->kmaps; 178 + struct map_groups *kmaps = &machine->kmaps; 179 179 u16 misc; 180 180 181 181 /* 182 182 * kernel uses 0 for user space maps, see kernel/perf_event.c 183 183 * __perf_event_mmap 184 184 */ 185 - if (is_host_kernel(kerninfo)) 185 + if (machine__is_host(machine)) 186 186 misc = PERF_RECORD_MISC_KERNEL; 187 187 else 188 188 misc = PERF_RECORD_MISC_GUEST_KERNEL; ··· 204 204 (sizeof(ev.mmap.filename) - size)); 205 205 ev.mmap.start = pos->start; 206 206 ev.mmap.len = pos->end - pos->start; 207 - ev.mmap.pid = kerninfo->pid; 207 + ev.mmap.pid = machine->pid; 208 208 209 209 memcpy(ev.mmap.filename, pos->dso->long_name, 210 210 pos->dso->long_name_len + 1); ··· 267 267 268 268 int event__synthesize_kernel_mmap(event__handler_t process, 269 269 struct perf_session *session, 270 - struct kernel_info *kerninfo, 270 + struct machine *machine, 271 271 const char *symbol_name) 272 272 { 273 273 size_t size; ··· 288 288 */ 289 289 struct process_symbol_args args = { .name = symbol_name, }; 290 290 291 - mmap_name = kern_mmap_name(kerninfo, name_buff); 292 - if (is_host_kernel(kerninfo)) { 291 + mmap_name = machine__mmap_name(machine, name_buff, sizeof(name_buff)); 292 + if (machine__is_host(machine)) { 293 293 /* 294 294 * kernel uses PERF_RECORD_MISC_USER for user space maps, 295 295 * see kernel/perf_event.c __perf_event_mmap ··· 298 298 filename = "/proc/kallsyms"; 299 299 } else { 300 300 ev.header.misc = PERF_RECORD_MISC_GUEST_KERNEL; 301 - if (is_default_guest(kerninfo)) 301 + if (machine__is_default_guest(machine)) 302 302 filename = (char *) symbol_conf.default_guest_kallsyms; 303 303 else { 304 - sprintf(path, "%s/proc/kallsyms", kerninfo->root_dir); 304 + sprintf(path, "%s/proc/kallsyms", machine->root_dir); 305 305 filename = path; 306 306 } 307 307 } ··· 309 309 if (kallsyms__parse(filename, &args, find_symbol_cb) <= 0) 310 310 return -ENOENT; 311 311 312 - map = kerninfo->vmlinux_maps[MAP__FUNCTION]; 312 + map = machine->vmlinux_maps[MAP__FUNCTION]; 313 313 size = snprintf(ev.mmap.filename, sizeof(ev.mmap.filename), 314 314 "%s%s", mmap_name, symbol_name) + 1; 315 315 size = ALIGN(size, sizeof(u64)); ··· 318 318 ev.mmap.pgoff = args.start; 319 319 ev.mmap.start = map->start; 320 320 ev.mmap.len = map->end - ev.mmap.start; 321 - ev.mmap.pid = kerninfo->pid; 321 + ev.mmap.pid = machine->pid; 322 322 323 323 return process(&ev, session); 324 324 } ··· 389 389 { 390 390 struct map *map; 391 391 char kmmap_prefix[PATH_MAX]; 392 - struct kernel_info *kerninfo; 392 + struct machine *machine; 393 393 enum dso_kernel_type kernel_type; 394 394 bool is_kernel_mmap; 395 395 396 - kerninfo = kerninfo__findnew(&session->kerninfo_root, self->mmap.pid); 397 - if (!kerninfo) { 398 - pr_err("Can't find id %d's kerninfo\n", self->mmap.pid); 396 + machine = perf_session__findnew_machine(session, self->mmap.pid); 397 + if (!machine) { 398 + pr_err("Can't find id %d's machine\n", self->mmap.pid); 399 399 goto out_problem; 400 400 } 401 401 402 - kern_mmap_name(kerninfo, kmmap_prefix); 403 - if (is_host_kernel(kerninfo)) 402 + machine__mmap_name(machine, kmmap_prefix, sizeof(kmmap_prefix)); 403 + if (machine__is_host(machine)) 404 404 kernel_type = DSO_TYPE_KERNEL; 405 405 else 406 406 kernel_type = DSO_TYPE_GUEST_KERNEL; ··· 429 429 } else 430 430 strcpy(short_module_name, self->mmap.filename); 431 431 432 - map = map_groups__new_module(&kerninfo->kmaps, 433 - self->mmap.start, 434 - self->mmap.filename, 435 - kerninfo); 432 + map = machine__new_module(machine, self->mmap.start, 433 + self->mmap.filename); 436 434 if (map == NULL) 437 435 goto out_problem; 438 436 ··· 447 449 * Should be there already, from the build-id table in 448 450 * the header. 449 451 */ 450 - struct dso *kernel = __dsos__findnew(&kerninfo->dsos__kernel, 451 - kmmap_prefix); 452 + struct dso *kernel = __dsos__findnew(&machine->kernel_dsos, 453 + kmmap_prefix); 452 454 if (kernel == NULL) 453 455 goto out_problem; 454 456 455 457 kernel->kernel = kernel_type; 456 - if (__map_groups__create_kernel_maps(&kerninfo->kmaps, 457 - kerninfo->vmlinux_maps, kernel) < 0) 458 + if (__machine__create_kernel_maps(machine, kernel) < 0) 458 459 goto out_problem; 459 460 460 - event_set_kernel_mmap_len(kerninfo->vmlinux_maps, self); 461 - perf_session__set_kallsyms_ref_reloc_sym(kerninfo->vmlinux_maps, 462 - symbol_name, 463 - self->mmap.pgoff); 464 - if (is_default_guest(kerninfo)) { 461 + event_set_kernel_mmap_len(machine->vmlinux_maps, self); 462 + perf_session__set_kallsyms_ref_reloc_sym(machine->vmlinux_maps, 463 + symbol_name, 464 + self->mmap.pgoff); 465 + if (machine__is_default_guest(machine)) { 465 466 /* 466 467 * preload dso of guest kernel and modules 467 468 */ 468 - dso__load(kernel, 469 - kerninfo->vmlinux_maps[MAP__FUNCTION], 470 - NULL); 469 + dso__load(kernel, machine->vmlinux_maps[MAP__FUNCTION], 470 + NULL); 471 471 } 472 472 } 473 473 return 0; ··· 475 479 476 480 int event__process_mmap(event_t *self, struct perf_session *session) 477 481 { 478 - struct kernel_info *kerninfo; 482 + struct machine *machine; 479 483 struct thread *thread; 480 484 struct map *map; 481 485 u8 cpumode = self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; ··· 494 498 } 495 499 496 500 thread = perf_session__findnew(session, self->mmap.pid); 497 - kerninfo = kerninfo__findhost(&session->kerninfo_root); 498 - map = map__new(&kerninfo->dsos__user, self->mmap.start, 501 + machine = perf_session__find_host_machine(session); 502 + map = map__new(&machine->user_dsos, self->mmap.start, 499 503 self->mmap.len, self->mmap.pgoff, 500 504 self->mmap.pid, self->mmap.filename, 501 505 MAP__FUNCTION, session->cwd, session->cwdlen); ··· 542 546 struct addr_location *al) 543 547 { 544 548 struct map_groups *mg = &self->mg; 545 - struct kernel_info *kerninfo = NULL; 549 + struct machine *machine = NULL; 546 550 547 551 al->thread = self; 548 552 al->addr = addr; ··· 551 555 552 556 if (cpumode == PERF_RECORD_MISC_KERNEL && perf_host) { 553 557 al->level = 'k'; 554 - kerninfo = kerninfo__findhost(&session->kerninfo_root); 555 - mg = &kerninfo->kmaps; 558 + machine = perf_session__find_host_machine(session); 559 + mg = &machine->kmaps; 556 560 } else if (cpumode == PERF_RECORD_MISC_USER && perf_host) { 557 561 al->level = '.'; 558 - kerninfo = kerninfo__findhost(&session->kerninfo_root); 562 + machine = perf_session__find_host_machine(session); 559 563 } else if (cpumode == PERF_RECORD_MISC_GUEST_KERNEL && perf_guest) { 560 564 al->level = 'g'; 561 - kerninfo = kerninfo__find(&session->kerninfo_root, pid); 562 - if (!kerninfo) { 565 + machine = perf_session__find_machine(session, pid); 566 + if (!machine) { 563 567 al->map = NULL; 564 568 return; 565 569 } 566 - mg = &kerninfo->kmaps; 570 + mg = &machine->kmaps; 567 571 } else { 568 572 /* 569 573 * 'u' means guest os user space. ··· 599 603 * in the whole kernel symbol list. 600 604 */ 601 605 if ((long long)al->addr < 0 && 602 - cpumode == PERF_RECORD_MISC_KERNEL && 603 - kerninfo && 604 - mg != &kerninfo->kmaps) { 605 - mg = &kerninfo->kmaps; 606 + cpumode == PERF_RECORD_MISC_KERNEL && 607 + machine && mg != &machine->kmaps) { 608 + mg = &machine->kmaps; 606 609 goto try_again; 607 610 } 608 611 } else
+2 -2
tools/perf/util/event.h
··· 156 156 struct perf_session *session); 157 157 int event__synthesize_kernel_mmap(event__handler_t process, 158 158 struct perf_session *session, 159 - struct kernel_info *kerninfo, 159 + struct machine *machine, 160 160 const char *symbol_name); 161 161 162 162 int event__synthesize_modules(event__handler_t process, 163 163 struct perf_session *session, 164 - struct kernel_info *kerninfo); 164 + struct machine *machine); 165 165 166 166 int event__process_comm(event_t *self, struct perf_session *session); 167 167 int event__process_lost(event_t *self, struct perf_session *session);
+33 -37
tools/perf/util/header.c
··· 229 229 int err = 0; 230 230 u16 kmisc, umisc; 231 231 232 - for (nd = rb_first(&session->kerninfo_root); nd; nd = rb_next(nd)) { 233 - struct kernel_info *pos = rb_entry(nd, struct kernel_info, 234 - rb_node); 235 - if (is_host_kernel(pos)) { 232 + for (nd = rb_first(&session->machines); nd; nd = rb_next(nd)) { 233 + struct machine *pos = rb_entry(nd, struct machine, rb_node); 234 + if (machine__is_host(pos)) { 236 235 kmisc = PERF_RECORD_MISC_KERNEL; 237 236 umisc = PERF_RECORD_MISC_USER; 238 237 } else { ··· 239 240 umisc = PERF_RECORD_MISC_GUEST_USER; 240 241 } 241 242 242 - err = __dsos__write_buildid_table(&pos->dsos__kernel, pos->pid, 243 - kmisc, fd); 243 + err = __dsos__write_buildid_table(&pos->kernel_dsos, pos->pid, 244 + kmisc, fd); 244 245 if (err == 0) 245 - err = __dsos__write_buildid_table(&pos->dsos__user, 246 - pos->pid, umisc, fd); 246 + err = __dsos__write_buildid_table(&pos->user_dsos, 247 + pos->pid, umisc, fd); 247 248 if (err) 248 249 break; 249 250 } ··· 377 378 if (mkdir(debugdir, 0755) != 0 && errno != EEXIST) 378 379 return -1; 379 380 380 - for (nd = rb_first(&session->kerninfo_root); nd; nd = rb_next(nd)) { 381 - struct kernel_info *pos = rb_entry(nd, struct kernel_info, 382 - rb_node); 383 - ret |= __dsos__cache_build_ids(&pos->dsos__kernel, debugdir); 384 - ret |= __dsos__cache_build_ids(&pos->dsos__user, debugdir); 381 + for (nd = rb_first(&session->machines); nd; nd = rb_next(nd)) { 382 + struct machine *pos = rb_entry(nd, struct machine, rb_node); 383 + ret |= __dsos__cache_build_ids(&pos->kernel_dsos, debugdir); 384 + ret |= __dsos__cache_build_ids(&pos->user_dsos, debugdir); 385 385 } 386 386 return ret ? -1 : 0; 387 387 } ··· 392 394 struct perf_session, header); 393 395 struct rb_node *nd; 394 396 395 - for (nd = rb_first(&session->kerninfo_root); nd; nd = rb_next(nd)) { 396 - struct kernel_info *pos = rb_entry(nd, struct kernel_info, 397 - rb_node); 398 - ret |= __dsos__read_build_ids(&pos->dsos__kernel, with_hits); 399 - ret |= __dsos__read_build_ids(&pos->dsos__user, with_hits); 397 + for (nd = rb_first(&session->machines); nd; nd = rb_next(nd)) { 398 + struct machine *pos = rb_entry(nd, struct machine, rb_node); 399 + ret |= __dsos__read_build_ids(&pos->kernel_dsos, with_hits); 400 + ret |= __dsos__read_build_ids(&pos->user_dsos, with_hits); 400 401 } 401 402 402 403 return ret; ··· 682 685 { 683 686 int err = -1; 684 687 struct list_head *head; 685 - struct kernel_info *kerninfo; 688 + struct machine *machine; 686 689 u16 misc; 687 690 struct dso *dso; 688 691 enum dso_kernel_type dso_type; 689 692 690 - kerninfo = kerninfo__findnew(&session->kerninfo_root, bev->pid); 691 - if (!kerninfo) 693 + machine = perf_session__findnew_machine(session, bev->pid); 694 + if (!machine) 692 695 goto out; 693 696 694 697 misc = bev->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; ··· 696 699 switch (misc) { 697 700 case PERF_RECORD_MISC_KERNEL: 698 701 dso_type = DSO_TYPE_KERNEL; 699 - head = &kerninfo->dsos__kernel; 702 + head = &machine->kernel_dsos; 700 703 break; 701 704 case PERF_RECORD_MISC_GUEST_KERNEL: 702 705 dso_type = DSO_TYPE_GUEST_KERNEL; 703 - head = &kerninfo->dsos__kernel; 706 + head = &machine->kernel_dsos; 704 707 break; 705 708 case PERF_RECORD_MISC_USER: 706 709 case PERF_RECORD_MISC_GUEST_USER: 707 710 dso_type = DSO_TYPE_USER; 708 - head = &kerninfo->dsos__user; 711 + head = &machine->user_dsos; 709 712 break; 710 713 default: 711 714 goto out; ··· 1110 1113 } 1111 1114 1112 1115 int event__synthesize_build_id(struct dso *pos, u16 misc, 1113 - event__handler_t process, 1114 - struct kernel_info *kerninfo, 1116 + event__handler_t process, struct machine *machine, 1115 1117 struct perf_session *session) 1116 1118 { 1117 1119 event_t ev; ··· 1127 1131 memcpy(&ev.build_id.build_id, pos->build_id, sizeof(pos->build_id)); 1128 1132 ev.build_id.header.type = PERF_RECORD_HEADER_BUILD_ID; 1129 1133 ev.build_id.header.misc = misc; 1130 - ev.build_id.pid = kerninfo->pid; 1134 + ev.build_id.pid = machine->pid; 1131 1135 ev.build_id.header.size = sizeof(ev.build_id) + len; 1132 1136 memcpy(&ev.build_id.filename, pos->long_name, pos->long_name_len); 1133 1137 ··· 1138 1142 1139 1143 static int __event_synthesize_build_ids(struct list_head *head, u16 misc, 1140 1144 event__handler_t process, 1141 - struct kernel_info *kerninfo, 1145 + struct machine *machine, 1142 1146 struct perf_session *session) 1143 1147 { 1144 1148 struct dso *pos; ··· 1149 1153 continue; 1150 1154 1151 1155 err = event__synthesize_build_id(pos, misc, process, 1152 - kerninfo, session); 1156 + machine, session); 1153 1157 if (err < 0) 1154 1158 return err; 1155 1159 } ··· 1162 1166 { 1163 1167 int err = 0; 1164 1168 u16 kmisc, umisc; 1165 - struct kernel_info *pos; 1169 + struct machine *pos; 1166 1170 struct rb_node *nd; 1167 1171 1168 1172 if (!dsos__read_build_ids(&session->header, true)) 1169 1173 return 0; 1170 1174 1171 - for (nd = rb_first(&session->kerninfo_root); nd; nd = rb_next(nd)) { 1172 - pos = rb_entry(nd, struct kernel_info, rb_node); 1173 - if (is_host_kernel(pos)) { 1175 + for (nd = rb_first(&session->machines); nd; nd = rb_next(nd)) { 1176 + pos = rb_entry(nd, struct machine, rb_node); 1177 + if (machine__is_host(pos)) { 1174 1178 kmisc = PERF_RECORD_MISC_KERNEL; 1175 1179 umisc = PERF_RECORD_MISC_USER; 1176 1180 } else { ··· 1178 1182 umisc = PERF_RECORD_MISC_GUEST_USER; 1179 1183 } 1180 1184 1181 - err = __event_synthesize_build_ids(&pos->dsos__kernel, 1182 - kmisc, process, pos, session); 1185 + err = __event_synthesize_build_ids(&pos->kernel_dsos, kmisc, 1186 + process, pos, session); 1183 1187 if (err == 0) 1184 - err = __event_synthesize_build_ids(&pos->dsos__user, 1185 - umisc, process, pos, session); 1188 + err = __event_synthesize_build_ids(&pos->user_dsos, umisc, 1189 + process, pos, session); 1186 1190 if (err) 1187 1191 break; 1188 1192 }
+1 -1
tools/perf/util/header.h
··· 120 120 121 121 int event__synthesize_build_id(struct dso *pos, u16 misc, 122 122 event__handler_t process, 123 - struct kernel_info *kerninfo, 123 + struct machine *machine, 124 124 struct perf_session *session); 125 125 int event__synthesize_build_ids(event__handler_t process, 126 126 struct perf_session *session);
+65 -58
tools/perf/util/map.c
··· 245 245 self->maps[i] = RB_ROOT; 246 246 INIT_LIST_HEAD(&self->removed_maps[i]); 247 247 } 248 - self->this_kerninfo = NULL; 248 + self->machine = NULL; 249 249 } 250 250 251 251 void map_groups__flush(struct map_groups *self) ··· 513 513 return NULL; 514 514 } 515 515 516 - struct kernel_info *add_new_kernel_info(struct rb_root *kerninfo_root, 517 - pid_t pid, const char *root_dir) 516 + int machine__init(struct machine *self, const char *root_dir, pid_t pid) 518 517 { 519 - struct rb_node **p = &kerninfo_root->rb_node; 520 - struct rb_node *parent = NULL; 521 - struct kernel_info *kerninfo, *pos; 518 + map_groups__init(&self->kmaps); 519 + RB_CLEAR_NODE(&self->rb_node); 520 + INIT_LIST_HEAD(&self->user_dsos); 521 + INIT_LIST_HEAD(&self->kernel_dsos); 522 522 523 - kerninfo = malloc(sizeof(struct kernel_info)); 524 - if (!kerninfo) 523 + self->kmaps.machine = self; 524 + self->pid = pid; 525 + self->root_dir = strdup(root_dir); 526 + return self->root_dir == NULL ? -ENOMEM : 0; 527 + } 528 + 529 + struct machine *machines__add(struct rb_root *self, pid_t pid, 530 + const char *root_dir) 531 + { 532 + struct rb_node **p = &self->rb_node; 533 + struct rb_node *parent = NULL; 534 + struct machine *pos, *machine = malloc(sizeof(*machine)); 535 + 536 + if (!machine) 525 537 return NULL; 526 538 527 - kerninfo->pid = pid; 528 - map_groups__init(&kerninfo->kmaps); 529 - kerninfo->root_dir = strdup(root_dir); 530 - RB_CLEAR_NODE(&kerninfo->rb_node); 531 - INIT_LIST_HEAD(&kerninfo->dsos__user); 532 - INIT_LIST_HEAD(&kerninfo->dsos__kernel); 533 - kerninfo->kmaps.this_kerninfo = kerninfo; 539 + if (machine__init(machine, root_dir, pid) != 0) { 540 + free(machine); 541 + return NULL; 542 + } 534 543 535 544 while (*p != NULL) { 536 545 parent = *p; 537 - pos = rb_entry(parent, struct kernel_info, rb_node); 546 + pos = rb_entry(parent, struct machine, rb_node); 538 547 if (pid < pos->pid) 539 548 p = &(*p)->rb_left; 540 549 else 541 550 p = &(*p)->rb_right; 542 551 } 543 552 544 - rb_link_node(&kerninfo->rb_node, parent, p); 545 - rb_insert_color(&kerninfo->rb_node, kerninfo_root); 553 + rb_link_node(&machine->rb_node, parent, p); 554 + rb_insert_color(&machine->rb_node, self); 546 555 547 - return kerninfo; 556 + return machine; 548 557 } 549 558 550 - struct kernel_info *kerninfo__find(struct rb_root *kerninfo_root, pid_t pid) 559 + struct machine *machines__find(struct rb_root *self, pid_t pid) 551 560 { 552 - struct rb_node **p = &kerninfo_root->rb_node; 561 + struct rb_node **p = &self->rb_node; 553 562 struct rb_node *parent = NULL; 554 - struct kernel_info *kerninfo; 555 - struct kernel_info *default_kerninfo = NULL; 563 + struct machine *machine; 564 + struct machine *default_machine = NULL; 556 565 557 566 while (*p != NULL) { 558 567 parent = *p; 559 - kerninfo = rb_entry(parent, struct kernel_info, rb_node); 560 - if (pid < kerninfo->pid) 568 + machine = rb_entry(parent, struct machine, rb_node); 569 + if (pid < machine->pid) 561 570 p = &(*p)->rb_left; 562 - else if (pid > kerninfo->pid) 571 + else if (pid > machine->pid) 563 572 p = &(*p)->rb_right; 564 573 else 565 - return kerninfo; 566 - if (!kerninfo->pid) 567 - default_kerninfo = kerninfo; 574 + return machine; 575 + if (!machine->pid) 576 + default_machine = machine; 568 577 } 569 578 570 - return default_kerninfo; 579 + return default_machine; 571 580 } 572 581 573 - struct kernel_info *kerninfo__findhost(struct rb_root *kerninfo_root) 582 + /* 583 + * FIXME: Why repeatedly search for this? 584 + */ 585 + struct machine *machines__find_host(struct rb_root *self) 574 586 { 575 - struct rb_node **p = &kerninfo_root->rb_node; 587 + struct rb_node **p = &self->rb_node; 576 588 struct rb_node *parent = NULL; 577 - struct kernel_info *kerninfo; 589 + struct machine *machine; 578 590 pid_t pid = HOST_KERNEL_ID; 579 591 580 592 while (*p != NULL) { 581 593 parent = *p; 582 - kerninfo = rb_entry(parent, struct kernel_info, rb_node); 583 - if (pid < kerninfo->pid) 594 + machine = rb_entry(parent, struct machine, rb_node); 595 + if (pid < machine->pid) 584 596 p = &(*p)->rb_left; 585 - else if (pid > kerninfo->pid) 597 + else if (pid > machine->pid) 586 598 p = &(*p)->rb_right; 587 599 else 588 - return kerninfo; 600 + return machine; 589 601 } 590 602 591 603 return NULL; 592 604 } 593 605 594 - struct kernel_info *kerninfo__findnew(struct rb_root *kerninfo_root, pid_t pid) 606 + struct machine *machines__findnew(struct rb_root *self, pid_t pid) 595 607 { 596 608 char path[PATH_MAX]; 597 609 const char *root_dir; 598 - int ret; 599 - struct kernel_info *kerninfo = kerninfo__find(kerninfo_root, pid); 610 + struct machine *machine = machines__find(self, pid); 600 611 601 - if (!kerninfo || kerninfo->pid != pid) { 612 + if (!machine || machine->pid != pid) { 602 613 if (pid == HOST_KERNEL_ID || pid == DEFAULT_GUEST_KERNEL_ID) 603 614 root_dir = ""; 604 615 else { 605 616 if (!symbol_conf.guestmount) 606 617 goto out; 607 618 sprintf(path, "%s/%d", symbol_conf.guestmount, pid); 608 - ret = access(path, R_OK); 609 - if (ret) { 619 + if (access(path, R_OK)) { 610 620 pr_err("Can't access file %s\n", path); 611 621 goto out; 612 622 } 613 623 root_dir = path; 614 624 } 615 - kerninfo = add_new_kernel_info(kerninfo_root, pid, root_dir); 625 + machine = machines__add(self, pid, root_dir); 616 626 } 617 627 618 628 out: 619 - return kerninfo; 629 + return machine; 620 630 } 621 631 622 - void kerninfo__process_allkernels(struct rb_root *kerninfo_root, 623 - process_kernel_info process, 624 - void *data) 632 + void machines__process(struct rb_root *self, machine__process_t process, void *data) 625 633 { 626 634 struct rb_node *nd; 627 635 628 - for (nd = rb_first(kerninfo_root); nd; nd = rb_next(nd)) { 629 - struct kernel_info *pos = rb_entry(nd, struct kernel_info, 630 - rb_node); 636 + for (nd = rb_first(self); nd; nd = rb_next(nd)) { 637 + struct machine *pos = rb_entry(nd, struct machine, rb_node); 631 638 process(pos, data); 632 639 } 633 640 } 634 641 635 - char *kern_mmap_name(struct kernel_info *kerninfo, char *buff) 642 + char *machine__mmap_name(struct machine *self, char *bf, size_t size) 636 643 { 637 - if (is_host_kernel(kerninfo)) 638 - sprintf(buff, "[%s]", "kernel.kallsyms"); 639 - else if (is_default_guest(kerninfo)) 640 - sprintf(buff, "[%s]", "guest.kernel.kallsyms"); 644 + if (machine__is_host(self)) 645 + snprintf(bf, size, "[%s]", "kernel.kallsyms"); 646 + else if (machine__is_default_guest(self)) 647 + snprintf(bf, size, "[%s]", "guest.kernel.kallsyms"); 641 648 else 642 - sprintf(buff, "[%s.%d]", "guest.kernel.kallsyms", kerninfo->pid); 649 + snprintf(bf, size, "[%s.%d]", "guest.kernel.kallsyms", self->pid); 643 650 644 - return buff; 651 + return bf; 645 652 }
+48 -38
tools/perf/util/map.h
··· 5 5 #include <linux/list.h> 6 6 #include <linux/rbtree.h> 7 7 #include <stdio.h> 8 + #include <stdbool.h> 8 9 #include "types.h" 9 10 10 11 enum map_type { ··· 20 19 struct dso; 21 20 struct ref_reloc_sym; 22 21 struct map_groups; 23 - struct kernel_info; 22 + struct machine; 24 23 25 24 struct map { 26 25 union { ··· 30 29 u64 start; 31 30 u64 end; 32 31 enum map_type type; 32 + u32 priv; 33 33 u64 pgoff; 34 34 35 35 /* ip -> dso rip */ ··· 48 46 }; 49 47 50 48 struct map_groups { 51 - struct rb_root maps[MAP__NR_TYPES]; 52 - struct list_head removed_maps[MAP__NR_TYPES]; 53 - struct kernel_info *this_kerninfo; 49 + struct rb_root maps[MAP__NR_TYPES]; 50 + struct list_head removed_maps[MAP__NR_TYPES]; 51 + struct machine *machine; 54 52 }; 55 53 56 - /* Native host kernel uses -1 as pid index in kernel_info */ 54 + /* Native host kernel uses -1 as pid index in machine */ 57 55 #define HOST_KERNEL_ID (-1) 58 56 #define DEFAULT_GUEST_KERNEL_ID (0) 59 57 60 - struct kernel_info { 61 - struct rb_node rb_node; 62 - pid_t pid; 63 - char *root_dir; 64 - struct list_head dsos__user; 65 - struct list_head dsos__kernel; 58 + struct machine { 59 + struct rb_node rb_node; 60 + pid_t pid; 61 + char *root_dir; 62 + struct list_head user_dsos; 63 + struct list_head kernel_dsos; 66 64 struct map_groups kmaps; 67 - struct map *vmlinux_maps[MAP__NR_TYPES]; 65 + struct map *vmlinux_maps[MAP__NR_TYPES]; 68 66 }; 67 + 68 + static inline 69 + struct map *machine__kernel_map(struct machine *self, enum map_type type) 70 + { 71 + return self->vmlinux_maps[type]; 72 + } 69 73 70 74 static inline struct kmap *map__kmap(struct map *self) 71 75 { ··· 132 124 size_t map_groups__fprintf(struct map_groups *self, int verbose, FILE *fp); 133 125 size_t map_groups__fprintf_maps(struct map_groups *self, int verbose, FILE *fp); 134 126 135 - struct kernel_info *add_new_kernel_info(struct rb_root *kerninfo_root, 136 - pid_t pid, const char *root_dir); 137 - struct kernel_info *kerninfo__find(struct rb_root *kerninfo_root, pid_t pid); 138 - struct kernel_info *kerninfo__findnew(struct rb_root *kerninfo_root, pid_t pid); 139 - struct kernel_info *kerninfo__findhost(struct rb_root *kerninfo_root); 140 - char *kern_mmap_name(struct kernel_info *kerninfo, char *buff); 127 + typedef void (*machine__process_t)(struct machine *self, void *data); 128 + 129 + void machines__process(struct rb_root *self, machine__process_t process, void *data); 130 + struct machine *machines__add(struct rb_root *self, pid_t pid, 131 + const char *root_dir); 132 + struct machine *machines__find_host(struct rb_root *self); 133 + struct machine *machines__find(struct rb_root *self, pid_t pid); 134 + struct machine *machines__findnew(struct rb_root *self, pid_t pid); 135 + char *machine__mmap_name(struct machine *self, char *bf, size_t size); 136 + int machine__init(struct machine *self, const char *root_dir, pid_t pid); 141 137 142 138 /* 143 139 * Default guest kernel is defined by parameter --guestkallsyms 144 140 * and --guestmodules 145 141 */ 146 - static inline int is_default_guest(struct kernel_info *kerninfo) 142 + static inline bool machine__is_default_guest(struct machine *self) 147 143 { 148 - if (!kerninfo) 149 - return 0; 150 - return kerninfo->pid == DEFAULT_GUEST_KERNEL_ID; 144 + return self ? self->pid == DEFAULT_GUEST_KERNEL_ID : false; 151 145 } 152 146 153 - static inline int is_host_kernel(struct kernel_info *kerninfo) 147 + static inline bool machine__is_host(struct machine *self) 154 148 { 155 - if (!kerninfo) 156 - return 0; 157 - return kerninfo->pid == HOST_KERNEL_ID; 149 + return self ? self->pid == HOST_KERNEL_ID : false; 158 150 } 159 - 160 - typedef void (*process_kernel_info)(struct kernel_info *kerninfo, void *data); 161 - void kerninfo__process_allkernels(struct rb_root *kerninfo_root, 162 - process_kernel_info process, 163 - void *data); 164 151 165 152 static inline void map_groups__insert(struct map_groups *self, struct map *map) 166 153 { ··· 181 178 symbol_filter_t filter); 182 179 183 180 static inline 184 - struct symbol *map_groups__find_function(struct map_groups *self, u64 addr, 185 - struct map **mapp, symbol_filter_t filter) 181 + struct symbol *machine__find_kernel_symbol(struct machine *self, 182 + enum map_type type, u64 addr, 183 + struct map **mapp, 184 + symbol_filter_t filter) 186 185 { 187 - return map_groups__find_symbol(self, MAP__FUNCTION, addr, mapp, filter); 186 + return map_groups__find_symbol(&self->kmaps, type, addr, mapp, filter); 187 + } 188 + 189 + static inline 190 + struct symbol *machine__find_kernel_function(struct machine *self, u64 addr, 191 + struct map **mapp, 192 + symbol_filter_t filter) 193 + { 194 + return machine__find_kernel_symbol(self, MAP__FUNCTION, addr, mapp, filter); 188 195 } 189 196 190 197 static inline ··· 210 197 211 198 struct map *map_groups__find_by_name(struct map_groups *self, 212 199 enum map_type type, const char *name); 213 - struct map *map_groups__new_module(struct map_groups *self, 214 - u64 start, 215 - const char *filename, 216 - struct kernel_info *kerninfo); 200 + struct map *machine__new_module(struct machine *self, u64 start, const char *filename); 217 201 218 202 void map_groups__flush(struct map_groups *self); 219 203
+11 -9
tools/perf/util/probe-event.c
··· 72 72 } 73 73 74 74 static char *synthesize_perf_probe_point(struct perf_probe_point *pp); 75 - static struct map_groups kmap_groups; 76 - static struct map *kmaps[MAP__NR_TYPES]; 75 + static struct machine machine; 77 76 78 77 /* Initialize symbol maps and path of vmlinux */ 79 78 static int init_vmlinux(void) ··· 91 92 goto out; 92 93 } 93 94 95 + ret = machine__init(&machine, "/", 0); 96 + if (ret < 0) 97 + goto out; 98 + 94 99 kernel = dso__new_kernel(symbol_conf.vmlinux_name); 95 100 if (kernel == NULL) 96 101 die("Failed to create kernel dso."); 97 102 98 - map_groups__init(&kmap_groups); 99 - ret = __map_groups__create_kernel_maps(&kmap_groups, kmaps, kernel); 103 + ret = __machine__create_kernel_maps(&machine, kernel); 100 104 if (ret < 0) 101 105 pr_debug("Failed to create kernel maps.\n"); 102 106 ··· 112 110 #ifdef DWARF_SUPPORT 113 111 static int open_vmlinux(void) 114 112 { 115 - if (map__load(kmaps[MAP__FUNCTION], NULL) < 0) { 113 + if (map__load(machine.vmlinux_maps[MAP__FUNCTION], NULL) < 0) { 116 114 pr_debug("Failed to load kernel map.\n"); 117 115 return -EINVAL; 118 116 } 119 - pr_debug("Try to open %s\n", kmaps[MAP__FUNCTION]->dso->long_name); 120 - return open(kmaps[MAP__FUNCTION]->dso->long_name, O_RDONLY); 117 + pr_debug("Try to open %s\n", machine.vmlinux_maps[MAP__FUNCTION]->dso->long_name); 118 + return open(machine.vmlinux_maps[MAP__FUNCTION]->dso->long_name, O_RDONLY); 121 119 } 122 120 123 121 /* Convert trace point to probe point with debuginfo */ ··· 127 125 struct symbol *sym; 128 126 int fd, ret = -ENOENT; 129 127 130 - sym = map__find_symbol_by_name(kmaps[MAP__FUNCTION], 128 + sym = map__find_symbol_by_name(machine.vmlinux_maps[MAP__FUNCTION], 131 129 tp->symbol, NULL); 132 130 if (sym) { 133 131 fd = open_vmlinux(); ··· 1468 1466 } 1469 1467 1470 1468 /* Currently just checking function name from symbol map */ 1471 - sym = map__find_symbol_by_name(kmaps[MAP__FUNCTION], 1469 + sym = map__find_symbol_by_name(machine.vmlinux_maps[MAP__FUNCTION], 1472 1470 tev->point.symbol, NULL); 1473 1471 if (!sym) { 1474 1472 pr_warning("Kernel symbol \'%s\' not found.\n",
+4 -5
tools/perf/util/session.c
··· 69 69 70 70 int perf_session__create_kernel_maps(struct perf_session *self) 71 71 { 72 - int ret; 73 - struct rb_root *root = &self->kerninfo_root; 72 + struct rb_root *machines = &self->machines; 73 + int ret = machines__create_kernel_maps(machines, HOST_KERNEL_ID); 74 74 75 - ret = map_groups__create_kernel_maps(root, HOST_KERNEL_ID); 76 75 if (ret >= 0) 77 - ret = map_groups__create_guest_kernel_maps(root); 76 + ret = machines__create_guest_kernel_maps(machines); 78 77 return ret; 79 78 } 80 79 ··· 96 97 self->cwd = NULL; 97 98 self->cwdlen = 0; 98 99 self->unknown_events = 0; 99 - self->kerninfo_root = RB_ROOT; 100 + self->machines = RB_ROOT; 100 101 self->ordered_samples.flush_limit = ULLONG_MAX; 101 102 INIT_LIST_HEAD(&self->ordered_samples.samples_head); 102 103
+39 -1
tools/perf/util/session.h
··· 25 25 unsigned long mmap_window; 26 26 struct rb_root threads; 27 27 struct thread *last_match; 28 - struct rb_root kerninfo_root; 28 + struct rb_root machines; 29 29 struct events_stats events_stats; 30 30 struct rb_root stats_by_id; 31 31 unsigned long event_total[PERF_RECORD_MAX]; ··· 102 102 u64 session_total, const char *helpline, 103 103 const char *input_name); 104 104 #endif 105 + 106 + static inline 107 + struct machine *perf_session__find_host_machine(struct perf_session *self) 108 + { 109 + return machines__find_host(&self->machines); 110 + } 111 + 112 + static inline 113 + struct machine *perf_session__find_machine(struct perf_session *self, pid_t pid) 114 + { 115 + return machines__find(&self->machines, pid); 116 + } 117 + 118 + static inline 119 + struct machine *perf_session__findnew_machine(struct perf_session *self, pid_t pid) 120 + { 121 + return machines__findnew(&self->machines, pid); 122 + } 123 + 124 + static inline 125 + void perf_session__process_machines(struct perf_session *self, 126 + machine__process_t process) 127 + { 128 + return machines__process(&self->machines, process, self); 129 + } 130 + 131 + static inline 132 + size_t perf_session__fprintf_dsos(struct perf_session *self, FILE *fp) 133 + { 134 + return machines__fprintf_dsos(&self->machines, fp); 135 + } 136 + 137 + static inline 138 + size_t perf_session__fprintf_dsos_buildid(struct perf_session *self, FILE *fp, 139 + bool with_hits) 140 + { 141 + return machines__fprintf_dsos_buildid(&self->machines, fp, with_hits); 142 + } 105 143 #endif /* __PERF_SESSION_H */
+128 -108
tools/perf/util/symbol.c
··· 485 485 symbol_filter_t filter) 486 486 { 487 487 struct map_groups *kmaps = map__kmap(map)->kmaps; 488 - struct kernel_info *kerninfo = kmaps->this_kerninfo; 488 + struct machine *machine = kmaps->machine; 489 489 struct map *curr_map = map; 490 490 struct symbol *pos; 491 491 int count = 0; ··· 508 508 509 509 if (strcmp(curr_map->dso->short_name, module)) { 510 510 if (curr_map != map && 511 - self->kernel == DSO_TYPE_GUEST_KERNEL && 512 - is_default_guest(kerninfo)) { 511 + self->kernel == DSO_TYPE_GUEST_KERNEL && 512 + machine__is_default_guest(machine)) { 513 513 /* 514 514 * We assume all symbols of a module are 515 515 * continuous in * kallsyms, so curr_map ··· 527 527 pr_err("%s/proc/{kallsyms,modules} " 528 528 "inconsistency while looking " 529 529 "for \"%s\" module!\n", 530 - kerninfo->root_dir, module); 530 + machine->root_dir, module); 531 531 curr_map = map; 532 532 goto discard_symbol; 533 533 } 534 534 535 535 if (curr_map->dso->loaded && 536 - !is_default_guest(kmaps->this_kerninfo)) 536 + !machine__is_default_guest(machine)) 537 537 goto discard_symbol; 538 538 } 539 539 /* ··· 586 586 587 587 if (curr_map != map && 588 588 self->kernel == DSO_TYPE_GUEST_KERNEL && 589 - is_default_guest(kmaps->this_kerninfo)) { 589 + machine__is_default_guest(kmaps->machine)) { 590 590 dso__set_loaded(curr_map->dso, curr_map->type); 591 591 } 592 592 ··· 1291 1291 char build_id_hex[BUILD_ID_SIZE * 2 + 1]; 1292 1292 int ret = -1; 1293 1293 int fd; 1294 - struct kernel_info *kerninfo; 1294 + struct machine *machine; 1295 1295 const char *root_dir; 1296 1296 1297 1297 dso__set_loaded(self, map->type); ··· 1301 1301 else if (self->kernel == DSO_TYPE_GUEST_KERNEL) 1302 1302 return dso__load_guest_kernel_sym(self, map, filter); 1303 1303 1304 - if (map->groups && map->groups->this_kerninfo) 1305 - kerninfo = map->groups->this_kerninfo; 1304 + if (map->groups && map->groups->machine) 1305 + machine = map->groups->machine; 1306 1306 else 1307 - kerninfo = NULL; 1307 + machine = NULL; 1308 1308 1309 1309 name = malloc(size); 1310 1310 if (!name) ··· 1359 1359 snprintf(name, size, "%s", self->long_name); 1360 1360 break; 1361 1361 case DSO__ORIG_GUEST_KMODULE: 1362 - if (map->groups && map->groups->this_kerninfo) 1363 - root_dir = map->groups->this_kerninfo->root_dir; 1362 + if (map->groups && map->groups->machine) 1363 + root_dir = map->groups->machine->root_dir; 1364 1364 else 1365 1365 root_dir = ""; 1366 1366 snprintf(name, size, "%s%s", root_dir, self->long_name); ··· 1528 1528 return strdup(name); 1529 1529 } 1530 1530 1531 - static int map_groups__set_modules_path(struct map_groups *self, 1532 - const char *root_dir) 1531 + static int machine__set_modules_path(struct machine *self) 1533 1532 { 1534 1533 char *version; 1535 1534 char modules_path[PATH_MAX]; 1536 1535 1537 - version = get_kernel_version(root_dir); 1536 + version = get_kernel_version(self->root_dir); 1538 1537 if (!version) 1539 1538 return -1; 1540 1539 1541 1540 snprintf(modules_path, sizeof(modules_path), "%s/lib/modules/%s/kernel", 1542 - root_dir, version); 1541 + self->root_dir, version); 1543 1542 free(version); 1544 1543 1545 - return map_groups__set_modules_path_dir(self, modules_path); 1544 + return map_groups__set_modules_path_dir(&self->kmaps, modules_path); 1546 1545 } 1547 1546 1548 1547 /* ··· 1563 1564 return self; 1564 1565 } 1565 1566 1566 - struct map *map_groups__new_module(struct map_groups *self, u64 start, 1567 - const char *filename, 1568 - struct kernel_info *kerninfo) 1567 + struct map *machine__new_module(struct machine *self, u64 start, 1568 + const char *filename) 1569 1569 { 1570 1570 struct map *map; 1571 - struct dso *dso; 1571 + struct dso *dso = __dsos__findnew(&self->kernel_dsos, filename); 1572 1572 1573 - dso = __dsos__findnew(&kerninfo->dsos__kernel, filename); 1574 1573 if (dso == NULL) 1575 1574 return NULL; 1576 1575 ··· 1576 1579 if (map == NULL) 1577 1580 return NULL; 1578 1581 1579 - if (is_host_kernel(kerninfo)) 1582 + if (machine__is_host(self)) 1580 1583 dso->origin = DSO__ORIG_KMODULE; 1581 1584 else 1582 1585 dso->origin = DSO__ORIG_GUEST_KMODULE; 1583 - map_groups__insert(self, map); 1586 + map_groups__insert(&self->kmaps, map); 1584 1587 return map; 1585 1588 } 1586 1589 1587 - static int map_groups__create_modules(struct kernel_info *kerninfo) 1590 + static int machine__create_modules(struct machine *self) 1588 1591 { 1589 1592 char *line = NULL; 1590 1593 size_t n; 1591 1594 FILE *file; 1592 1595 struct map *map; 1593 - const char *root_dir; 1594 1596 const char *modules; 1595 1597 char path[PATH_MAX]; 1596 1598 1597 - if (is_default_guest(kerninfo)) 1599 + if (machine__is_default_guest(self)) 1598 1600 modules = symbol_conf.default_guest_modules; 1599 1601 else { 1600 - sprintf(path, "%s/proc/modules", kerninfo->root_dir); 1602 + sprintf(path, "%s/proc/modules", self->root_dir); 1601 1603 modules = path; 1602 1604 } 1603 1605 1604 1606 file = fopen(modules, "r"); 1605 1607 if (file == NULL) 1606 1608 return -1; 1607 - 1608 - root_dir = kerninfo->root_dir; 1609 1609 1610 1610 while (!feof(file)) { 1611 1611 char name[PATH_MAX]; ··· 1632 1638 *sep = '\0'; 1633 1639 1634 1640 snprintf(name, sizeof(name), "[%s]", line); 1635 - map = map_groups__new_module(&kerninfo->kmaps, 1636 - start, name, kerninfo); 1641 + map = machine__new_module(self, start, name); 1637 1642 if (map == NULL) 1638 1643 goto out_delete_line; 1639 - dso__kernel_module_get_build_id(map->dso, root_dir); 1644 + dso__kernel_module_get_build_id(map->dso, self->root_dir); 1640 1645 } 1641 1646 1642 1647 free(line); 1643 1648 fclose(file); 1644 1649 1645 - return map_groups__set_modules_path(&kerninfo->kmaps, root_dir); 1650 + return machine__set_modules_path(self); 1646 1651 1647 1652 out_delete_line: 1648 1653 free(line); ··· 1813 1820 { 1814 1821 int err; 1815 1822 const char *kallsyms_filename = NULL; 1816 - struct kernel_info *kerninfo; 1823 + struct machine *machine; 1817 1824 char path[PATH_MAX]; 1818 1825 1819 1826 if (!map->groups) { 1820 1827 pr_debug("Guest kernel map hasn't the point to groups\n"); 1821 1828 return -1; 1822 1829 } 1823 - kerninfo = map->groups->this_kerninfo; 1830 + machine = map->groups->machine; 1824 1831 1825 - if (is_default_guest(kerninfo)) { 1832 + if (machine__is_default_guest(machine)) { 1826 1833 /* 1827 1834 * if the user specified a vmlinux filename, use it and only 1828 1835 * it, reporting errors to the user if it cannot be used. ··· 1838 1845 if (!kallsyms_filename) 1839 1846 return -1; 1840 1847 } else { 1841 - sprintf(path, "%s/proc/kallsyms", kerninfo->root_dir); 1848 + sprintf(path, "%s/proc/kallsyms", machine->root_dir); 1842 1849 kallsyms_filename = path; 1843 1850 } 1844 1851 ··· 1849 1856 out_try_fixup: 1850 1857 if (err > 0) { 1851 1858 if (kallsyms_filename != NULL) { 1852 - kern_mmap_name(kerninfo, path); 1853 - dso__set_long_name(self, 1854 - strdup(path)); 1859 + machine__mmap_name(machine, path, sizeof(path)); 1860 + dso__set_long_name(self, strdup(path)); 1855 1861 } 1856 1862 map__fixup_start(map); 1857 1863 map__fixup_end(map); ··· 1889 1897 return dso; 1890 1898 } 1891 1899 1892 - static void __dsos__fprintf(struct list_head *head, FILE *fp) 1900 + static size_t __dsos__fprintf(struct list_head *head, FILE *fp) 1893 1901 { 1894 1902 struct dso *pos; 1903 + size_t ret = 0; 1895 1904 1896 1905 list_for_each_entry(pos, head, node) { 1897 1906 int i; 1898 1907 for (i = 0; i < MAP__NR_TYPES; ++i) 1899 - dso__fprintf(pos, i, fp); 1908 + ret += dso__fprintf(pos, i, fp); 1900 1909 } 1910 + 1911 + return ret; 1901 1912 } 1902 1913 1903 - void dsos__fprintf(struct rb_root *kerninfo_root, FILE *fp) 1914 + size_t machines__fprintf_dsos(struct rb_root *self, FILE *fp) 1904 1915 { 1905 1916 struct rb_node *nd; 1917 + size_t ret = 0; 1906 1918 1907 - for (nd = rb_first(kerninfo_root); nd; nd = rb_next(nd)) { 1908 - struct kernel_info *pos = rb_entry(nd, struct kernel_info, 1909 - rb_node); 1910 - __dsos__fprintf(&pos->dsos__kernel, fp); 1911 - __dsos__fprintf(&pos->dsos__user, fp); 1919 + for (nd = rb_first(self); nd; nd = rb_next(nd)) { 1920 + struct machine *pos = rb_entry(nd, struct machine, rb_node); 1921 + ret += __dsos__fprintf(&pos->kernel_dsos, fp); 1922 + ret += __dsos__fprintf(&pos->user_dsos, fp); 1912 1923 } 1924 + 1925 + return ret; 1913 1926 } 1914 1927 1915 1928 static size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp, ··· 1932 1935 return ret; 1933 1936 } 1934 1937 1935 - size_t dsos__fprintf_buildid(struct rb_root *kerninfo_root, 1936 - FILE *fp, bool with_hits) 1938 + size_t machines__fprintf_dsos_buildid(struct rb_root *self, FILE *fp, bool with_hits) 1937 1939 { 1938 1940 struct rb_node *nd; 1939 1941 size_t ret = 0; 1940 1942 1941 - for (nd = rb_first(kerninfo_root); nd; nd = rb_next(nd)) { 1942 - struct kernel_info *pos = rb_entry(nd, struct kernel_info, 1943 - rb_node); 1944 - ret += __dsos__fprintf_buildid(&pos->dsos__kernel, 1945 - fp, with_hits); 1946 - ret += __dsos__fprintf_buildid(&pos->dsos__user, 1947 - fp, with_hits); 1943 + for (nd = rb_first(self); nd; nd = rb_next(nd)) { 1944 + struct machine *pos = rb_entry(nd, struct machine, rb_node); 1945 + ret += __dsos__fprintf_buildid(&pos->kernel_dsos, fp, with_hits); 1946 + ret += __dsos__fprintf_buildid(&pos->user_dsos, fp, with_hits); 1948 1947 } 1949 1948 return ret; 1950 1949 } ··· 1957 1964 return self; 1958 1965 } 1959 1966 1960 - static struct dso *dso__new_guest_kernel(struct kernel_info *kerninfo, 1967 + static struct dso *dso__new_guest_kernel(struct machine *machine, 1961 1968 const char *name) 1962 1969 { 1963 - char buff[PATH_MAX]; 1964 - struct dso *self; 1970 + char bf[PATH_MAX]; 1971 + struct dso *self = dso__new(name ?: machine__mmap_name(machine, bf, sizeof(bf))); 1965 1972 1966 - kern_mmap_name(kerninfo, buff); 1967 - self = dso__new(name ?: buff); 1968 1973 if (self != NULL) { 1969 1974 dso__set_short_name(self, "[guest.kernel]"); 1970 1975 self->kernel = DSO_TYPE_GUEST_KERNEL; ··· 1971 1980 return self; 1972 1981 } 1973 1982 1974 - void dso__read_running_kernel_build_id(struct dso *self, 1975 - struct kernel_info *kerninfo) 1983 + void dso__read_running_kernel_build_id(struct dso *self, struct machine *machine) 1976 1984 { 1977 1985 char path[PATH_MAX]; 1978 1986 1979 - if (is_default_guest(kerninfo)) 1987 + if (machine__is_default_guest(machine)) 1980 1988 return; 1981 - sprintf(path, "%s/sys/kernel/notes", kerninfo->root_dir); 1989 + sprintf(path, "%s/sys/kernel/notes", machine->root_dir); 1982 1990 if (sysfs__read_build_id(path, self->build_id, 1983 1991 sizeof(self->build_id)) == 0) 1984 1992 self->has_build_id = true; 1985 1993 } 1986 1994 1987 - static struct dso *dsos__create_kernel(struct kernel_info *kerninfo) 1995 + static struct dso *machine__create_kernel(struct machine *self) 1988 1996 { 1989 1997 const char *vmlinux_name = NULL; 1990 1998 struct dso *kernel; 1991 1999 1992 - if (is_host_kernel(kerninfo)) { 2000 + if (machine__is_host(self)) { 1993 2001 vmlinux_name = symbol_conf.vmlinux_name; 1994 2002 kernel = dso__new_kernel(vmlinux_name); 1995 2003 } else { 1996 - if (is_default_guest(kerninfo)) 2004 + if (machine__is_default_guest(self)) 1997 2005 vmlinux_name = symbol_conf.default_guest_vmlinux_name; 1998 - kernel = dso__new_guest_kernel(kerninfo, vmlinux_name); 2006 + kernel = dso__new_guest_kernel(self, vmlinux_name); 1999 2007 } 2000 2008 2001 2009 if (kernel != NULL) { 2002 - dso__read_running_kernel_build_id(kernel, kerninfo); 2003 - dsos__add(&kerninfo->dsos__kernel, kernel); 2010 + dso__read_running_kernel_build_id(kernel, self); 2011 + dsos__add(&self->kernel_dsos, kernel); 2004 2012 } 2005 2013 return kernel; 2006 2014 } 2007 2015 2008 - int __map_groups__create_kernel_maps(struct map_groups *self, 2009 - struct map *vmlinux_maps[MAP__NR_TYPES], 2010 - struct dso *kernel) 2016 + int __machine__create_kernel_maps(struct machine *self, struct dso *kernel) 2011 2017 { 2012 2018 enum map_type type; 2013 2019 2014 2020 for (type = 0; type < MAP__NR_TYPES; ++type) { 2015 2021 struct kmap *kmap; 2016 2022 2017 - vmlinux_maps[type] = map__new2(0, kernel, type); 2018 - if (vmlinux_maps[type] == NULL) 2023 + self->vmlinux_maps[type] = map__new2(0, kernel, type); 2024 + if (self->vmlinux_maps[type] == NULL) 2019 2025 return -1; 2020 2026 2021 - vmlinux_maps[type]->map_ip = 2022 - vmlinux_maps[type]->unmap_ip = identity__map_ip; 2027 + self->vmlinux_maps[type]->map_ip = 2028 + self->vmlinux_maps[type]->unmap_ip = identity__map_ip; 2023 2029 2024 - kmap = map__kmap(vmlinux_maps[type]); 2025 - kmap->kmaps = self; 2026 - map_groups__insert(self, vmlinux_maps[type]); 2030 + kmap = map__kmap(self->vmlinux_maps[type]); 2031 + kmap->kmaps = &self->kmaps; 2032 + map_groups__insert(&self->kmaps, self->vmlinux_maps[type]); 2027 2033 } 2028 2034 2035 + return 0; 2036 + } 2037 + 2038 + int machine__create_kernel_maps(struct machine *self) 2039 + { 2040 + struct dso *kernel = machine__create_kernel(self); 2041 + 2042 + if (kernel == NULL || 2043 + __machine__create_kernel_maps(self, kernel) < 0) 2044 + return -1; 2045 + 2046 + if (symbol_conf.use_modules && machine__create_modules(self) < 0) 2047 + pr_debug("Problems creating module maps, continuing anyway...\n"); 2048 + /* 2049 + * Now that we have all the maps created, just set the ->end of them: 2050 + */ 2051 + map_groups__fixup_end(&self->kmaps); 2029 2052 return 0; 2030 2053 } 2031 2054 ··· 2159 2154 return -1; 2160 2155 } 2161 2156 2162 - int map_groups__create_kernel_maps(struct rb_root *kerninfo_root, pid_t pid) 2157 + int machines__create_kernel_maps(struct rb_root *self, pid_t pid) 2163 2158 { 2164 - struct kernel_info *kerninfo; 2165 - struct dso *kernel; 2159 + struct machine *machine = machines__findnew(self, pid); 2166 2160 2167 - kerninfo = kerninfo__findnew(kerninfo_root, pid); 2168 - if (kerninfo == NULL) 2169 - return -1; 2170 - kernel = dsos__create_kernel(kerninfo); 2171 - if (kernel == NULL) 2161 + if (machine == NULL) 2172 2162 return -1; 2173 2163 2174 - if (__map_groups__create_kernel_maps(&kerninfo->kmaps, 2175 - kerninfo->vmlinux_maps, kernel) < 0) 2176 - return -1; 2177 - 2178 - if (symbol_conf.use_modules && 2179 - map_groups__create_modules(kerninfo) < 0) 2180 - pr_debug("Problems creating module maps, continuing anyway...\n"); 2181 - /* 2182 - * Now that we have all the maps created, just set the ->end of them: 2183 - */ 2184 - map_groups__fixup_end(&kerninfo->kmaps); 2185 - return 0; 2164 + return machine__create_kernel_maps(machine); 2186 2165 } 2187 2166 2188 2167 static int hex(char ch) ··· 2212 2223 return s; 2213 2224 } 2214 2225 2215 - int map_groups__create_guest_kernel_maps(struct rb_root *kerninfo_root) 2226 + int machines__create_guest_kernel_maps(struct rb_root *self) 2216 2227 { 2217 2228 int ret = 0; 2218 2229 struct dirent **namelist = NULL; ··· 2223 2234 if (symbol_conf.default_guest_vmlinux_name || 2224 2235 symbol_conf.default_guest_modules || 2225 2236 symbol_conf.default_guest_kallsyms) { 2226 - map_groups__create_kernel_maps(kerninfo_root, 2227 - DEFAULT_GUEST_KERNEL_ID); 2237 + machines__create_kernel_maps(self, DEFAULT_GUEST_KERNEL_ID); 2228 2238 } 2229 2239 2230 2240 if (symbol_conf.guestmount) { ··· 2244 2256 pr_debug("Can't access file %s\n", path); 2245 2257 goto failure; 2246 2258 } 2247 - map_groups__create_kernel_maps(kerninfo_root, 2248 - pid); 2259 + machines__create_kernel_maps(self, pid); 2249 2260 } 2250 2261 failure: 2251 2262 free(namelist); 2263 + } 2264 + 2265 + return ret; 2266 + } 2267 + 2268 + int machine__load_kallsyms(struct machine *self, const char *filename, 2269 + enum map_type type, symbol_filter_t filter) 2270 + { 2271 + struct map *map = self->vmlinux_maps[type]; 2272 + int ret = dso__load_kallsyms(map->dso, filename, map, filter); 2273 + 2274 + if (ret > 0) { 2275 + dso__set_loaded(map->dso, type); 2276 + /* 2277 + * Since /proc/kallsyms will have multiple sessions for the 2278 + * kernel, with modules between them, fixup the end of all 2279 + * sections. 2280 + */ 2281 + __map_groups__fixup_end(&self->kmaps, type); 2282 + } 2283 + 2284 + return ret; 2285 + } 2286 + 2287 + int machine__load_vmlinux_path(struct machine *self, enum map_type type, 2288 + symbol_filter_t filter) 2289 + { 2290 + struct map *map = self->vmlinux_maps[type]; 2291 + int ret = dso__load_vmlinux_path(map->dso, map, filter); 2292 + 2293 + if (ret > 0) { 2294 + dso__set_loaded(map->dso, type); 2295 + map__reloc_vmlinux(map); 2252 2296 } 2253 2297 2254 2298 return ret;
+13 -10
tools/perf/util/symbol.h
··· 162 162 symbol_filter_t filter); 163 163 int dso__load_kallsyms(struct dso *self, const char *filename, struct map *map, 164 164 symbol_filter_t filter); 165 - void dsos__fprintf(struct rb_root *kerninfo_root, FILE *fp); 166 - size_t dsos__fprintf_buildid(struct rb_root *kerninfo_root, 167 - FILE *fp, bool with_hits); 165 + int machine__load_kallsyms(struct machine *self, const char *filename, 166 + enum map_type type, symbol_filter_t filter); 167 + int machine__load_vmlinux_path(struct machine *self, enum map_type type, 168 + symbol_filter_t filter); 169 + 170 + size_t machines__fprintf_dsos(struct rb_root *self, FILE *fp); 171 + size_t machines__fprintf_dsos_buildid(struct rb_root *self, FILE *fp, bool with_hits); 168 172 169 173 size_t dso__fprintf_buildid(struct dso *self, FILE *fp); 170 174 size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp); ··· 190 186 char dso__symtab_origin(const struct dso *self); 191 187 void dso__set_long_name(struct dso *self, char *name); 192 188 void dso__set_build_id(struct dso *self, void *build_id); 193 - void dso__read_running_kernel_build_id(struct dso *self, 194 - struct kernel_info *kerninfo); 189 + void dso__read_running_kernel_build_id(struct dso *self, struct machine *machine); 195 190 struct symbol *dso__find_symbol(struct dso *self, enum map_type type, u64 addr); 196 191 struct symbol *dso__find_symbol_by_name(struct dso *self, enum map_type type, 197 192 const char *name); ··· 203 200 int (*process_symbol)(void *arg, const char *name, 204 201 char type, u64 start)); 205 202 206 - int __map_groups__create_kernel_maps(struct map_groups *self, 207 - struct map *vmlinux_maps[MAP__NR_TYPES], 208 - struct dso *kernel); 209 - int map_groups__create_kernel_maps(struct rb_root *kerninfo_root, pid_t pid); 210 - int map_groups__create_guest_kernel_maps(struct rb_root *kerninfo_root); 203 + int __machine__create_kernel_maps(struct machine *self, struct dso *kernel); 204 + int machine__create_kernel_maps(struct machine *self); 205 + 206 + int machines__create_kernel_maps(struct rb_root *self, pid_t pid); 207 + int machines__create_guest_kernel_maps(struct rb_root *self); 211 208 212 209 int symbol__init(void); 213 210 bool symbol_type__is_a(char symbol_type, enum map_type map_type);