lkml.org 
[lkml]   [2023]   [Oct]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v3 23/50] perf header: Switch mem topology to io_dir__readdir
    From
    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>
    ---
    tools/perf/util/header.c | 31 ++++++++++++++++---------------
    1 file changed, 16 insertions(+), 15 deletions(-)

    diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
    index e86b9439ffee..55f63d2ee232 100644
    --- a/tools/perf/util/header.c
    +++ b/tools/perf/util/header.c
    @@ -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"
    @@ -1341,11 +1342,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)
    @@ -1354,9 +1355,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;
    }

    @@ -1368,20 +1369,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;
    }

    @@ -1404,8 +1405,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;
    @@ -1413,14 +1414,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;

    @@ -1447,7 +1448,7 @@ static int build_mem_topology(struct memory_node **nodesp, u64 *cntp)
    ret = memory_node__read(&nodes[cnt++], idx);
    }
    out:
    - closedir(dir);
    + close(dir.dirfd);
    if (!ret) {
    *cntp = cnt;
    *nodesp = nodes;
    --
    2.42.0.758.gaed0368e0e-goog
    \
     
     \ /
      Last update: 2023-10-25 00:37    [W:4.893 / U:0.488 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site