lkml.org 
[lkml]   [2023]   [Nov]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v5 11/50] perf events: Remove scandir in thread synthesis
    From
    This avoids scanddir reading the directory into memory that's
    allocated and instead allocates on the stack.

    Signed-off-by: Ian Rogers <irogers@google.com>
    ---
    tools/perf/util/synthetic-events.c | 22 ++++++++++++----------
    1 file changed, 12 insertions(+), 10 deletions(-)

    diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic-events.c
    index a0579c7d7b9e..7cc38f2a0e9e 100644
    --- a/tools/perf/util/synthetic-events.c
    +++ b/tools/perf/util/synthetic-events.c
    @@ -38,6 +38,7 @@
    #include <uapi/linux/mman.h> /* To get things like MAP_HUGETLB even on older libc headers */
    #include <api/fs/fs.h>
    #include <api/io.h>
    +#include <api/io_dir.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    @@ -751,10 +752,10 @@ static int __event__synthesize_thread(union perf_event *comm_event,
    bool needs_mmap, bool mmap_data)
    {
    char filename[PATH_MAX];
    - struct dirent **dirent;
    + struct io_dir iod;
    + struct io_dirent64 *dent;
    pid_t tgid, ppid;
    int rc = 0;
    - int i, n;

    /* special case: only send one comm event using passed in pid */
    if (!full) {
    @@ -786,16 +787,19 @@ static int __event__synthesize_thread(union perf_event *comm_event,
    snprintf(filename, sizeof(filename), "%s/proc/%d/task",
    machine->root_dir, pid);

    - n = scandir(filename, &dirent, filter_task, NULL);
    - if (n < 0)
    - return n;
    + io_dir__init(&iod, open(filename, O_CLOEXEC | O_DIRECTORY | O_RDONLY));
    + if (iod.dirfd < 0)
    + return -1;

    - for (i = 0; i < n; i++) {
    + while ((dent = io_dir__readdir(&iod)) != NULL) {
    char *end;
    pid_t _pid;
    bool kernel_thread = false;

    - _pid = strtol(dirent[i]->d_name, &end, 10);
    + if (!isdigit(dent->d_name[0]))
    + continue;
    +
    + _pid = strtol(dent->d_name, &end, 10);
    if (*end)
    continue;

    @@ -829,9 +833,7 @@ static int __event__synthesize_thread(union perf_event *comm_event,
    }
    }

    - for (i = 0; i < n; i++)
    - zfree(&dirent[i]);
    - free(dirent);
    + close(iod.dirfd);

    return rc;
    }
    --
    2.43.0.rc1.413.gea7ed67945-goog
    \
     
     \ /
      Last update: 2023-11-27 23:11    [W:4.295 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site