Re: [PATCH bpf-next v3 3/4] selftests/bpf: Add read_cgroup_file() to cgroup_helpers

"Emil Tsalapatis" <[email protected]>
Newsgroups dev.linux.lists.linux-rt-devel,org.kernel.vger.bpf,org.kernel.vger.linux-kernel,org.kernel.vger.linux-kselftest
Message-ID <[email protected]>
On Sat Aug 8, 2026 at 10:05 AM EDT, Jiayuan Chen wrote:
> cgroup_helpers has write_cgroup_file()/write_cgroup_file_parent() but no
> read counterpart. Add read_cgroup_file() and read_cgroup_file_parent() so
> a forked child can read a cgroup file (e.g. memory.current) from the work
> dir owned by the parent that set the environment up, without hand-building
> the /mnt/... path.
>
> Signed-off-by: Jiayuan Chen <[email protected]>

Reviewed-by: Emil Tsalapatis <[email protected]>

The "- 24" is questionable, but it's already all over the file. We can
clean it up separately.

> ---
>  tools/testing/selftests/bpf/cgroup_helpers.c | 67 ++++++++++++++++++++
>  tools/testing/selftests/bpf/cgroup_helpers.h |  4 ++
>  2 files changed, 71 insertions(+)
>
> diff --git a/tools/testing/selftests/bpf/cgroup_helpers.c b/tools/testing/selftests/bpf/cgroup_helpers.c
> index 45cd0b479fe3..4183ff6150c2 100644
> --- a/tools/testing/selftests/bpf/cgroup_helpers.c
> +++ b/tools/testing/selftests/bpf/cgroup_helpers.c
> @@ -188,6 +188,73 @@ int write_cgroup_file_parent(const char *relative_path, const char *file,
>  	return __write_cgroup_file(cgroup_path, file, buf);
>  }
>  
> +static int __read_cgroup_file(const char *cgroup_path, const char *file,
> +			      char *buf, size_t len)
> +{
> +	char file_path[PATH_MAX + 1];
> +	ssize_t got;
> +	int fd;
> +
> +	snprintf(file_path, sizeof(file_path), "%s/%s", cgroup_path, file);
> +	fd = open(file_path, O_RDONLY);
> +	if (fd < 0) {
> +		log_err("Opening %s", file_path);
> +		return 1;
> +	}
> +
> +	got = read(fd, buf, len - 1);
> +	if (got < 0) {
> +		log_err("Reading %s", file_path);
> +		close(fd);
> +		return 1;
> +	}
> +	buf[got] = '\0';
> +	close(fd);
> +	return 0;
> +}
> +
> +/**
> + * read_cgroup_file() - Read from a cgroup file
> + * @relative_path: The cgroup path, relative to the workdir
> + * @file: The name of the file in cgroupfs to read from
> + * @buf: Buffer to read into, NUL-terminated on success
> + * @len: Size of @buf
> + *
> + * Read from a file in the given cgroup's directory.
> + *
> + * If successful, 0 is returned.
> + */
> +int read_cgroup_file(const char *relative_path, const char *file,
> +		     char *buf, size_t len)
> +{
> +	char cgroup_path[PATH_MAX - 24];
> +
> +	format_cgroup_path(cgroup_path, relative_path);
> +	return __read_cgroup_file(cgroup_path, file, buf, len);
> +}
> +
> +/**
> + * read_cgroup_file_parent() - Read from a cgroup file in the parent process
> + *                             workdir
> + * @relative_path: The cgroup path, relative to the parent process workdir
> + * @file: The name of the file in cgroupfs to read from
> + * @buf: Buffer to read into, NUL-terminated on success
> + * @len: Size of @buf
> + *
> + * Read from a file in the given cgroup's directory under the parent process
> + * workdir.
> + *
> + * If successful, 0 is returned.
> + */
> +int read_cgroup_file_parent(const char *relative_path, const char *file,
> +			    char *buf, size_t len)
> +{
> +	char cgroup_path[PATH_MAX - 24];
> +
> +	format_parent_cgroup_path(cgroup_path, relative_path);
> +	return __read_cgroup_file(cgroup_path, file, buf, len);
> +}
> +
>  /**
>   * setup_cgroup_environment() - Setup the cgroup environment
>   *
> diff --git a/tools/testing/selftests/bpf/cgroup_helpers.h b/tools/testing/selftests/bpf/cgroup_helpers.h
> index 3857304be874..d42d2e13044e 100644
> --- a/tools/testing/selftests/bpf/cgroup_helpers.h
> +++ b/tools/testing/selftests/bpf/cgroup_helpers.h
> @@ -15,6 +15,10 @@ int write_cgroup_file(const char *relative_path, const char *file,
>  		      const char *buf);
>  int write_cgroup_file_parent(const char *relative_path, const char *file,
>  			     const char *buf);
> +int read_cgroup_file(const char *relative_path, const char *file,
> +		     char *buf, size_t len);
> +int read_cgroup_file_parent(const char *relative_path, const char *file,
> +			    char *buf, size_t len);
>  int cgroup_setup_and_join(const char *relative_path);
>  int get_root_cgroup(void);
>  int create_and_get_cgroup(const char *relative_path);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.