mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-27 04:22:58 +00:00
perf header: Switch mem topology to io_dir__readdir
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>
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user