tools/testing/selftests/cgroup/lib/cgroup_util.c

Source file repositories/reference/linux-study-clean/tools/testing/selftests/cgroup/lib/cgroup_util.c

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/cgroup/lib/cgroup_util.c
Extension
.c
Size
12704 bytes
Lines
680
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.

Dependency Surface

Detected Declarations

Annotated Snippet

if (strcmp(type, "cgroup") == 0) {
			if (!controller || !strstr(options, controller))
				continue;
		} else if (strcmp(type, "cgroup2") == 0) {
			if (controller &&
					cg_read_strstr(mount, "cgroup.controllers", controller))
				continue;
		} else {
			continue;
		}
		strncpy(root, mount, len);

		if (nsdelegate)
			*nsdelegate = !!strstr(options, "nsdelegate");
		return 0;

	}

	return -1;
}

int cg_find_controller_root(char *root, size_t len, const char *controller)
{
	return cg_find_root(root, len, controller, NULL);
}

int cg_find_unified_root(char *root, size_t len, bool *nsdelegate)
{
	return cg_find_root(root, len, NULL, nsdelegate);
}

int cg_create(const char *cgroup)
{
	return mkdir(cgroup, 0755);
}

int cg_wait_for_proc_count(const char *cgroup, int count)
{
	char buf[10 * BUF_SIZE] = {0};
	int attempts;
	char *ptr;

	for (attempts = 10; attempts >= 0; attempts--) {
		int nr = 0;

		if (cg_read(cgroup, "cgroup.procs", buf, sizeof(buf)))
			break;

		for (ptr = buf; *ptr; ptr++)
			if (*ptr == '\n')
				nr++;

		if (nr >= count)
			return 0;

		usleep(100000);
	}

	return -1;
}

int cg_killall(const char *cgroup)
{
	char buf[BUF_SIZE];
	char *ptr = buf;

	/* If cgroup.kill exists use it. */
	if (!cg_write(cgroup, "cgroup.kill", "1"))
		return 0;

	if (cg_read(cgroup, "cgroup.procs", buf, sizeof(buf)))
		return -1;

	while (ptr < buf + sizeof(buf)) {
		int pid = strtol(ptr, &ptr, 10);

		if (pid == 0)
			break;
		if (*ptr)
			ptr++;
		else
			break;
		if (kill(pid, SIGKILL))
			return -1;
	}

	return 0;
}

int cg_destroy(const char *cgroup)

Annotation

Implementation Notes