1 // SPDX-License-Identifier: GPL-2.0 2 #include <asm/bug.h> 3 #include <linux/kernel.h> 4 #include <linux/string.h> 5 #include <linux/zalloc.h> 6 #include <sys/time.h> 7 #include <sys/resource.h> 8 #include <sys/types.h> 9 #include <sys/stat.h> 10 #include <unistd.h> 11 #include <errno.h> 12 #include <fcntl.h> 13 #include <stdlib.h> 14 #include <bpf/libbpf.h> 15 #include "bpf-event.h" 16 #include "compress.h" 17 #include "env.h" 18 #include "namespaces.h" 19 #include "path.h" 20 #include "map.h" 21 #include "symbol.h" 22 #include "srcline.h" 23 #include "dso.h" 24 #include "dsos.h" 25 #include "machine.h" 26 #include "auxtrace.h" 27 #include "util.h" /* O_CLOEXEC for older systems */ 28 #include "debug.h" 29 #include "string2.h" 30 #include "vdso.h" 31 32 static const char * const debuglink_paths[] = { 33 "%.0s%s", 34 "%s/%s", 35 "%s/.debug/%s", 36 "/usr/lib/debug%s/%s" 37 }; 38 39 char dso__symtab_origin(const struct dso *dso) 40 { 41 static const char origin[] = { 42 [DSO_BINARY_TYPE__KALLSYMS] = 'k', 43 [DSO_BINARY_TYPE__VMLINUX] = 'v', 44 [DSO_BINARY_TYPE__JAVA_JIT] = 'j', 45 [DSO_BINARY_TYPE__DEBUGLINK] = 'l', 46 [DSO_BINARY_TYPE__BUILD_ID_CACHE] = 'B', 47 [DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO] = 'D', 48 [DSO_BINARY_TYPE__FEDORA_DEBUGINFO] = 'f', 49 [DSO_BINARY_TYPE__UBUNTU_DEBUGINFO] = 'u', 50 [DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO] = 'o', 51 [DSO_BINARY_TYPE__BUILDID_DEBUGINFO] = 'b', 52 [DSO_BINARY_TYPE__SYSTEM_PATH_DSO] = 'd', 53 [DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE] = 'K', 54 [DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP] = 'm', 55 [DSO_BINARY_TYPE__GUEST_KALLSYMS] = 'g', 56 [DSO_BINARY_TYPE__GUEST_KMODULE] = 'G', 57 [DSO_BINARY_TYPE__GUEST_KMODULE_COMP] = 'M', 58 [DSO_BINARY_TYPE__GUEST_VMLINUX] = 'V', 59 }; 60 61 if (dso == NULL || dso->symtab_type == DSO_BINARY_TYPE__NOT_FOUND) 62 return '!'; 63 return origin[dso->symtab_type]; 64 } 65 66 int dso__read_binary_type_filename(const struct dso *dso, 67 enum dso_binary_type type, 68 char *root_dir, char *filename, size_t size) 69 { 70 char build_id_hex[SBUILD_ID_SIZE]; 71 int ret = 0; 72 size_t len; 73 74 switch (type) { 75 case DSO_BINARY_TYPE__DEBUGLINK: 76 { 77 const char *last_slash; 78 char dso_dir[PATH_MAX]; 79 char symfile[PATH_MAX]; 80 unsigned int i; 81 82 len = __symbol__join_symfs(filename, size, dso->long_name); 83 last_slash = filename + len; 84 while (last_slash != filename && *last_slash != '/') 85 last_slash--; 86 87 strncpy(dso_dir, filename, last_slash - filename); 88 dso_dir[last_slash-filename] = '\0'; 89 90 if (!is_regular_file(filename)) { 91 ret = -1; 92 break; 93 } 94 95 ret = filename__read_debuglink(filename, symfile, PATH_MAX); 96 if (ret) 97 break; 98 99 /* Check predefined locations where debug file might reside */ 100 ret = -1; 101 for (i = 0; i < ARRAY_SIZE(debuglink_paths); i++) { 102 snprintf(filename, size, 103 debuglink_paths[i], dso_dir, symfile); 104 if (is_regular_file(filename)) { 105 ret = 0; 106 break; 107 } 108 } 109 110 break; 111 } 112 case DSO_BINARY_TYPE__BUILD_ID_CACHE: 113 if (dso__build_id_filename(dso, filename, size, false) == NULL) 114 ret = -1; 115 break; 116 117 case DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO: 118 if (dso__build_id_filename(dso, filename, size, true) == NULL) 119 ret = -1; 120 break; 121 122 case DSO_BINARY_TYPE__FEDORA_DEBUGINFO: 123 len = __symbol__join_symfs(filename, size, "/usr/lib/debug"); 124 snprintf(filename + len, size - len, "%s.debug", dso->long_name); 125 break; 126 127 case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO: 128 len = __symbol__join_symfs(filename, size, "/usr/lib/debug"); 129 snprintf(filename + len, size - len, "%s", dso->long_name); 130 break; 131 132 case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO: 133 { 134 const char *last_slash; 135 size_t dir_size; 136 137 last_slash = dso->long_name + dso->long_name_len; 138 while (last_slash != dso->long_name && *last_slash != '/') 139 last_slash--; 140 141 len = __symbol__join_symfs(filename, size, ""); 142 dir_size = last_slash - dso->long_name + 2; 143 if (dir_size > (size - len)) { 144 ret = -1; 145 break; 146 } 147 len += scnprintf(filename + len, dir_size, "%s", dso->long_name); 148 len += scnprintf(filename + len , size - len, ".debug%s", 149 last_slash); 150 break; 151 } 152 153 case DSO_BINARY_TYPE__BUILDID_DEBUGINFO: 154 if (!dso->has_build_id) { 155 ret = -1; 156 break; 157 } 158 159 build_id__sprintf(dso->build_id, 160 sizeof(dso->build_id), 161 build_id_hex); 162 len = __symbol__join_symfs(filename, size, "/usr/lib/debug/.build-id/"); 163 snprintf(filename + len, size - len, "%.2s/%s.debug", 164 build_id_hex, build_id_hex + 2); 165 break; 166 167 case DSO_BINARY_TYPE__VMLINUX: 168 case DSO_BINARY_TYPE__GUEST_VMLINUX: 169 case DSO_BINARY_TYPE__SYSTEM_PATH_DSO: 170 __symbol__join_symfs(filename, size, dso->long_name); 171 break; 172 173 case DSO_BINARY_TYPE__GUEST_KMODULE: 174 case DSO_BINARY_TYPE__GUEST_KMODULE_COMP: 175 path__join3(filename, size, symbol_conf.symfs, 176 root_dir, dso->long_name); 177 break; 178 179 case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE: 180 case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP: 181 __symbol__join_symfs(filename, size, dso->long_name); 182 break; 183 184 case DSO_BINARY_TYPE__KCORE: 185 case DSO_BINARY_TYPE__GUEST_KCORE: 186 snprintf(filename, size, "%s", dso->long_name); 187 break; 188 189 default: 190 case DSO_BINARY_TYPE__KALLSYMS: 191 case DSO_BINARY_TYPE__GUEST_KALLSYMS: 192 case DSO_BINARY_TYPE__JAVA_JIT: 193 case DSO_BINARY_TYPE__BPF_PROG_INFO: 194 case DSO_BINARY_TYPE__NOT_FOUND: 195 ret = -1; 196 break; 197 } 198 199 return ret; 200 } 201 202 enum { 203 COMP_ID__NONE = 0, 204 }; 205 206 static const struct { 207 const char *fmt; 208 int (*decompress)(const char *input, int output); 209 bool (*is_compressed)(const char *input); 210 } compressions[] = { 211 [COMP_ID__NONE] = { .fmt = NULL, }, 212 #ifdef HAVE_ZLIB_SUPPORT 213 { "gz", gzip_decompress_to_file, gzip_is_compressed }, 214 #endif 215 #ifdef HAVE_LZMA_SUPPORT 216 { "xz", lzma_decompress_to_file, lzma_is_compressed }, 217 #endif 218 { NULL, NULL, NULL }, 219 }; 220 221 static int is_supported_compression(const char *ext) 222 { 223 unsigned i; 224 225 for (i = 1; compressions[i].fmt; i++) { 226 if (!strcmp(ext, compressions[i].fmt)) 227 return i; 228 } 229 return COMP_ID__NONE; 230 } 231 232 bool is_kernel_module(const char *pathname, int cpumode) 233 { 234 struct kmod_path m; 235 int mode = cpumode & PERF_RECORD_MISC_CPUMODE_MASK; 236 237 WARN_ONCE(mode != cpumode, 238 "Internal error: passing unmasked cpumode (%x) to is_kernel_module", 239 cpumode); 240 241 switch (mode) { 242 case PERF_RECORD_MISC_USER: 243 case PERF_RECORD_MISC_HYPERVISOR: 244 case PERF_RECORD_MISC_GUEST_USER: 245 return false; 246 /* Treat PERF_RECORD_MISC_CPUMODE_UNKNOWN as kernel */ 247 default: 248 if (kmod_path__parse(&m, pathname)) { 249 pr_err("Failed to check whether %s is a kernel module or not. Assume it is.", 250 pathname); 251 return true; 252 } 253 } 254 255 return m.kmod; 256 } 257 258 bool dso__needs_decompress(struct dso *dso) 259 { 260 return dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP || 261 dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP; 262 } 263 264 static int decompress_kmodule(struct dso *dso, const char *name, 265 char *pathname, size_t len) 266 { 267 char tmpbuf[] = KMOD_DECOMP_NAME; 268 int fd = -1; 269 270 if (!dso__needs_decompress(dso)) 271 return -1; 272 273 if (dso->comp == COMP_ID__NONE) 274 return -1; 275 276 /* 277 * We have proper compression id for DSO and yet the file 278 * behind the 'name' can still be plain uncompressed object. 279 * 280 * The reason is behind the logic we open the DSO object files, 281 * when we try all possible 'debug' objects until we find the 282 * data. So even if the DSO is represented by 'krava.xz' module, 283 * we can end up here opening ~/.debug/....23432432/debug' file 284 * which is not compressed. 285 * 286 * To keep this transparent, we detect this and return the file 287 * descriptor to the uncompressed file. 288 */ 289 if (!compressions[dso->comp].is_compressed(name)) 290 return open(name, O_RDONLY); 291 292 fd = mkstemp(tmpbuf); 293 if (fd < 0) { 294 dso->load_errno = errno; 295 return -1; 296 } 297 298 if (compressions[dso->comp].decompress(name, fd)) { 299 dso->load_errno = DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE; 300 close(fd); 301 fd = -1; 302 } 303 304 if (!pathname || (fd < 0)) 305 unlink(tmpbuf); 306 307 if (pathname && (fd >= 0)) 308 strlcpy(pathname, tmpbuf, len); 309 310 return fd; 311 } 312 313 int dso__decompress_kmodule_fd(struct dso *dso, const char *name) 314 { 315 return decompress_kmodule(dso, name, NULL, 0); 316 } 317 318 int dso__decompress_kmodule_path(struct dso *dso, const char *name, 319 char *pathname, size_t len) 320 { 321 int fd = decompress_kmodule(dso, name, pathname, len); 322 323 close(fd); 324 return fd >= 0 ? 0 : -1; 325 } 326 327 /* 328 * Parses kernel module specified in @path and updates 329 * @m argument like: 330 * 331 * @comp - true if @path contains supported compression suffix, 332 * false otherwise 333 * @kmod - true if @path contains '.ko' suffix in right position, 334 * false otherwise 335 * @name - if (@alloc_name && @kmod) is true, it contains strdup-ed base name 336 * of the kernel module without suffixes, otherwise strudup-ed 337 * base name of @path 338 * @ext - if (@alloc_ext && @comp) is true, it contains strdup-ed string 339 * the compression suffix 340 * 341 * Returns 0 if there's no strdup error, -ENOMEM otherwise. 342 */ 343 int __kmod_path__parse(struct kmod_path *m, const char *path, 344 bool alloc_name) 345 { 346 const char *name = strrchr(path, '/'); 347 const char *ext = strrchr(path, '.'); 348 bool is_simple_name = false; 349 350 memset(m, 0x0, sizeof(*m)); 351 name = name ? name + 1 : path; 352 353 /* 354 * '.' is also a valid character for module name. For example: 355 * [aaa.bbb] is a valid module name. '[' should have higher 356 * priority than '.ko' suffix. 357 * 358 * The kernel names are from machine__mmap_name. Such 359 * name should belong to kernel itself, not kernel module. 360 */ 361 if (name[0] == '[') { 362 is_simple_name = true; 363 if ((strncmp(name, "[kernel.kallsyms]", 17) == 0) || 364 (strncmp(name, "[guest.kernel.kallsyms", 22) == 0) || 365 (strncmp(name, "[vdso]", 6) == 0) || 366 (strncmp(name, "[vdso32]", 8) == 0) || 367 (strncmp(name, "[vdsox32]", 9) == 0) || 368 (strncmp(name, "[vsyscall]", 10) == 0)) { 369 m->kmod = false; 370 371 } else 372 m->kmod = true; 373 } 374 375 /* No extension, just return name. */ 376 if ((ext == NULL) || is_simple_name) { 377 if (alloc_name) { 378 m->name = strdup(name); 379 return m->name ? 0 : -ENOMEM; 380 } 381 return 0; 382 } 383 384 m->comp = is_supported_compression(ext + 1); 385 if (m->comp > COMP_ID__NONE) 386 ext -= 3; 387 388 /* Check .ko extension only if there's enough name left. */ 389 if (ext > name) 390 m->kmod = !strncmp(ext, ".ko", 3); 391 392 if (alloc_name) { 393 if (m->kmod) { 394 if (asprintf(&m->name, "[%.*s]", (int) (ext - name), name) == -1) 395 return -ENOMEM; 396 } else { 397 if (asprintf(&m->name, "%s", name) == -1) 398 return -ENOMEM; 399 } 400 401 strreplace(m->name, '-', '_'); 402 } 403 404 return 0; 405 } 406 407 void dso__set_module_info(struct dso *dso, struct kmod_path *m, 408 struct machine *machine) 409 { 410 if (machine__is_host(machine)) 411 dso->symtab_type = DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE; 412 else 413 dso->symtab_type = DSO_BINARY_TYPE__GUEST_KMODULE; 414 415 /* _KMODULE_COMP should be next to _KMODULE */ 416 if (m->kmod && m->comp) { 417 dso->symtab_type++; 418 dso->comp = m->comp; 419 } 420 421 dso__set_short_name(dso, strdup(m->name), true); 422 } 423 424 /* 425 * Global list of open DSOs and the counter. 426 */ 427 static LIST_HEAD(dso__data_open); 428 static long dso__data_open_cnt; 429 static pthread_mutex_t dso__data_open_lock = PTHREAD_MUTEX_INITIALIZER; 430 431 static void dso__list_add(struct dso *dso) 432 { 433 list_add_tail(&dso->data.open_entry, &dso__data_open); 434 dso__data_open_cnt++; 435 } 436 437 static void dso__list_del(struct dso *dso) 438 { 439 list_del_init(&dso->data.open_entry); 440 WARN_ONCE(dso__data_open_cnt <= 0, 441 "DSO data fd counter out of bounds."); 442 dso__data_open_cnt--; 443 } 444 445 static void close_first_dso(void); 446 447 static int do_open(char *name) 448 { 449 int fd; 450 char sbuf[STRERR_BUFSIZE]; 451 452 do { 453 fd = open(name, O_RDONLY|O_CLOEXEC); 454 if (fd >= 0) 455 return fd; 456 457 pr_debug("dso open failed: %s\n", 458 str_error_r(errno, sbuf, sizeof(sbuf))); 459 if (!dso__data_open_cnt || errno != EMFILE) 460 break; 461 462 close_first_dso(); 463 } while (1); 464 465 return -1; 466 } 467 468 static int __open_dso(struct dso *dso, struct machine *machine) 469 { 470 int fd = -EINVAL; 471 char *root_dir = (char *)""; 472 char *name = malloc(PATH_MAX); 473 bool decomp = false; 474 475 if (!name) 476 return -ENOMEM; 477 478 if (machine) 479 root_dir = machine->root_dir; 480 481 if (dso__read_binary_type_filename(dso, dso->binary_type, 482 root_dir, name, PATH_MAX)) 483 goto out; 484 485 if (!is_regular_file(name)) 486 goto out; 487 488 if (dso__needs_decompress(dso)) { 489 char newpath[KMOD_DECOMP_LEN]; 490 size_t len = sizeof(newpath); 491 492 if (dso__decompress_kmodule_path(dso, name, newpath, len) < 0) { 493 fd = -dso->load_errno; 494 goto out; 495 } 496 497 decomp = true; 498 strcpy(name, newpath); 499 } 500 501 fd = do_open(name); 502 503 if (decomp) 504 unlink(name); 505 506 out: 507 free(name); 508 return fd; 509 } 510 511 static void check_data_close(void); 512 513 /** 514 * dso_close - Open DSO data file 515 * @dso: dso object 516 * 517 * Open @dso's data file descriptor and updates 518 * list/count of open DSO objects. 519 */ 520 static int open_dso(struct dso *dso, struct machine *machine) 521 { 522 int fd; 523 struct nscookie nsc; 524 525 if (dso->binary_type != DSO_BINARY_TYPE__BUILD_ID_CACHE) 526 nsinfo__mountns_enter(dso->nsinfo, &nsc); 527 fd = __open_dso(dso, machine); 528 if (dso->binary_type != DSO_BINARY_TYPE__BUILD_ID_CACHE) 529 nsinfo__mountns_exit(&nsc); 530 531 if (fd >= 0) { 532 dso__list_add(dso); 533 /* 534 * Check if we crossed the allowed number 535 * of opened DSOs and close one if needed. 536 */ 537 check_data_close(); 538 } 539 540 return fd; 541 } 542 543 static void close_data_fd(struct dso *dso) 544 { 545 if (dso->data.fd >= 0) { 546 close(dso->data.fd); 547 dso->data.fd = -1; 548 dso->data.file_size = 0; 549 dso__list_del(dso); 550 } 551 } 552 553 /** 554 * dso_close - Close DSO data file 555 * @dso: dso object 556 * 557 * Close @dso's data file descriptor and updates 558 * list/count of open DSO objects. 559 */ 560 static void close_dso(struct dso *dso) 561 { 562 close_data_fd(dso); 563 } 564 565 static void close_first_dso(void) 566 { 567 struct dso *dso; 568 569 dso = list_first_entry(&dso__data_open, struct dso, data.open_entry); 570 close_dso(dso); 571 } 572 573 static rlim_t get_fd_limit(void) 574 { 575 struct rlimit l; 576 rlim_t limit = 0; 577 578 /* Allow half of the current open fd limit. */ 579 if (getrlimit(RLIMIT_NOFILE, &l) == 0) { 580 if (l.rlim_cur == RLIM_INFINITY) 581 limit = l.rlim_cur; 582 else 583 limit = l.rlim_cur / 2; 584 } else { 585 pr_err("failed to get fd limit\n"); 586 limit = 1; 587 } 588 589 return limit; 590 } 591 592 static rlim_t fd_limit; 593 594 /* 595 * Used only by tests/dso-data.c to reset the environment 596 * for tests. I dont expect we should change this during 597 * standard runtime. 598 */ 599 void reset_fd_limit(void) 600 { 601 fd_limit = 0; 602 } 603 604 static bool may_cache_fd(void) 605 { 606 if (!fd_limit) 607 fd_limit = get_fd_limit(); 608 609 if (fd_limit == RLIM_INFINITY) 610 return true; 611 612 return fd_limit > (rlim_t) dso__data_open_cnt; 613 } 614 615 /* 616 * Check and close LRU dso if we crossed allowed limit 617 * for opened dso file descriptors. The limit is half 618 * of the RLIMIT_NOFILE files opened. 619 */ 620 static void check_data_close(void) 621 { 622 bool cache_fd = may_cache_fd(); 623 624 if (!cache_fd) 625 close_first_dso(); 626 } 627 628 /** 629 * dso__data_close - Close DSO data file 630 * @dso: dso object 631 * 632 * External interface to close @dso's data file descriptor. 633 */ 634 void dso__data_close(struct dso *dso) 635 { 636 pthread_mutex_lock(&dso__data_open_lock); 637 close_dso(dso); 638 pthread_mutex_unlock(&dso__data_open_lock); 639 } 640 641 static void try_to_open_dso(struct dso *dso, struct machine *machine) 642 { 643 enum dso_binary_type binary_type_data[] = { 644 DSO_BINARY_TYPE__BUILD_ID_CACHE, 645 DSO_BINARY_TYPE__SYSTEM_PATH_DSO, 646 DSO_BINARY_TYPE__NOT_FOUND, 647 }; 648 int i = 0; 649 650 if (dso->data.fd >= 0) 651 return; 652 653 if (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND) { 654 dso->data.fd = open_dso(dso, machine); 655 goto out; 656 } 657 658 do { 659 dso->binary_type = binary_type_data[i++]; 660 661 dso->data.fd = open_dso(dso, machine); 662 if (dso->data.fd >= 0) 663 goto out; 664 665 } while (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND); 666 out: 667 if (dso->data.fd >= 0) 668 dso->data.status = DSO_DATA_STATUS_OK; 669 else 670 dso->data.status = DSO_DATA_STATUS_ERROR; 671 } 672 673 /** 674 * dso__data_get_fd - Get dso's data file descriptor 675 * @dso: dso object 676 * @machine: machine object 677 * 678 * External interface to find dso's file, open it and 679 * returns file descriptor. It should be paired with 680 * dso__data_put_fd() if it returns non-negative value. 681 */ 682 int dso__data_get_fd(struct dso *dso, struct machine *machine) 683 { 684 if (dso->data.status == DSO_DATA_STATUS_ERROR) 685 return -1; 686 687 if (pthread_mutex_lock(&dso__data_open_lock) < 0) 688 return -1; 689 690 try_to_open_dso(dso, machine); 691 692 if (dso->data.fd < 0) 693 pthread_mutex_unlock(&dso__data_open_lock); 694 695 return dso->data.fd; 696 } 697 698 void dso__data_put_fd(struct dso *dso __maybe_unused) 699 { 700 pthread_mutex_unlock(&dso__data_open_lock); 701 } 702 703 bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by) 704 { 705 u32 flag = 1 << by; 706 707 if (dso->data.status_seen & flag) 708 return true; 709 710 dso->data.status_seen |= flag; 711 712 return false; 713 } 714 715 static ssize_t bpf_read(struct dso *dso, u64 offset, char *data) 716 { 717 struct bpf_prog_info_node *node; 718 ssize_t size = DSO__DATA_CACHE_SIZE; 719 u64 len; 720 u8 *buf; 721 722 node = perf_env__find_bpf_prog_info(dso->bpf_prog.env, dso->bpf_prog.id); 723 if (!node || !node->info_linear) { 724 dso->data.status = DSO_DATA_STATUS_ERROR; 725 return -1; 726 } 727 728 len = node->info_linear->info.jited_prog_len; 729 buf = (u8 *)(uintptr_t)node->info_linear->info.jited_prog_insns; 730 731 if (offset >= len) 732 return -1; 733 734 size = (ssize_t)min(len - offset, (u64)size); 735 memcpy(data, buf + offset, size); 736 return size; 737 } 738 739 static int bpf_size(struct dso *dso) 740 { 741 struct bpf_prog_info_node *node; 742 743 node = perf_env__find_bpf_prog_info(dso->bpf_prog.env, dso->bpf_prog.id); 744 if (!node || !node->info_linear) { 745 dso->data.status = DSO_DATA_STATUS_ERROR; 746 return -1; 747 } 748 749 dso->data.file_size = node->info_linear->info.jited_prog_len; 750 return 0; 751 } 752 753 static void 754 dso_cache__free(struct dso *dso) 755 { 756 struct rb_root *root = &dso->data.cache; 757 struct rb_node *next = rb_first(root); 758 759 pthread_mutex_lock(&dso->lock); 760 while (next) { 761 struct dso_cache *cache; 762 763 cache = rb_entry(next, struct dso_cache, rb_node); 764 next = rb_next(&cache->rb_node); 765 rb_erase(&cache->rb_node, root); 766 free(cache); 767 } 768 pthread_mutex_unlock(&dso->lock); 769 } 770 771 static struct dso_cache *__dso_cache__find(struct dso *dso, u64 offset) 772 { 773 const struct rb_root *root = &dso->data.cache; 774 struct rb_node * const *p = &root->rb_node; 775 const struct rb_node *parent = NULL; 776 struct dso_cache *cache; 777 778 while (*p != NULL) { 779 u64 end; 780 781 parent = *p; 782 cache = rb_entry(parent, struct dso_cache, rb_node); 783 end = cache->offset + DSO__DATA_CACHE_SIZE; 784 785 if (offset < cache->offset) 786 p = &(*p)->rb_left; 787 else if (offset >= end) 788 p = &(*p)->rb_right; 789 else 790 return cache; 791 } 792 793 return NULL; 794 } 795 796 static struct dso_cache * 797 dso_cache__insert(struct dso *dso, struct dso_cache *new) 798 { 799 struct rb_root *root = &dso->data.cache; 800 struct rb_node **p = &root->rb_node; 801 struct rb_node *parent = NULL; 802 struct dso_cache *cache; 803 u64 offset = new->offset; 804 805 pthread_mutex_lock(&dso->lock); 806 while (*p != NULL) { 807 u64 end; 808 809 parent = *p; 810 cache = rb_entry(parent, struct dso_cache, rb_node); 811 end = cache->offset + DSO__DATA_CACHE_SIZE; 812 813 if (offset < cache->offset) 814 p = &(*p)->rb_left; 815 else if (offset >= end) 816 p = &(*p)->rb_right; 817 else 818 goto out; 819 } 820 821 rb_link_node(&new->rb_node, parent, p); 822 rb_insert_color(&new->rb_node, root); 823 824 cache = NULL; 825 out: 826 pthread_mutex_unlock(&dso->lock); 827 return cache; 828 } 829 830 static ssize_t dso_cache__memcpy(struct dso_cache *cache, u64 offset, u8 *data, 831 u64 size, bool out) 832 { 833 u64 cache_offset = offset - cache->offset; 834 u64 cache_size = min(cache->size - cache_offset, size); 835 836 if (out) 837 memcpy(data, cache->data + cache_offset, cache_size); 838 else 839 memcpy(cache->data + cache_offset, data, cache_size); 840 return cache_size; 841 } 842 843 static ssize_t file_read(struct dso *dso, struct machine *machine, 844 u64 offset, char *data) 845 { 846 ssize_t ret; 847 848 pthread_mutex_lock(&dso__data_open_lock); 849 850 /* 851 * dso->data.fd might be closed if other thread opened another 852 * file (dso) due to open file limit (RLIMIT_NOFILE). 853 */ 854 try_to_open_dso(dso, machine); 855 856 if (dso->data.fd < 0) { 857 dso->data.status = DSO_DATA_STATUS_ERROR; 858 ret = -errno; 859 goto out; 860 } 861 862 ret = pread(dso->data.fd, data, DSO__DATA_CACHE_SIZE, offset); 863 out: 864 pthread_mutex_unlock(&dso__data_open_lock); 865 return ret; 866 } 867 868 static struct dso_cache *dso_cache__populate(struct dso *dso, 869 struct machine *machine, 870 u64 offset, ssize_t *ret) 871 { 872 u64 cache_offset = offset & DSO__DATA_CACHE_MASK; 873 struct dso_cache *cache; 874 struct dso_cache *old; 875 876 cache = zalloc(sizeof(*cache) + DSO__DATA_CACHE_SIZE); 877 if (!cache) { 878 *ret = -ENOMEM; 879 return NULL; 880 } 881 882 if (dso->binary_type == DSO_BINARY_TYPE__BPF_PROG_INFO) 883 *ret = bpf_read(dso, cache_offset, cache->data); 884 else 885 *ret = file_read(dso, machine, cache_offset, cache->data); 886 887 if (*ret <= 0) { 888 free(cache); 889 return NULL; 890 } 891 892 cache->offset = cache_offset; 893 cache->size = *ret; 894 895 old = dso_cache__insert(dso, cache); 896 if (old) { 897 /* we lose the race */ 898 free(cache); 899 cache = old; 900 } 901 902 return cache; 903 } 904 905 static struct dso_cache *dso_cache__find(struct dso *dso, 906 struct machine *machine, 907 u64 offset, 908 ssize_t *ret) 909 { 910 struct dso_cache *cache = __dso_cache__find(dso, offset); 911 912 return cache ? cache : dso_cache__populate(dso, machine, offset, ret); 913 } 914 915 static ssize_t dso_cache_io(struct dso *dso, struct machine *machine, 916 u64 offset, u8 *data, ssize_t size, bool out) 917 { 918 struct dso_cache *cache; 919 ssize_t ret = 0; 920 921 cache = dso_cache__find(dso, machine, offset, &ret); 922 if (!cache) 923 return ret; 924 925 return dso_cache__memcpy(cache, offset, data, size, out); 926 } 927 928 /* 929 * Reads and caches dso data DSO__DATA_CACHE_SIZE size chunks 930 * in the rb_tree. Any read to already cached data is served 931 * by cached data. Writes update the cache only, not the backing file. 932 */ 933 static ssize_t cached_io(struct dso *dso, struct machine *machine, 934 u64 offset, u8 *data, ssize_t size, bool out) 935 { 936 ssize_t r = 0; 937 u8 *p = data; 938 939 do { 940 ssize_t ret; 941 942 ret = dso_cache_io(dso, machine, offset, p, size, out); 943 if (ret < 0) 944 return ret; 945 946 /* Reached EOF, return what we have. */ 947 if (!ret) 948 break; 949 950 BUG_ON(ret > size); 951 952 r += ret; 953 p += ret; 954 offset += ret; 955 size -= ret; 956 957 } while (size); 958 959 return r; 960 } 961 962 static int file_size(struct dso *dso, struct machine *machine) 963 { 964 int ret = 0; 965 struct stat st; 966 char sbuf[STRERR_BUFSIZE]; 967 968 pthread_mutex_lock(&dso__data_open_lock); 969 970 /* 971 * dso->data.fd might be closed if other thread opened another 972 * file (dso) due to open file limit (RLIMIT_NOFILE). 973 */ 974 try_to_open_dso(dso, machine); 975 976 if (dso->data.fd < 0) { 977 ret = -errno; 978 dso->data.status = DSO_DATA_STATUS_ERROR; 979 goto out; 980 } 981 982 if (fstat(dso->data.fd, &st) < 0) { 983 ret = -errno; 984 pr_err("dso cache fstat failed: %s\n", 985 str_error_r(errno, sbuf, sizeof(sbuf))); 986 dso->data.status = DSO_DATA_STATUS_ERROR; 987 goto out; 988 } 989 dso->data.file_size = st.st_size; 990 991 out: 992 pthread_mutex_unlock(&dso__data_open_lock); 993 return ret; 994 } 995 996 int dso__data_file_size(struct dso *dso, struct machine *machine) 997 { 998 if (dso->data.file_size) 999 return 0; 1000 1001 if (dso->data.status == DSO_DATA_STATUS_ERROR) 1002 return -1; 1003 1004 if (dso->binary_type == DSO_BINARY_TYPE__BPF_PROG_INFO) 1005 return bpf_size(dso); 1006 1007 return file_size(dso, machine); 1008 } 1009 1010 /** 1011 * dso__data_size - Return dso data size 1012 * @dso: dso object 1013 * @machine: machine object 1014 * 1015 * Return: dso data size 1016 */ 1017 off_t dso__data_size(struct dso *dso, struct machine *machine) 1018 { 1019 if (dso__data_file_size(dso, machine)) 1020 return -1; 1021 1022 /* For now just estimate dso data size is close to file size */ 1023 return dso->data.file_size; 1024 } 1025 1026 static ssize_t data_read_write_offset(struct dso *dso, struct machine *machine, 1027 u64 offset, u8 *data, ssize_t size, 1028 bool out) 1029 { 1030 if (dso__data_file_size(dso, machine)) 1031 return -1; 1032 1033 /* Check the offset sanity. */ 1034 if (offset > dso->data.file_size) 1035 return -1; 1036 1037 if (offset + size < offset) 1038 return -1; 1039 1040 return cached_io(dso, machine, offset, data, size, out); 1041 } 1042 1043 /** 1044 * dso__data_read_offset - Read data from dso file offset 1045 * @dso: dso object 1046 * @machine: machine object 1047 * @offset: file offset 1048 * @data: buffer to store data 1049 * @size: size of the @data buffer 1050 * 1051 * External interface to read data from dso file offset. Open 1052 * dso data file and use cached_read to get the data. 1053 */ 1054 ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine, 1055 u64 offset, u8 *data, ssize_t size) 1056 { 1057 if (dso->data.status == DSO_DATA_STATUS_ERROR) 1058 return -1; 1059 1060 return data_read_write_offset(dso, machine, offset, data, size, true); 1061 } 1062 1063 /** 1064 * dso__data_read_addr - Read data from dso address 1065 * @dso: dso object 1066 * @machine: machine object 1067 * @add: virtual memory address 1068 * @data: buffer to store data 1069 * @size: size of the @data buffer 1070 * 1071 * External interface to read data from dso address. 1072 */ 1073 ssize_t dso__data_read_addr(struct dso *dso, struct map *map, 1074 struct machine *machine, u64 addr, 1075 u8 *data, ssize_t size) 1076 { 1077 u64 offset = map->map_ip(map, addr); 1078 return dso__data_read_offset(dso, machine, offset, data, size); 1079 } 1080 1081 /** 1082 * dso__data_write_cache_offs - Write data to dso data cache at file offset 1083 * @dso: dso object 1084 * @machine: machine object 1085 * @offset: file offset 1086 * @data: buffer to write 1087 * @size: size of the @data buffer 1088 * 1089 * Write into the dso file data cache, but do not change the file itself. 1090 */ 1091 ssize_t dso__data_write_cache_offs(struct dso *dso, struct machine *machine, 1092 u64 offset, const u8 *data_in, ssize_t size) 1093 { 1094 u8 *data = (u8 *)data_in; /* cast away const to use same fns for r/w */ 1095 1096 if (dso->data.status == DSO_DATA_STATUS_ERROR) 1097 return -1; 1098 1099 return data_read_write_offset(dso, machine, offset, data, size, false); 1100 } 1101 1102 /** 1103 * dso__data_write_cache_addr - Write data to dso data cache at dso address 1104 * @dso: dso object 1105 * @machine: machine object 1106 * @add: virtual memory address 1107 * @data: buffer to write 1108 * @size: size of the @data buffer 1109 * 1110 * External interface to write into the dso file data cache, but do not change 1111 * the file itself. 1112 */ 1113 ssize_t dso__data_write_cache_addr(struct dso *dso, struct map *map, 1114 struct machine *machine, u64 addr, 1115 const u8 *data, ssize_t size) 1116 { 1117 u64 offset = map->map_ip(map, addr); 1118 return dso__data_write_cache_offs(dso, machine, offset, data, size); 1119 } 1120 1121 struct map *dso__new_map(const char *name) 1122 { 1123 struct map *map = NULL; 1124 struct dso *dso = dso__new(name); 1125 1126 if (dso) 1127 map = map__new2(0, dso); 1128 1129 return map; 1130 } 1131 1132 struct dso *machine__findnew_kernel(struct machine *machine, const char *name, 1133 const char *short_name, int dso_type) 1134 { 1135 /* 1136 * The kernel dso could be created by build_id processing. 1137 */ 1138 struct dso *dso = machine__findnew_dso(machine, name); 1139 1140 /* 1141 * We need to run this in all cases, since during the build_id 1142 * processing we had no idea this was the kernel dso. 1143 */ 1144 if (dso != NULL) { 1145 dso__set_short_name(dso, short_name, false); 1146 dso->kernel = dso_type; 1147 } 1148 1149 return dso; 1150 } 1151 1152 static void dso__set_long_name_id(struct dso *dso, const char *name, struct dso_id *id, bool name_allocated) 1153 { 1154 struct rb_root *root = dso->root; 1155 1156 if (name == NULL) 1157 return; 1158 1159 if (dso->long_name_allocated) 1160 free((char *)dso->long_name); 1161 1162 if (root) { 1163 rb_erase(&dso->rb_node, root); 1164 /* 1165 * __dsos__findnew_link_by_longname_id() isn't guaranteed to 1166 * add it back, so a clean removal is required here. 1167 */ 1168 RB_CLEAR_NODE(&dso->rb_node); 1169 dso->root = NULL; 1170 } 1171 1172 dso->long_name = name; 1173 dso->long_name_len = strlen(name); 1174 dso->long_name_allocated = name_allocated; 1175 1176 if (root) 1177 __dsos__findnew_link_by_longname_id(root, dso, NULL, id); 1178 } 1179 1180 void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated) 1181 { 1182 dso__set_long_name_id(dso, name, NULL, name_allocated); 1183 } 1184 1185 void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated) 1186 { 1187 if (name == NULL) 1188 return; 1189 1190 if (dso->short_name_allocated) 1191 free((char *)dso->short_name); 1192 1193 dso->short_name = name; 1194 dso->short_name_len = strlen(name); 1195 dso->short_name_allocated = name_allocated; 1196 } 1197 1198 int dso__name_len(const struct dso *dso) 1199 { 1200 if (!dso) 1201 return strlen("[unknown]"); 1202 if (verbose > 0) 1203 return dso->long_name_len; 1204 1205 return dso->short_name_len; 1206 } 1207 1208 bool dso__loaded(const struct dso *dso) 1209 { 1210 return dso->loaded; 1211 } 1212 1213 bool dso__sorted_by_name(const struct dso *dso) 1214 { 1215 return dso->sorted_by_name; 1216 } 1217 1218 void dso__set_sorted_by_name(struct dso *dso) 1219 { 1220 dso->sorted_by_name = true; 1221 } 1222 1223 struct dso *dso__new_id(const char *name, struct dso_id *id) 1224 { 1225 struct dso *dso = calloc(1, sizeof(*dso) + strlen(name) + 1); 1226 1227 if (dso != NULL) { 1228 strcpy(dso->name, name); 1229 if (id) 1230 dso->id = *id; 1231 dso__set_long_name_id(dso, dso->name, id, false); 1232 dso__set_short_name(dso, dso->name, false); 1233 dso->symbols = dso->symbol_names = RB_ROOT_CACHED; 1234 dso->data.cache = RB_ROOT; 1235 dso->inlined_nodes = RB_ROOT_CACHED; 1236 dso->srclines = RB_ROOT_CACHED; 1237 dso->data.fd = -1; 1238 dso->data.status = DSO_DATA_STATUS_UNKNOWN; 1239 dso->symtab_type = DSO_BINARY_TYPE__NOT_FOUND; 1240 dso->binary_type = DSO_BINARY_TYPE__NOT_FOUND; 1241 dso->is_64_bit = (sizeof(void *) == 8); 1242 dso->loaded = 0; 1243 dso->rel = 0; 1244 dso->sorted_by_name = 0; 1245 dso->has_build_id = 0; 1246 dso->has_srcline = 1; 1247 dso->a2l_fails = 1; 1248 dso->kernel = DSO_TYPE_USER; 1249 dso->needs_swap = DSO_SWAP__UNSET; 1250 dso->comp = COMP_ID__NONE; 1251 RB_CLEAR_NODE(&dso->rb_node); 1252 dso->root = NULL; 1253 INIT_LIST_HEAD(&dso->node); 1254 INIT_LIST_HEAD(&dso->data.open_entry); 1255 pthread_mutex_init(&dso->lock, NULL); 1256 refcount_set(&dso->refcnt, 1); 1257 } 1258 1259 return dso; 1260 } 1261 1262 struct dso *dso__new(const char *name) 1263 { 1264 return dso__new_id(name, NULL); 1265 } 1266 1267 void dso__delete(struct dso *dso) 1268 { 1269 if (!RB_EMPTY_NODE(&dso->rb_node)) 1270 pr_err("DSO %s is still in rbtree when being deleted!\n", 1271 dso->long_name); 1272 1273 /* free inlines first, as they reference symbols */ 1274 inlines__tree_delete(&dso->inlined_nodes); 1275 srcline__tree_delete(&dso->srclines); 1276 symbols__delete(&dso->symbols); 1277 1278 if (dso->short_name_allocated) { 1279 zfree((char **)&dso->short_name); 1280 dso->short_name_allocated = false; 1281 } 1282 1283 if (dso->long_name_allocated) { 1284 zfree((char **)&dso->long_name); 1285 dso->long_name_allocated = false; 1286 } 1287 1288 dso__data_close(dso); 1289 auxtrace_cache__free(dso->auxtrace_cache); 1290 dso_cache__free(dso); 1291 dso__free_a2l(dso); 1292 zfree(&dso->symsrc_filename); 1293 nsinfo__zput(dso->nsinfo); 1294 pthread_mutex_destroy(&dso->lock); 1295 free(dso); 1296 } 1297 1298 struct dso *dso__get(struct dso *dso) 1299 { 1300 if (dso) 1301 refcount_inc(&dso->refcnt); 1302 return dso; 1303 } 1304 1305 void dso__put(struct dso *dso) 1306 { 1307 if (dso && refcount_dec_and_test(&dso->refcnt)) 1308 dso__delete(dso); 1309 } 1310 1311 void dso__set_build_id(struct dso *dso, void *build_id) 1312 { 1313 memcpy(dso->build_id, build_id, sizeof(dso->build_id)); 1314 dso->has_build_id = 1; 1315 } 1316 1317 bool dso__build_id_equal(const struct dso *dso, u8 *build_id) 1318 { 1319 return memcmp(dso->build_id, build_id, sizeof(dso->build_id)) == 0; 1320 } 1321 1322 void dso__read_running_kernel_build_id(struct dso *dso, struct machine *machine) 1323 { 1324 char path[PATH_MAX]; 1325 1326 if (machine__is_default_guest(machine)) 1327 return; 1328 sprintf(path, "%s/sys/kernel/notes", machine->root_dir); 1329 if (sysfs__read_build_id(path, dso->build_id, 1330 sizeof(dso->build_id)) == 0) 1331 dso->has_build_id = true; 1332 } 1333 1334 int dso__kernel_module_get_build_id(struct dso *dso, 1335 const char *root_dir) 1336 { 1337 char filename[PATH_MAX]; 1338 /* 1339 * kernel module short names are of the form "[module]" and 1340 * we need just "module" here. 1341 */ 1342 const char *name = dso->short_name + 1; 1343 1344 snprintf(filename, sizeof(filename), 1345 "%s/sys/module/%.*s/notes/.note.gnu.build-id", 1346 root_dir, (int)strlen(name) - 1, name); 1347 1348 if (sysfs__read_build_id(filename, dso->build_id, 1349 sizeof(dso->build_id)) == 0) 1350 dso->has_build_id = true; 1351 1352 return 0; 1353 } 1354 1355 size_t dso__fprintf_buildid(struct dso *dso, FILE *fp) 1356 { 1357 char sbuild_id[SBUILD_ID_SIZE]; 1358 1359 build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id); 1360 return fprintf(fp, "%s", sbuild_id); 1361 } 1362 1363 size_t dso__fprintf(struct dso *dso, FILE *fp) 1364 { 1365 struct rb_node *nd; 1366 size_t ret = fprintf(fp, "dso: %s (", dso->short_name); 1367 1368 if (dso->short_name != dso->long_name) 1369 ret += fprintf(fp, "%s, ", dso->long_name); 1370 ret += fprintf(fp, "%sloaded, ", dso__loaded(dso) ? "" : "NOT "); 1371 ret += dso__fprintf_buildid(dso, fp); 1372 ret += fprintf(fp, ")\n"); 1373 for (nd = rb_first_cached(&dso->symbols); nd; nd = rb_next(nd)) { 1374 struct symbol *pos = rb_entry(nd, struct symbol, rb_node); 1375 ret += symbol__fprintf(pos, fp); 1376 } 1377 1378 return ret; 1379 } 1380 1381 enum dso_type dso__type(struct dso *dso, struct machine *machine) 1382 { 1383 int fd; 1384 enum dso_type type = DSO__TYPE_UNKNOWN; 1385 1386 fd = dso__data_get_fd(dso, machine); 1387 if (fd >= 0) { 1388 type = dso__type_fd(fd); 1389 dso__data_put_fd(dso); 1390 } 1391 1392 return type; 1393 } 1394 1395 int dso__strerror_load(struct dso *dso, char *buf, size_t buflen) 1396 { 1397 int idx, errnum = dso->load_errno; 1398 /* 1399 * This must have a same ordering as the enum dso_load_errno. 1400 */ 1401 static const char *dso_load__error_str[] = { 1402 "Internal tools/perf/ library error", 1403 "Invalid ELF file", 1404 "Can not read build id", 1405 "Mismatching build id", 1406 "Decompression failure", 1407 }; 1408 1409 BUG_ON(buflen == 0); 1410 1411 if (errnum >= 0) { 1412 const char *err = str_error_r(errnum, buf, buflen); 1413 1414 if (err != buf) 1415 scnprintf(buf, buflen, "%s", err); 1416 1417 return 0; 1418 } 1419 1420 if (errnum < __DSO_LOAD_ERRNO__START || errnum >= __DSO_LOAD_ERRNO__END) 1421 return -1; 1422 1423 idx = errnum - __DSO_LOAD_ERRNO__START; 1424 scnprintf(buf, buflen, "%s", dso_load__error_str[idx]); 1425 return 0; 1426 } 1427