diff options
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/builtin-kmem.c | 5 | ||||
-rw-r--r-- | tools/perf/builtin-record.c | 11 | ||||
-rw-r--r-- | tools/perf/builtin-top.c | 5 | ||||
-rw-r--r-- | tools/perf/util/event.c | 106 | ||||
-rw-r--r-- | tools/perf/util/event.h | 2 | ||||
-rw-r--r-- | tools/perf/util/session.c | 8 | ||||
-rw-r--r-- | tools/perf/util/symbol.c | 116 | ||||
-rw-r--r-- | tools/perf/util/symbol.h | 3 | ||||
-rw-r--r-- | tools/perf/util/thread.h | 4 |
9 files changed, 212 insertions, 48 deletions
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index 88c570c18e3e..4af7199c5af7 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c | |||
@@ -494,6 +494,11 @@ static int __cmd_kmem(void) | |||
494 | if (!perf_session__has_traces(session, "kmem record")) | 494 | if (!perf_session__has_traces(session, "kmem record")) |
495 | goto out_delete; | 495 | goto out_delete; |
496 | 496 | ||
497 | if (perf_session__create_kernel_maps(session) < 0) { | ||
498 | pr_err("Problems creating kernel maps\n"); | ||
499 | return -1; | ||
500 | } | ||
501 | |||
497 | setup_pager(); | 502 | setup_pager(); |
498 | err = perf_session__process_events(session, &event_ops); | 503 | err = perf_session__process_events(session, &event_ops); |
499 | if (err != 0) | 504 | if (err != 0) |
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 8f88420e066b..c130df2676f1 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -465,6 +465,11 @@ static int __cmd_record(int argc, const char **argv) | |||
465 | return -1; | 465 | return -1; |
466 | } | 466 | } |
467 | 467 | ||
468 | if (perf_session__create_kernel_maps(session) < 0) { | ||
469 | pr_err("Problems creating kernel maps\n"); | ||
470 | return -1; | ||
471 | } | ||
472 | |||
468 | if (!file_new) { | 473 | if (!file_new) { |
469 | err = perf_header__read(&session->header, output); | 474 | err = perf_header__read(&session->header, output); |
470 | if (err < 0) | 475 | if (err < 0) |
@@ -558,6 +563,12 @@ static int __cmd_record(int argc, const char **argv) | |||
558 | return err; | 563 | return err; |
559 | } | 564 | } |
560 | 565 | ||
566 | err = event__synthesize_modules(process_synthesized_event, session); | ||
567 | if (err < 0) { | ||
568 | pr_err("Couldn't record kernel reference relocation symbol.\n"); | ||
569 | return err; | ||
570 | } | ||
571 | |||
561 | if (!system_wide && profile_cpu == -1) | 572 | if (!system_wide && profile_cpu == -1) |
562 | event__synthesize_thread(pid, process_synthesized_event, | 573 | event__synthesize_thread(pid, process_synthesized_event, |
563 | session); | 574 | session); |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index ddc584b64871..6822b44ca4f9 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
@@ -1165,6 +1165,11 @@ static int __cmd_top(void) | |||
1165 | if (session == NULL) | 1165 | if (session == NULL) |
1166 | return -ENOMEM; | 1166 | return -ENOMEM; |
1167 | 1167 | ||
1168 | if (perf_session__create_kernel_maps(session) < 0) { | ||
1169 | pr_err("Problems creating kernel maps\n"); | ||
1170 | return -1; | ||
1171 | } | ||
1172 | |||
1168 | if (target_pid != -1) | 1173 | if (target_pid != -1) |
1169 | event__synthesize_thread(target_pid, event__process, session); | 1174 | event__synthesize_thread(target_pid, event__process, session); |
1170 | else | 1175 | else |
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index bfb3d872b9f5..4f3e7ef33b83 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
@@ -154,6 +154,36 @@ static int event__synthesize_mmap_events(pid_t pid, pid_t tgid, | |||
154 | return 0; | 154 | return 0; |
155 | } | 155 | } |
156 | 156 | ||
157 | int event__synthesize_modules(event__handler_t process, | ||
158 | struct perf_session *session) | ||
159 | { | ||
160 | struct rb_node *nd; | ||
161 | |||
162 | for (nd = rb_first(&session->kmaps.maps[MAP__FUNCTION]); | ||
163 | nd; nd = rb_next(nd)) { | ||
164 | event_t ev; | ||
165 | size_t size; | ||
166 | struct map *pos = rb_entry(nd, struct map, rb_node); | ||
167 | |||
168 | if (pos->dso->kernel) | ||
169 | continue; | ||
170 | |||
171 | size = ALIGN(pos->dso->long_name_len + 1, sizeof(u64)); | ||
172 | memset(&ev, 0, sizeof(ev)); | ||
173 | ev.mmap.header.type = PERF_RECORD_MMAP; | ||
174 | ev.mmap.header.size = (sizeof(ev.mmap) - | ||
175 | (sizeof(ev.mmap.filename) - size)); | ||
176 | ev.mmap.start = pos->start; | ||
177 | ev.mmap.len = pos->end - pos->start; | ||
178 | |||
179 | memcpy(ev.mmap.filename, pos->dso->long_name, | ||
180 | pos->dso->long_name_len + 1); | ||
181 | process(&ev, session); | ||
182 | } | ||
183 | |||
184 | return 0; | ||
185 | } | ||
186 | |||
157 | int event__synthesize_thread(pid_t pid, event__handler_t process, | 187 | int event__synthesize_thread(pid_t pid, event__handler_t process, |
158 | struct perf_session *session) | 188 | struct perf_session *session) |
159 | { | 189 | { |
@@ -222,7 +252,9 @@ int event__synthesize_kernel_mmap(event__handler_t process, | |||
222 | "[kernel.kallsyms.%s]", symbol_name) + 1; | 252 | "[kernel.kallsyms.%s]", symbol_name) + 1; |
223 | size = ALIGN(size, sizeof(u64)); | 253 | size = ALIGN(size, sizeof(u64)); |
224 | ev.mmap.header.size = (sizeof(ev.mmap) - (sizeof(ev.mmap.filename) - size)); | 254 | ev.mmap.header.size = (sizeof(ev.mmap) - (sizeof(ev.mmap.filename) - size)); |
225 | ev.mmap.start = args.start; | 255 | ev.mmap.pgoff = args.start; |
256 | ev.mmap.start = session->vmlinux_maps[MAP__FUNCTION]->start; | ||
257 | ev.mmap.len = session->vmlinux_maps[MAP__FUNCTION]->end - ev.mmap.start ; | ||
226 | 258 | ||
227 | return process(&ev, session); | 259 | return process(&ev, session); |
228 | } | 260 | } |
@@ -280,7 +312,6 @@ int event__process_mmap(event_t *self, struct perf_session *session) | |||
280 | { | 312 | { |
281 | struct thread *thread; | 313 | struct thread *thread; |
282 | struct map *map; | 314 | struct map *map; |
283 | static const char kmmap_prefix[] = "[kernel.kallsyms."; | ||
284 | 315 | ||
285 | dump_printf(" %d/%d: [%p(%p) @ %p]: %s\n", | 316 | dump_printf(" %d/%d: [%p(%p) @ %p]: %s\n", |
286 | self->mmap.pid, self->mmap.tid, | 317 | self->mmap.pid, self->mmap.tid, |
@@ -289,13 +320,61 @@ int event__process_mmap(event_t *self, struct perf_session *session) | |||
289 | (void *)(long)self->mmap.pgoff, | 320 | (void *)(long)self->mmap.pgoff, |
290 | self->mmap.filename); | 321 | self->mmap.filename); |
291 | 322 | ||
292 | if (self->mmap.pid == 0 && | 323 | if (self->mmap.pid == 0) { |
293 | memcmp(self->mmap.filename, kmmap_prefix, | 324 | static const char kmmap_prefix[] = "[kernel.kallsyms."; |
294 | sizeof(kmmap_prefix) - 1) == 0) { | 325 | |
295 | const char *symbol_name = (self->mmap.filename + | 326 | if (self->mmap.filename[0] == '/') { |
296 | sizeof(kmmap_prefix) - 1); | 327 | char short_module_name[1024]; |
297 | perf_session__set_kallsyms_ref_reloc_sym(session, symbol_name, | 328 | char *name = strrchr(self->mmap.filename, '/'), *dot; |
298 | self->mmap.start); | 329 | |
330 | if (name == NULL) | ||
331 | goto out_problem; | ||
332 | |||
333 | ++name; /* skip / */ | ||
334 | dot = strrchr(name, '.'); | ||
335 | if (dot == NULL) | ||
336 | goto out_problem; | ||
337 | |||
338 | snprintf(short_module_name, sizeof(short_module_name), | ||
339 | "[%.*s]", (int)(dot - name), name); | ||
340 | strxfrchar(short_module_name, '-', '_'); | ||
341 | |||
342 | map = perf_session__new_module_map(session, | ||
343 | self->mmap.start, | ||
344 | short_module_name); | ||
345 | if (map == NULL) | ||
346 | goto out_problem; | ||
347 | |||
348 | name = strdup(self->mmap.filename); | ||
349 | if (name == NULL) | ||
350 | goto out_problem; | ||
351 | |||
352 | dso__set_long_name(map->dso, name); | ||
353 | map->end = map->start + self->mmap.len; | ||
354 | } else if (memcmp(self->mmap.filename, kmmap_prefix, | ||
355 | sizeof(kmmap_prefix) - 1) == 0) { | ||
356 | const char *symbol_name = (self->mmap.filename + | ||
357 | sizeof(kmmap_prefix) - 1); | ||
358 | /* | ||
359 | * Should be there already, from the build-id table in | ||
360 | * the header. | ||
361 | */ | ||
362 | struct dso *kernel = __dsos__findnew(&dsos__kernel, | ||
363 | "[kernel.kallsyms]"); | ||
364 | if (kernel == NULL) | ||
365 | goto out_problem; | ||
366 | |||
367 | if (__map_groups__create_kernel_maps(&session->kmaps, | ||
368 | session->vmlinux_maps, | ||
369 | kernel) < 0) | ||
370 | goto out_problem; | ||
371 | |||
372 | session->vmlinux_maps[MAP__FUNCTION]->start = self->mmap.start; | ||
373 | session->vmlinux_maps[MAP__FUNCTION]->end = self->mmap.start + self->mmap.len; | ||
374 | |||
375 | perf_session__set_kallsyms_ref_reloc_sym(session, symbol_name, | ||
376 | self->mmap.pgoff); | ||
377 | } | ||
299 | return 0; | 378 | return 0; |
300 | } | 379 | } |
301 | 380 | ||
@@ -304,10 +383,13 @@ int event__process_mmap(event_t *self, struct perf_session *session) | |||
304 | session->cwd, session->cwdlen); | 383 | session->cwd, session->cwdlen); |
305 | 384 | ||
306 | if (thread == NULL || map == NULL) | 385 | if (thread == NULL || map == NULL) |
307 | dump_printf("problem processing PERF_RECORD_MMAP, skipping event.\n"); | 386 | goto out_problem; |
308 | else | 387 | |
309 | thread__insert_map(thread, map); | 388 | thread__insert_map(thread, map); |
389 | return 0; | ||
310 | 390 | ||
391 | out_problem: | ||
392 | dump_printf("problem processing PERF_RECORD_MMAP, skipping event.\n"); | ||
311 | return 0; | 393 | return 0; |
312 | } | 394 | } |
313 | 395 | ||
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index 80356da8216c..50a7132887f5 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h | |||
@@ -112,6 +112,8 @@ void event__synthesize_threads(event__handler_t process, | |||
112 | int event__synthesize_kernel_mmap(event__handler_t process, | 112 | int event__synthesize_kernel_mmap(event__handler_t process, |
113 | struct perf_session *session, | 113 | struct perf_session *session, |
114 | const char *symbol_name); | 114 | const char *symbol_name); |
115 | int event__synthesize_modules(event__handler_t process, | ||
116 | struct perf_session *session); | ||
115 | 117 | ||
116 | int event__process_comm(event_t *self, struct perf_session *session); | 118 | int event__process_comm(event_t *self, struct perf_session *session); |
117 | int event__process_lost(event_t *self, struct perf_session *session); | 119 | int event__process_lost(event_t *self, struct perf_session *session); |
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 378ac5422bcf..fd1c5a39a5bb 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
@@ -69,9 +69,6 @@ struct perf_session *perf_session__new(const char *filename, int mode, bool forc | |||
69 | self->unknown_events = 0; | 69 | self->unknown_events = 0; |
70 | map_groups__init(&self->kmaps); | 70 | map_groups__init(&self->kmaps); |
71 | 71 | ||
72 | if (perf_session__create_kernel_maps(self) < 0) | ||
73 | goto out_delete; | ||
74 | |||
75 | if (mode == O_RDONLY && perf_session__open(self, force) < 0) | 72 | if (mode == O_RDONLY && perf_session__open(self, force) < 0) |
76 | goto out_delete; | 73 | goto out_delete; |
77 | 74 | ||
@@ -268,8 +265,11 @@ int perf_header__read_build_ids(int input, u64 offset, u64 size) | |||
268 | head = &dsos__kernel; | 265 | head = &dsos__kernel; |
269 | 266 | ||
270 | dso = __dsos__findnew(head, filename); | 267 | dso = __dsos__findnew(head, filename); |
271 | if (dso != NULL) | 268 | if (dso != NULL) { |
272 | dso__set_build_id(dso, &bev.build_id); | 269 | dso__set_build_id(dso, &bev.build_id); |
270 | if (head == &dsos__kernel && filename[0] == '[') | ||
271 | dso->kernel = 1; | ||
272 | } | ||
273 | 273 | ||
274 | offset += bev.header.size; | 274 | offset += bev.header.size; |
275 | } | 275 | } |
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 8e6627e6b778..381999dd5c1f 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
@@ -161,7 +161,7 @@ static size_t symbol__fprintf(struct symbol *self, FILE *fp) | |||
161 | self->start, self->end, self->name); | 161 | self->start, self->end, self->name); |
162 | } | 162 | } |
163 | 163 | ||
164 | static void dso__set_long_name(struct dso *self, char *name) | 164 | void dso__set_long_name(struct dso *self, char *name) |
165 | { | 165 | { |
166 | if (name == NULL) | 166 | if (name == NULL) |
167 | return; | 167 | return; |
@@ -176,7 +176,7 @@ static void dso__set_basename(struct dso *self) | |||
176 | 176 | ||
177 | struct dso *dso__new(const char *name) | 177 | struct dso *dso__new(const char *name) |
178 | { | 178 | { |
179 | struct dso *self = malloc(sizeof(*self) + strlen(name) + 1); | 179 | struct dso *self = zalloc(sizeof(*self) + strlen(name) + 1); |
180 | 180 | ||
181 | if (self != NULL) { | 181 | if (self != NULL) { |
182 | int i; | 182 | int i; |
@@ -500,13 +500,17 @@ static int dso__split_kallsyms(struct dso *self, struct map *map, | |||
500 | 500 | ||
501 | *module++ = '\0'; | 501 | *module++ = '\0'; |
502 | 502 | ||
503 | if (strcmp(self->name, module)) { | 503 | if (strcmp(curr_map->dso->short_name, module)) { |
504 | curr_map = map_groups__find_by_name(&session->kmaps, map->type, module); | 504 | curr_map = map_groups__find_by_name(&session->kmaps, map->type, module); |
505 | if (curr_map == NULL) { | 505 | if (curr_map == NULL) { |
506 | pr_debug("/proc/{kallsyms,modules} " | 506 | pr_debug("/proc/{kallsyms,modules} " |
507 | "inconsistency!\n"); | 507 | "inconsistency while looking " |
508 | "for \"%s\" module!\n", module); | ||
508 | return -1; | 509 | return -1; |
509 | } | 510 | } |
511 | |||
512 | if (curr_map->dso->loaded) | ||
513 | goto discard_symbol; | ||
510 | } | 514 | } |
511 | /* | 515 | /* |
512 | * So that we look just like we get from .ko files, | 516 | * So that we look just like we get from .ko files, |
@@ -1343,13 +1347,33 @@ struct map *map_groups__find_by_name(struct map_groups *self, | |||
1343 | for (nd = rb_first(&self->maps[type]); nd; nd = rb_next(nd)) { | 1347 | for (nd = rb_first(&self->maps[type]); nd; nd = rb_next(nd)) { |
1344 | struct map *map = rb_entry(nd, struct map, rb_node); | 1348 | struct map *map = rb_entry(nd, struct map, rb_node); |
1345 | 1349 | ||
1346 | if (map->dso && strcmp(map->dso->name, name) == 0) | 1350 | if (map->dso && strcmp(map->dso->short_name, name) == 0) |
1347 | return map; | 1351 | return map; |
1348 | } | 1352 | } |
1349 | 1353 | ||
1350 | return NULL; | 1354 | return NULL; |
1351 | } | 1355 | } |
1352 | 1356 | ||
1357 | static int dso__kernel_module_get_build_id(struct dso *self) | ||
1358 | { | ||
1359 | char filename[PATH_MAX]; | ||
1360 | /* | ||
1361 | * kernel module short names are of the form "[module]" and | ||
1362 | * we need just "module" here. | ||
1363 | */ | ||
1364 | const char *name = self->short_name + 1; | ||
1365 | |||
1366 | snprintf(filename, sizeof(filename), | ||
1367 | "/sys/module/%.*s/notes/.note.gnu.build-id", | ||
1368 | (int)strlen(name - 1), name); | ||
1369 | |||
1370 | if (sysfs__read_build_id(filename, self->build_id, | ||
1371 | sizeof(self->build_id)) == 0) | ||
1372 | self->has_build_id = true; | ||
1373 | |||
1374 | return 0; | ||
1375 | } | ||
1376 | |||
1353 | static int perf_session__set_modules_path_dir(struct perf_session *self, char *dirname) | 1377 | static int perf_session__set_modules_path_dir(struct perf_session *self, char *dirname) |
1354 | { | 1378 | { |
1355 | struct dirent *dent; | 1379 | struct dirent *dent; |
@@ -1395,6 +1419,7 @@ static int perf_session__set_modules_path_dir(struct perf_session *self, char *d | |||
1395 | if (long_name == NULL) | 1419 | if (long_name == NULL) |
1396 | goto failure; | 1420 | goto failure; |
1397 | dso__set_long_name(map->dso, long_name); | 1421 | dso__set_long_name(map->dso, long_name); |
1422 | dso__kernel_module_get_build_id(map->dso); | ||
1398 | } | 1423 | } |
1399 | } | 1424 | } |
1400 | 1425 | ||
@@ -1437,6 +1462,24 @@ static struct map *map__new2(u64 start, struct dso *dso, enum map_type type) | |||
1437 | return self; | 1462 | return self; |
1438 | } | 1463 | } |
1439 | 1464 | ||
1465 | struct map *perf_session__new_module_map(struct perf_session *self, u64 start, | ||
1466 | const char *filename) | ||
1467 | { | ||
1468 | struct map *map; | ||
1469 | struct dso *dso = __dsos__findnew(&dsos__kernel, filename); | ||
1470 | |||
1471 | if (dso == NULL) | ||
1472 | return NULL; | ||
1473 | |||
1474 | map = map__new2(start, dso, MAP__FUNCTION); | ||
1475 | if (map == NULL) | ||
1476 | return NULL; | ||
1477 | |||
1478 | dso->origin = DSO__ORIG_KMODULE; | ||
1479 | map_groups__insert(&self->kmaps, map); | ||
1480 | return map; | ||
1481 | } | ||
1482 | |||
1440 | static int perf_session__create_module_maps(struct perf_session *self) | 1483 | static int perf_session__create_module_maps(struct perf_session *self) |
1441 | { | 1484 | { |
1442 | char *line = NULL; | 1485 | char *line = NULL; |
@@ -1450,7 +1493,6 @@ static int perf_session__create_module_maps(struct perf_session *self) | |||
1450 | while (!feof(file)) { | 1493 | while (!feof(file)) { |
1451 | char name[PATH_MAX]; | 1494 | char name[PATH_MAX]; |
1452 | u64 start; | 1495 | u64 start; |
1453 | struct dso *dso; | ||
1454 | char *sep; | 1496 | char *sep; |
1455 | int line_len; | 1497 | int line_len; |
1456 | 1498 | ||
@@ -1476,26 +1518,10 @@ static int perf_session__create_module_maps(struct perf_session *self) | |||
1476 | *sep = '\0'; | 1518 | *sep = '\0'; |
1477 | 1519 | ||
1478 | snprintf(name, sizeof(name), "[%s]", line); | 1520 | snprintf(name, sizeof(name), "[%s]", line); |
1479 | dso = dso__new(name); | 1521 | map = perf_session__new_module_map(self, start, name); |
1480 | 1522 | if (map == NULL) | |
1481 | if (dso == NULL) | ||
1482 | goto out_delete_line; | ||
1483 | |||
1484 | map = map__new2(start, dso, MAP__FUNCTION); | ||
1485 | if (map == NULL) { | ||
1486 | dso__delete(dso); | ||
1487 | goto out_delete_line; | 1523 | goto out_delete_line; |
1488 | } | 1524 | dso__kernel_module_get_build_id(map->dso); |
1489 | |||
1490 | snprintf(name, sizeof(name), | ||
1491 | "/sys/module/%s/notes/.note.gnu.build-id", line); | ||
1492 | if (sysfs__read_build_id(name, dso->build_id, | ||
1493 | sizeof(dso->build_id)) == 0) | ||
1494 | dso->has_build_id = true; | ||
1495 | |||
1496 | dso->origin = DSO__ORIG_KMODULE; | ||
1497 | map_groups__insert(&self->kmaps, map); | ||
1498 | dsos__add(&dsos__kernel, dso); | ||
1499 | } | 1525 | } |
1500 | 1526 | ||
1501 | free(line); | 1527 | free(line); |
@@ -1573,10 +1599,28 @@ static int dso__load_kernel_sym(struct dso *self, struct map *map, | |||
1573 | } | 1599 | } |
1574 | } | 1600 | } |
1575 | 1601 | ||
1602 | /* | ||
1603 | * Say the kernel DSO was created when processing the build-id header table, | ||
1604 | * we have a build-id, so check if it is the same as the running kernel, | ||
1605 | * using it if it is. | ||
1606 | */ | ||
1607 | if (self->has_build_id) { | ||
1608 | u8 kallsyms_build_id[BUILD_ID_SIZE]; | ||
1609 | |||
1610 | if (sysfs__read_build_id("/sys/kernel/notes", kallsyms_build_id, | ||
1611 | sizeof(kallsyms_build_id)) == 0) | ||
1612 | |||
1613 | is_kallsyms = dso__build_id_equal(self, kallsyms_build_id); | ||
1614 | if (is_kallsyms) | ||
1615 | goto do_kallsyms; | ||
1616 | goto do_vmlinux; | ||
1617 | } | ||
1618 | |||
1576 | is_kallsyms = self->long_name[0] == '['; | 1619 | is_kallsyms = self->long_name[0] == '['; |
1577 | if (is_kallsyms) | 1620 | if (is_kallsyms) |
1578 | goto do_kallsyms; | 1621 | goto do_kallsyms; |
1579 | 1622 | ||
1623 | do_vmlinux: | ||
1580 | err = dso__load_vmlinux(self, map, session, self->long_name, filter); | 1624 | err = dso__load_vmlinux(self, map, session, self->long_name, filter); |
1581 | if (err <= 0) { | 1625 | if (err <= 0) { |
1582 | pr_info("The file %s cannot be used, " | 1626 | pr_info("The file %s cannot be used, " |
@@ -1694,16 +1738,12 @@ out_delete_kernel_dso: | |||
1694 | return NULL; | 1738 | return NULL; |
1695 | } | 1739 | } |
1696 | 1740 | ||
1697 | static int map_groups__create_kernel_maps(struct map_groups *self, | 1741 | int __map_groups__create_kernel_maps(struct map_groups *self, |
1698 | struct map *vmlinux_maps[MAP__NR_TYPES], | 1742 | struct map *vmlinux_maps[MAP__NR_TYPES], |
1699 | const char *vmlinux) | 1743 | struct dso *kernel) |
1700 | { | 1744 | { |
1701 | struct dso *kernel = dsos__create_kernel(vmlinux); | ||
1702 | enum map_type type; | 1745 | enum map_type type; |
1703 | 1746 | ||
1704 | if (kernel == NULL) | ||
1705 | return -1; | ||
1706 | |||
1707 | for (type = 0; type < MAP__NR_TYPES; ++type) { | 1747 | for (type = 0; type < MAP__NR_TYPES; ++type) { |
1708 | vmlinux_maps[type] = map__new2(0, kernel, type); | 1748 | vmlinux_maps[type] = map__new2(0, kernel, type); |
1709 | if (vmlinux_maps[type] == NULL) | 1749 | if (vmlinux_maps[type] == NULL) |
@@ -1717,6 +1757,18 @@ static int map_groups__create_kernel_maps(struct map_groups *self, | |||
1717 | return 0; | 1757 | return 0; |
1718 | } | 1758 | } |
1719 | 1759 | ||
1760 | static int map_groups__create_kernel_maps(struct map_groups *self, | ||
1761 | struct map *vmlinux_maps[MAP__NR_TYPES], | ||
1762 | const char *vmlinux) | ||
1763 | { | ||
1764 | struct dso *kernel = dsos__create_kernel(vmlinux); | ||
1765 | |||
1766 | if (kernel == NULL) | ||
1767 | return -1; | ||
1768 | |||
1769 | return __map_groups__create_kernel_maps(self, vmlinux_maps, kernel); | ||
1770 | } | ||
1771 | |||
1720 | static void vmlinux_path__exit(void) | 1772 | static void vmlinux_path__exit(void) |
1721 | { | 1773 | { |
1722 | while (--vmlinux_path__nr_entries >= 0) { | 1774 | while (--vmlinux_path__nr_entries >= 0) { |
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index ee0b4593db7b..594156e43b10 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h | |||
@@ -134,6 +134,7 @@ size_t dsos__fprintf_buildid(FILE *fp); | |||
134 | size_t dso__fprintf_buildid(struct dso *self, FILE *fp); | 134 | size_t dso__fprintf_buildid(struct dso *self, FILE *fp); |
135 | size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp); | 135 | size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp); |
136 | char dso__symtab_origin(const struct dso *self); | 136 | char dso__symtab_origin(const struct dso *self); |
137 | void dso__set_long_name(struct dso *self, char *name); | ||
137 | void dso__set_build_id(struct dso *self, void *build_id); | 138 | void dso__set_build_id(struct dso *self, void *build_id); |
138 | struct symbol *dso__find_symbol(struct dso *self, enum map_type type, u64 addr); | 139 | struct symbol *dso__find_symbol(struct dso *self, enum map_type type, u64 addr); |
139 | struct symbol *dso__find_symbol_by_name(struct dso *self, enum map_type type, | 140 | struct symbol *dso__find_symbol_by_name(struct dso *self, enum map_type type, |
@@ -151,5 +152,7 @@ bool symbol_type__is_a(char symbol_type, enum map_type map_type); | |||
151 | 152 | ||
152 | int perf_session__create_kernel_maps(struct perf_session *self); | 153 | int perf_session__create_kernel_maps(struct perf_session *self); |
153 | 154 | ||
155 | struct map *perf_session__new_module_map(struct perf_session *self, u64 start, | ||
156 | const char *filename); | ||
154 | extern struct dso *vdso; | 157 | extern struct dso *vdso; |
155 | #endif /* __PERF_SYMBOL */ | 158 | #endif /* __PERF_SYMBOL */ |
diff --git a/tools/perf/util/thread.h b/tools/perf/util/thread.h index c206f72c8881..c06c13535a70 100644 --- a/tools/perf/util/thread.h +++ b/tools/perf/util/thread.h | |||
@@ -67,4 +67,8 @@ map_groups__find_function(struct map_groups *self, struct perf_session *session, | |||
67 | 67 | ||
68 | struct map *map_groups__find_by_name(struct map_groups *self, | 68 | struct map *map_groups__find_by_name(struct map_groups *self, |
69 | enum map_type type, const char *name); | 69 | enum map_type type, const char *name); |
70 | |||
71 | int __map_groups__create_kernel_maps(struct map_groups *self, | ||
72 | struct map *vmlinux_maps[MAP__NR_TYPES], | ||
73 | struct dso *kernel); | ||
70 | #endif /* __PERF_THREAD_H */ | 74 | #endif /* __PERF_THREAD_H */ |