Skip to content

Commit

Permalink
selftests/bpf: Add a new cgroup helper get_cgroup_hierarchy_id()
Browse files Browse the repository at this point in the history
A new cgroup helper function, get_cgroup1_hierarchy_id(), has been
introduced to obtain the ID of a cgroup1 hierarchy based on the provided
cgroup name. This cgroup name can be obtained from the /proc/self/cgroup
file.

Signed-off-by: Yafang Shao <[email protected]>
  • Loading branch information
laoar authored and d-e-s-o committed Nov 9, 2023
1 parent 567f6aa commit b1d13ff
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 0 deletions.
49 changes: 49 additions & 0 deletions tools/testing/selftests/bpf/cgroup_helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -637,3 +637,52 @@ unsigned long long get_classid_cgroup_id(void)
format_classid_path(cgroup_workdir);
return get_cgroup_id_from_path(cgroup_workdir);
}

/**
* get_cgroup1_hierarchy_id - Retrieves the ID of a cgroup1 hierarchy from the cgroup1 name
* @cgrp_name: The cgroup1 name, which can be retrieved from /proc/self/cgroup.
*/
int get_cgroup1_hierarchy_id(const char *cgrp_name)
{
char *c, *c2, *c3, *c4;
bool found = false;
char line[1024];
FILE *file;
int i, id;

if (!cgrp_name)
return -1;

file = fopen("/proc/self/cgroup", "r");
if (!file) {
log_err("fopen /proc/self/cgroup");
return -1;
}

while (fgets(line, 1024, file)) {
i = 0;
for (c = strtok_r(line, ":", &c2); c && i < 2; c = strtok_r(NULL, ":", &c2)) {
if (i == 0) {
id = strtol(c, NULL, 10);
} else if (i == 1) {
if (!strcmp(c, cgrp_name)) {
found = true;
break;
}

/* Multiple subsystems may share one single mount point */
for (c3 = strtok_r(c, ",", &c4); c3;
c3 = strtok_r(NULL, ",", &c4)) {
if (!strcmp(c, cgrp_name)) {
found = true;
break;
}
}
}
i++;
}
if (found)
break;
}
return found ? id : -1;
}
1 change: 1 addition & 0 deletions tools/testing/selftests/bpf/cgroup_helpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ int get_root_cgroup(void);
int create_and_get_cgroup(const char *relative_path);
void remove_cgroup(const char *relative_path);
unsigned long long get_cgroup_id(const char *relative_path);
int get_cgroup1_hierarchy_id(const char *cgrp_name);

int join_cgroup(const char *relative_path);
int join_root_cgroup(void);
Expand Down

0 comments on commit b1d13ff

Please sign in to comment.