]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
perf header: Switch mem topology to io_dir__readdir
authorIan Rogers <irogers@google.com>
Sat, 22 Feb 2025 06:10:09 +0000 (22:10 -0800)
committerNamhyung Kim <namhyung@kernel.org>
Mon, 24 Feb 2025 23:46:33 +0000 (15:46 -0800)
Switch memory_node__read and build_mem_topology from opendir/readdir
to io_dir__readdir, with smaller stack allocations. Reduces peak
memory consumption of perf record by 10kb.

Signed-off-by: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20250222061015.303622-5-irogers@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/util/header.c

index d06aa86352d3c131171e09c59b080447409fa87a..1900965f875279484d850111248cc2f0d02a1453 100644 (file)
@@ -44,6 +44,7 @@
 #include "build-id.h"
 #include "data.h"
 #include <api/fs/fs.h>
+#include <api/io_dir.h>
 #include "asm/bug.h"
 #include "tool.h"
 #include "time-utils.h"
@@ -1311,11 +1312,11 @@ static int memory_node__read(struct memory_node *n, unsigned long idx)
 {
        unsigned int phys, size = 0;
        char path[PATH_MAX];
-       struct dirent *ent;
-       DIR *dir;
+       struct io_dirent64 *ent;
+       struct io_dir dir;
 
 #define for_each_memory(mem, dir)                                      \
-       while ((ent = readdir(dir)))                                    \
+       while ((ent = io_dir__readdir(&dir)) != NULL)                   \
                if (strcmp(ent->d_name, ".") &&                         \
                    strcmp(ent->d_name, "..") &&                        \
                    sscanf(ent->d_name, "memory%u", &mem) == 1)
@@ -1324,9 +1325,9 @@ static int memory_node__read(struct memory_node *n, unsigned long idx)
                  "%s/devices/system/node/node%lu",
                  sysfs__mountpoint(), idx);
 
-       dir = opendir(path);
-       if (!dir) {
-               pr_warning("failed: can't open memory sysfs data\n");
+       io_dir__init(&dir, open(path, O_CLOEXEC | O_DIRECTORY | O_RDONLY));
+       if (dir.dirfd < 0) {
+               pr_warning("failed: can't open memory sysfs data '%s'\n", path);
                return -1;
        }
 
@@ -1338,20 +1339,20 @@ static int memory_node__read(struct memory_node *n, unsigned long idx)
 
        n->set = bitmap_zalloc(size);
        if (!n->set) {
-               closedir(dir);
+               close(dir.dirfd);
                return -ENOMEM;
        }
 
        n->node = idx;
        n->size = size;
 
-       rewinddir(dir);
+       io_dir__rewinddir(&dir);
 
        for_each_memory(phys, dir) {
                __set_bit(phys, n->set);
        }
 
-       closedir(dir);
+       close(dir.dirfd);
        return 0;
 }
 
@@ -1374,8 +1375,8 @@ static int memory_node__sort(const void *a, const void *b)
 static int build_mem_topology(struct memory_node **nodesp, u64 *cntp)
 {
        char path[PATH_MAX];
-       struct dirent *ent;
-       DIR *dir;
+       struct io_dirent64 *ent;
+       struct io_dir dir;
        int ret = 0;
        size_t cnt = 0, size = 0;
        struct memory_node *nodes = NULL;
@@ -1383,14 +1384,14 @@ static int build_mem_topology(struct memory_node **nodesp, u64 *cntp)
        scnprintf(path, PATH_MAX, "%s/devices/system/node/",
                  sysfs__mountpoint());
 
-       dir = opendir(path);
-       if (!dir) {
+       io_dir__init(&dir, open(path, O_CLOEXEC | O_DIRECTORY | O_RDONLY));
+       if (dir.dirfd < 0) {
                pr_debug2("%s: couldn't read %s, does this arch have topology information?\n",
                          __func__, path);
                return -1;
        }
 
-       while (!ret && (ent = readdir(dir))) {
+       while (!ret && (ent = io_dir__readdir(&dir))) {
                unsigned int idx;
                int r;
 
@@ -1419,7 +1420,7 @@ static int build_mem_topology(struct memory_node **nodesp, u64 *cntp)
                        cnt += 1;
        }
 out:
-       closedir(dir);
+       close(dir.dirfd);
        if (!ret) {
                *cntp = cnt;
                *nodesp = nodes;