libcgroup-internal.h libcgroup.map wrapper.c log.c \
abstraction-common.c abstraction-common.h \
abstraction-map.c abstraction-map.h \
- abstraction-cpu.c
+ abstraction-cpu.c abstraction-cpuset.c
libcgroup_la_LIBADD = -lpthread $(CODE_COVERAGE_LIBS)
libcgroup_la_CFLAGS = $(CODE_COVERAGE_CFLAGS) -DSTATIC=static
libcgroup_la_LDFLAGS = -Wl,--version-script,$(srcdir)/libcgroup.map \
const char * const out_setting,
void *in_dflt, void *out_dflt);
+/* cpuset */
+int cgroup_convert_cpuset_to_exclusive(
+ struct cgroup_controller * const dst_cgc,
+ const char * const in_value,
+ const char * const out_setting,
+ void *in_dflt, void *out_dflt);
+
+int cgroup_convert_cpuset_to_partition(
+ struct cgroup_controller * const dst_cgc,
+ const char * const in_value,
+ const char * const out_setting,
+ void *in_dflt, void *out_dflt);
+
+
#ifdef __cplusplus
} /* extern "C" */
#endif
--- /dev/null
+/**
+ * Libcgroup abstraction layer for the cpuset controller
+ *
+ * Copyright (c) 2021-2022 Oracle and/or its affiliates.
+ * Author: Tom Hromatka <tom.hromatka@oracle.com>
+ */
+
+/*
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of version 2.1 of the GNU Lesser General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#include <libcgroup.h>
+#include <libcgroup-internal.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "abstraction-common.h"
+
+static const char * const MEMBER = "member";
+static const char * const ROOT = "root";
+
+int cgroup_convert_cpuset_to_exclusive(
+ struct cgroup_controller * const dst_cgc,
+ const char * const in_value,
+ const char * const out_setting,
+ void *in_dflt, void *out_dflt)
+{
+ int ret;
+
+ if (strcmp(in_value, ROOT) == 0)
+ ret = cgroup_add_value_string(dst_cgc, out_setting, "1");
+ else
+ ret = cgroup_add_value_string(dst_cgc, out_setting, "0");
+
+ return ret;
+}
+
+int cgroup_convert_cpuset_to_partition(
+ struct cgroup_controller * const dst_cgc,
+ const char * const in_value,
+ const char * const out_setting,
+ void *in_dflt, void *out_dflt)
+{
+ int ret;
+
+ if (strcmp(in_value, "1") == 0)
+ ret = cgroup_add_value_string(dst_cgc, out_setting, ROOT);
+ else
+ ret = cgroup_add_value_string(dst_cgc, out_setting, MEMBER);
+
+ return ret;
+}
"cpuset.mems.effective", NULL},
{cgroup_convert_passthrough, "cpuset.cpus", NULL, "cpuset.cpus", NULL},
{cgroup_convert_passthrough, "cpuset.mems", NULL, "cpuset.mems", NULL},
+ {cgroup_convert_cpuset_to_partition, "cpuset.cpu_exclusive", NULL,
+ "cpuset.cpus.partition", NULL},
};
const int cgroup_v1_to_v2_map_sz = sizeof(cgroup_v1_to_v2_map) /
sizeof(cgroup_v1_to_v2_map[0]);
"cpuset.effective_mems", NULL},
{cgroup_convert_passthrough, "cpuset.cpus", NULL, "cpuset.cpus", NULL},
{cgroup_convert_passthrough, "cpuset.mems", NULL, "cpuset.mems", NULL},
+ {cgroup_convert_cpuset_to_exclusive, "cpuset.cpus.partition", NULL,
+ "cpuset.cpu_exclusive", NULL},
};
const int cgroup_v2_to_v1_map_sz = sizeof(cgroup_v2_to_v1_map) /
sizeof(cgroup_v2_to_v1_map[0]);