]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
perf maps: Switch modules tree walk to io_dir__readdir
authorIan Rogers <irogers@google.com>
Sat, 22 Feb 2025 06:10:07 +0000 (22:10 -0800)
committerNamhyung Kim <namhyung@kernel.org>
Mon, 24 Feb 2025 23:46:33 +0000 (15:46 -0800)
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>
tools/perf/util/machine.c

index 316f0879e5e08d66791020ac21cd7cfe264e8cd5..e394c630e3a2506ed2b3e993d6edde4e689a27be 100644 (file)
@@ -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;
 }