• Namhyung Kim's avatar
    perf pmu: Use relative path for sysfs scan · e293a5e8
    Namhyung Kim authored
    The PMU information is in the kernel sysfs so it needs to scan the
    directory to get the whole information like event aliases, formats and
    so on.  During the traversal, it opens a lot of files and directories
    like below:
    
      dir = opendir("/sys/bus/event_source/devices");
      while (dentry = readdir(dir)) {
        char buf[PATH_MAX];
    
        snprintf(buf, sizeof(buf), "%s/%s",
                 "/sys/bus/event_source/devices", dentry->d_name);
        fd = open(buf, O_RDONLY);
        ...
      }
    
    But this is not good since it needs to copy the string to build the
    absolute pathname, and it makes redundant pathname walk (from the /sys)
    unnecessarily.  We can use openat(2) to open the file in the given
    directory.  While it's not a problem ususally, it can be a problem when
    the kernel has contentions on the sysfs.
    
    Add a couple of new helper to return the file descriptor of PMU
    directory so that it can use it with relative paths.
    
     * perf_pmu__event_source_devices_fd()
       - returns a fd for the PMU root ("/sys/bus/event_source/devices")
    
     * perf_pmu__pathname_fd()
       - returns a fd for "<pmu>/<file>" under the PMU root
    
    Now the above code can be converted something like below:
    
      dirfd = perf_pmu__event_source_devices_fd();
      dir = fdopendir(dirfd);
      while (dentry = readdir(dir)) {
        fd = openat(dirfd, dentry->d_name, O_RDONLY);
        ...
      }
    Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Acked-by: default avatarIan Rogers <irogers@google.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Kan Liang <kan.liang@linux.intel.com>
    Cc: Leo Yan <leo.yan@linaro.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: https://lore.kernel.org/r/20230331202949.810326-2-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    e293a5e8
pmu.c 4.07 KB