diff options
author | Ian Rogers <irogers@google.com> | 2025-02-21 22:10:07 -0800 |
---|---|---|
committer | Namhyung Kim <namhyung@kernel.org> | 2025-02-24 15:46:33 -0800 |
commit | f7cada5f7e7f51fa88428f267ef7216b769fd262 (patch) | |
tree | 9422c555d09c8eed96cbe12ffcf3e2f8cefccf4f | |
parent | d118b08f7eee6d6f44b4c549cf22d6b078e2ed73 (diff) |
perf maps: Switch modules tree walk to io_dir__readdir
Compared to glibc's opendir/readdir this lowers the max RSS of perf
record by 1.8MB on a Debian machine.
Acked-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20250222061015.303622-3-irogers@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
-rw-r--r-- | tools/perf/util/machine.c | 25 |
1 files changed, 8 insertions, 17 deletions
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 316f0879e5e0..e394c630e3a2 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -37,6 +37,7 @@ #include <internal/lib.h> // page_size #include "cgroup.h" #include "arm64-frame-pointer-unwind-support.h" +#include <api/io_dir.h> #include <linux/ctype.h> #include <symbol/kallsyms.h> @@ -1339,31 +1340,21 @@ static int maps__set_module_path(struct maps *maps, const char *path, struct kmo static int maps__set_modules_path_dir(struct maps *maps, const char *dir_name, int depth) { - const struct dirent *dent; - DIR *dir = opendir(dir_name); + struct io_dirent64 *dent; + struct io_dir iod; int ret = 0; - if (!dir) { + io_dir__init(&iod, open(dir_name, O_CLOEXEC | O_DIRECTORY | O_RDONLY)); + if (iod.dirfd < 0) { pr_debug("%s: cannot open %s dir\n", __func__, dir_name); return -1; } - while ((dent = readdir(dir)) != NULL) { + while ((dent = io_dir__readdir(&iod)) != NULL) { char path[PATH_MAX]; - unsigned char d_type = dent->d_type; path__join(path, sizeof(path), dir_name, dent->d_name); - - if (d_type == DT_UNKNOWN) { - struct stat st; - - if (stat(path, &st)) - continue; - if (S_ISDIR(st.st_mode)) - d_type = DT_DIR; - } - - if (d_type == DT_DIR) { + if (io_dir__is_dir(&iod, dent)) { if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, "..")) continue; @@ -1396,7 +1387,7 @@ static int maps__set_modules_path_dir(struct maps *maps, const char *dir_name, i } out: - closedir(dir); + close(iod.dirfd); return ret; } |