tools/testing/selftests/bpf/prog_tests/cgroup_dev.c
Source file repositories/reference/linux-study-clean/tools/testing/selftests/bpf/prog_tests/cgroup_dev.c
File Facts
- System
- Linux kernel
- Corpus path
tools/testing/selftests/bpf/prog_tests/cgroup_dev.c- Extension
.c- Size
- 3090 bytes
- Lines
- 126
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
sys/stat.hsys/sysmacros.herrno.htest_progs.hcgroup_helpers.hdev_cgroup.skel.h
Detected Declarations
function test_mknodfunction test_readfunction test_writefunction test_cgroup_dev
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0
#include <sys/stat.h>
#include <sys/sysmacros.h>
#include <errno.h>
#include "test_progs.h"
#include "cgroup_helpers.h"
#include "dev_cgroup.skel.h"
#define TEST_CGROUP "/test-bpf-based-device-cgroup/"
#define TEST_BUFFER_SIZE 64
static void test_mknod(const char *path, mode_t mode, int dev_major,
int dev_minor, int expected_ret, int expected_errno)
{
int ret;
unlink(path);
ret = mknod(path, mode, makedev(dev_major, dev_minor));
ASSERT_EQ(ret, expected_ret, "mknod");
if (expected_ret)
ASSERT_EQ(errno, expected_errno, "mknod errno");
else
unlink(path);
}
static void test_read(const char *path, char *buf, int buf_size,
int expected_ret, int expected_errno)
{
int ret, fd;
fd = open(path, O_RDONLY);
/* A bare open on unauthorized device should fail */
if (expected_ret < 0) {
ASSERT_EQ(fd, expected_ret, "open ret for read");
ASSERT_EQ(errno, expected_errno, "open errno for read");
if (fd >= 0)
close(fd);
return;
}
if (!ASSERT_OK_FD(fd, "open ret for read"))
return;
ret = read(fd, buf, buf_size);
ASSERT_EQ(ret, expected_ret, "read");
close(fd);
}
static void test_write(const char *path, char *buf, int buf_size,
int expected_ret, int expected_errno)
{
int ret, fd;
fd = open(path, O_WRONLY);
/* A bare open on unauthorized device should fail */
if (expected_ret < 0) {
ASSERT_EQ(fd, expected_ret, "open ret for write");
ASSERT_EQ(errno, expected_errno, "open errno for write");
if (fd >= 0)
close(fd);
return;
}
if (!ASSERT_OK_FD(fd, "open ret for write"))
return;
ret = write(fd, buf, buf_size);
ASSERT_EQ(ret, expected_ret, "write");
close(fd);
}
void test_cgroup_dev(void)
{
char buf[TEST_BUFFER_SIZE] = "some random test data";
struct dev_cgroup *skel;
int cgroup_fd;
cgroup_fd = cgroup_setup_and_join(TEST_CGROUP);
if (!ASSERT_OK_FD(cgroup_fd, "cgroup switch"))
return;
skel = dev_cgroup__open_and_load();
if (!ASSERT_OK_PTR(skel, "load program"))
goto cleanup_cgroup;
Annotation
- Immediate include surface: `sys/stat.h`, `sys/sysmacros.h`, `errno.h`, `test_progs.h`, `cgroup_helpers.h`, `dev_cgroup.skel.h`.
- Detected declarations: `function test_mknod`, `function test_read`, `function test_write`, `function test_cgroup_dev`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.