Loading tools/perf/builtin-buildid-list.c +1 −2 Original line number Diff line number Diff line Loading @@ -36,7 +36,6 @@ static const struct option options[] = { static int __cmd_buildid_list(void) { int err = -1; struct perf_session *session; session = perf_session__new(input_name, O_RDONLY, force, false); Loading @@ -49,7 +48,7 @@ static int __cmd_buildid_list(void) perf_session__fprintf_dsos_buildid(session, stdout, with_hits); perf_session__delete(session); return err; return 0; } int cmd_buildid_list(int argc, const char **argv, const char *prefix __used) Loading tools/perf/builtin-probe.c +5 −0 Original line number Diff line number Diff line Loading @@ -249,6 +249,11 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used) !params.show_lines)) usage_with_options(probe_usage, options); /* * Only consider the user's kernel image path if given. */ symbol_conf.try_vmlinux_path = (symbol_conf.vmlinux_name == NULL); if (params.list_events) { if (params.mod_events) { pr_err(" Error: Don't use --list with --add/--del.\n"); Loading tools/perf/util/header.c +6 −4 Original line number Diff line number Diff line Loading @@ -265,15 +265,16 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir, const char *name, bool is_kallsyms) { const size_t size = PATH_MAX; char *filename = malloc(size), char *realname = realpath(name, NULL), *filename = malloc(size), *linkname = malloc(size), *targetname; int len, err = -1; if (filename == NULL || linkname == NULL) if (realname == NULL || filename == NULL || linkname == NULL) goto out_free; len = snprintf(filename, size, "%s%s%s", debugdir, is_kallsyms ? "/" : "", name); debugdir, is_kallsyms ? "/" : "", realname); if (mkdir_p(filename, 0755)) goto out_free; Loading @@ -283,7 +284,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir, if (is_kallsyms) { if (copyfile("/proc/kallsyms", filename)) goto out_free; } else if (link(name, filename) && copyfile(name, filename)) } else if (link(realname, filename) && copyfile(name, filename)) goto out_free; } Loading @@ -300,6 +301,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir, if (symlink(targetname, linkname) == 0) err = 0; out_free: free(realname); free(filename); free(linkname); return err; Loading tools/perf/util/probe-event.c +12 −3 Original line number Diff line number Diff line Loading @@ -114,6 +114,8 @@ static struct symbol *__find_kernel_function_by_name(const char *name, const char *kernel_get_module_path(const char *module) { struct dso *dso; struct map *map; const char *vmlinux_name; if (module) { list_for_each_entry(dso, &machine.kernel_dsos, node) { Loading @@ -123,10 +125,17 @@ const char *kernel_get_module_path(const char *module) } pr_debug("Failed to find module %s.\n", module); return NULL; } map = machine.vmlinux_maps[MAP__FUNCTION]; dso = map->dso; vmlinux_name = symbol_conf.vmlinux_name; if (vmlinux_name) { if (dso__load_vmlinux(dso, map, vmlinux_name, NULL) <= 0) return NULL; } else { dso = machine.vmlinux_maps[MAP__FUNCTION]->dso; if (dso__load_vmlinux_path(dso, machine.vmlinux_maps[MAP__FUNCTION], NULL) < 0) { if (dso__load_vmlinux_path(dso, map, NULL) <= 0) { pr_debug("Failed to load kernel map.\n"); return NULL; } Loading tools/perf/util/probe-finder.c +55 −30 Original line number Diff line number Diff line Loading @@ -117,28 +117,6 @@ static void line_list__free(struct list_head *head) } /* Dwarf FL wrappers */ static int __linux_kernel_find_elf(Dwfl_Module *mod, void **userdata, const char *module_name, Dwarf_Addr base, char **file_name, Elf **elfp) { int fd; const char *path = kernel_get_module_path(module_name); if (path) { fd = open(path, O_RDONLY); if (fd >= 0) { *file_name = strdup(path); return fd; } } /* If failed, try to call standard method */ return dwfl_linux_kernel_find_elf(mod, userdata, module_name, base, file_name, elfp); } static char *debuginfo_path; /* Currently dummy */ static const Dwfl_Callbacks offline_callbacks = { Loading @@ -151,14 +129,6 @@ static const Dwfl_Callbacks offline_callbacks = { .find_elf = dwfl_build_id_find_elf, }; static const Dwfl_Callbacks kernel_callbacks = { .find_debuginfo = dwfl_standard_find_debuginfo, .debuginfo_path = &debuginfo_path, .find_elf = __linux_kernel_find_elf, .section_address = dwfl_linux_kernel_module_section_address, }; /* Get a Dwarf from offline image */ static Dwarf *dwfl_init_offline_dwarf(int fd, Dwfl **dwflp, Dwarf_Addr *bias) { Loading @@ -185,6 +155,38 @@ static Dwarf *dwfl_init_offline_dwarf(int fd, Dwfl **dwflp, Dwarf_Addr *bias) return dbg; } #if _ELFUTILS_PREREQ(0, 148) /* This method is buggy if elfutils is older than 0.148 */ static int __linux_kernel_find_elf(Dwfl_Module *mod, void **userdata, const char *module_name, Dwarf_Addr base, char **file_name, Elf **elfp) { int fd; const char *path = kernel_get_module_path(module_name); pr_debug2("Use file %s for %s\n", path, module_name); if (path) { fd = open(path, O_RDONLY); if (fd >= 0) { *file_name = strdup(path); return fd; } } /* If failed, try to call standard method */ return dwfl_linux_kernel_find_elf(mod, userdata, module_name, base, file_name, elfp); } static const Dwfl_Callbacks kernel_callbacks = { .find_debuginfo = dwfl_standard_find_debuginfo, .debuginfo_path = &debuginfo_path, .find_elf = __linux_kernel_find_elf, .section_address = dwfl_linux_kernel_module_section_address, }; /* Get a Dwarf from live kernel image */ static Dwarf *dwfl_init_live_kernel_dwarf(Dwarf_Addr addr, Dwfl **dwflp, Dwarf_Addr *bias) Loading @@ -205,11 +207,34 @@ static Dwarf *dwfl_init_live_kernel_dwarf(Dwarf_Addr addr, Dwfl **dwflp, dbg = dwfl_addrdwarf(*dwflp, addr, bias); /* Here, check whether we could get a real dwarf */ if (!dbg) { pr_debug("Failed to find kernel dwarf at %lx\n", (unsigned long)addr); dwfl_end(*dwflp); *dwflp = NULL; } return dbg; } #else /* With older elfutils, this just support kernel module... */ static Dwarf *dwfl_init_live_kernel_dwarf(Dwarf_Addr addr __used, Dwfl **dwflp, Dwarf_Addr *bias) { int fd; const char *path = kernel_get_module_path("kernel"); if (!path) { pr_err("Failed to find vmlinux path\n"); return NULL; } pr_debug2("Use file %s for debuginfo\n", path); fd = open(path, O_RDONLY); if (fd < 0) return NULL; return dwfl_init_offline_dwarf(fd, dwflp, bias); } #endif /* Dwarf wrappers */ Loading Loading
tools/perf/builtin-buildid-list.c +1 −2 Original line number Diff line number Diff line Loading @@ -36,7 +36,6 @@ static const struct option options[] = { static int __cmd_buildid_list(void) { int err = -1; struct perf_session *session; session = perf_session__new(input_name, O_RDONLY, force, false); Loading @@ -49,7 +48,7 @@ static int __cmd_buildid_list(void) perf_session__fprintf_dsos_buildid(session, stdout, with_hits); perf_session__delete(session); return err; return 0; } int cmd_buildid_list(int argc, const char **argv, const char *prefix __used) Loading
tools/perf/builtin-probe.c +5 −0 Original line number Diff line number Diff line Loading @@ -249,6 +249,11 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used) !params.show_lines)) usage_with_options(probe_usage, options); /* * Only consider the user's kernel image path if given. */ symbol_conf.try_vmlinux_path = (symbol_conf.vmlinux_name == NULL); if (params.list_events) { if (params.mod_events) { pr_err(" Error: Don't use --list with --add/--del.\n"); Loading
tools/perf/util/header.c +6 −4 Original line number Diff line number Diff line Loading @@ -265,15 +265,16 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir, const char *name, bool is_kallsyms) { const size_t size = PATH_MAX; char *filename = malloc(size), char *realname = realpath(name, NULL), *filename = malloc(size), *linkname = malloc(size), *targetname; int len, err = -1; if (filename == NULL || linkname == NULL) if (realname == NULL || filename == NULL || linkname == NULL) goto out_free; len = snprintf(filename, size, "%s%s%s", debugdir, is_kallsyms ? "/" : "", name); debugdir, is_kallsyms ? "/" : "", realname); if (mkdir_p(filename, 0755)) goto out_free; Loading @@ -283,7 +284,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir, if (is_kallsyms) { if (copyfile("/proc/kallsyms", filename)) goto out_free; } else if (link(name, filename) && copyfile(name, filename)) } else if (link(realname, filename) && copyfile(name, filename)) goto out_free; } Loading @@ -300,6 +301,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir, if (symlink(targetname, linkname) == 0) err = 0; out_free: free(realname); free(filename); free(linkname); return err; Loading
tools/perf/util/probe-event.c +12 −3 Original line number Diff line number Diff line Loading @@ -114,6 +114,8 @@ static struct symbol *__find_kernel_function_by_name(const char *name, const char *kernel_get_module_path(const char *module) { struct dso *dso; struct map *map; const char *vmlinux_name; if (module) { list_for_each_entry(dso, &machine.kernel_dsos, node) { Loading @@ -123,10 +125,17 @@ const char *kernel_get_module_path(const char *module) } pr_debug("Failed to find module %s.\n", module); return NULL; } map = machine.vmlinux_maps[MAP__FUNCTION]; dso = map->dso; vmlinux_name = symbol_conf.vmlinux_name; if (vmlinux_name) { if (dso__load_vmlinux(dso, map, vmlinux_name, NULL) <= 0) return NULL; } else { dso = machine.vmlinux_maps[MAP__FUNCTION]->dso; if (dso__load_vmlinux_path(dso, machine.vmlinux_maps[MAP__FUNCTION], NULL) < 0) { if (dso__load_vmlinux_path(dso, map, NULL) <= 0) { pr_debug("Failed to load kernel map.\n"); return NULL; } Loading
tools/perf/util/probe-finder.c +55 −30 Original line number Diff line number Diff line Loading @@ -117,28 +117,6 @@ static void line_list__free(struct list_head *head) } /* Dwarf FL wrappers */ static int __linux_kernel_find_elf(Dwfl_Module *mod, void **userdata, const char *module_name, Dwarf_Addr base, char **file_name, Elf **elfp) { int fd; const char *path = kernel_get_module_path(module_name); if (path) { fd = open(path, O_RDONLY); if (fd >= 0) { *file_name = strdup(path); return fd; } } /* If failed, try to call standard method */ return dwfl_linux_kernel_find_elf(mod, userdata, module_name, base, file_name, elfp); } static char *debuginfo_path; /* Currently dummy */ static const Dwfl_Callbacks offline_callbacks = { Loading @@ -151,14 +129,6 @@ static const Dwfl_Callbacks offline_callbacks = { .find_elf = dwfl_build_id_find_elf, }; static const Dwfl_Callbacks kernel_callbacks = { .find_debuginfo = dwfl_standard_find_debuginfo, .debuginfo_path = &debuginfo_path, .find_elf = __linux_kernel_find_elf, .section_address = dwfl_linux_kernel_module_section_address, }; /* Get a Dwarf from offline image */ static Dwarf *dwfl_init_offline_dwarf(int fd, Dwfl **dwflp, Dwarf_Addr *bias) { Loading @@ -185,6 +155,38 @@ static Dwarf *dwfl_init_offline_dwarf(int fd, Dwfl **dwflp, Dwarf_Addr *bias) return dbg; } #if _ELFUTILS_PREREQ(0, 148) /* This method is buggy if elfutils is older than 0.148 */ static int __linux_kernel_find_elf(Dwfl_Module *mod, void **userdata, const char *module_name, Dwarf_Addr base, char **file_name, Elf **elfp) { int fd; const char *path = kernel_get_module_path(module_name); pr_debug2("Use file %s for %s\n", path, module_name); if (path) { fd = open(path, O_RDONLY); if (fd >= 0) { *file_name = strdup(path); return fd; } } /* If failed, try to call standard method */ return dwfl_linux_kernel_find_elf(mod, userdata, module_name, base, file_name, elfp); } static const Dwfl_Callbacks kernel_callbacks = { .find_debuginfo = dwfl_standard_find_debuginfo, .debuginfo_path = &debuginfo_path, .find_elf = __linux_kernel_find_elf, .section_address = dwfl_linux_kernel_module_section_address, }; /* Get a Dwarf from live kernel image */ static Dwarf *dwfl_init_live_kernel_dwarf(Dwarf_Addr addr, Dwfl **dwflp, Dwarf_Addr *bias) Loading @@ -205,11 +207,34 @@ static Dwarf *dwfl_init_live_kernel_dwarf(Dwarf_Addr addr, Dwfl **dwflp, dbg = dwfl_addrdwarf(*dwflp, addr, bias); /* Here, check whether we could get a real dwarf */ if (!dbg) { pr_debug("Failed to find kernel dwarf at %lx\n", (unsigned long)addr); dwfl_end(*dwflp); *dwflp = NULL; } return dbg; } #else /* With older elfutils, this just support kernel module... */ static Dwarf *dwfl_init_live_kernel_dwarf(Dwarf_Addr addr __used, Dwfl **dwflp, Dwarf_Addr *bias) { int fd; const char *path = kernel_get_module_path("kernel"); if (!path) { pr_err("Failed to find vmlinux path\n"); return NULL; } pr_debug2("Use file %s for debuginfo\n", path); fd = open(path, O_RDONLY); if (fd < 0) return NULL; return dwfl_init_offline_dwarf(fd, dwflp, bias); } #endif /* Dwarf wrappers */ Loading