mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 17:43:52 +02:00
perf maps: Switch modules tree walk to io_dir__readdir
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>
This commit is contained in:
parent
d118b08f7e
commit
f7cada5f7e
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user