Add a function to convert from cgroup v1 cpu.shares to
cgroup v2.
Signed-off-by: Tom Hromatka <[email protected]>
---
src/abstraction-common.h | 10 ++++++++
src/ctrl-cpu.c | 52 +++++++++++++++++++++++++++++++++++++++-
2 files changed, 61 insertions(+), 1 deletion(-)
diff --git a/src/abstraction-common.h b/src/abstraction-common.h
index 054c4bea61b1..4b0f3e8e87e5 100644
--- a/src/abstraction-common.h
+++ b/src/abstraction-common.h
@@ -69,6 +69,16 @@ int cgroup_convert_cgroup(struct cgroup * const out_cgroup,
int cgroup_convert_cpu(struct cgroup_controller * const out_cgc,
const struct cgroup_controller * const in_cgc);
+/**
+ * Functions that are defined as STATIC can be placed within the UNIT_TEST
+ * ifdef. This will allow them to be included in the unit tests while
+ * remaining static in a normal libcgroup library build.
+ */
+#ifdef UNIT_TEST
+int v1_shares_to_v2(struct cgroup_controller * const dst_cgc,
+ const char * const shares_val);
+#endif /* UNIT_TEST */
+
__END_DECLS
#endif /* __ABSTRACTION_COMMON */
diff --git a/src/ctrl-cpu.c b/src/ctrl-cpu.c
index 2fab490c7b21..2b59312bc6b7 100644
--- a/src/ctrl-cpu.c
+++ b/src/ctrl-cpu.c
@@ -28,6 +28,52 @@
#include "abstraction-common.h"
+#define DEFAULT_SHARES_VALUE 1024
+#define DEFAULT_WEIGHT_VALUE 100
+
+static const char * const cpu_shares = "cpu.shares";
+static const char * const cpu_weight = "cpu.weight";
+
+STATIC int v1_shares_to_v2(struct cgroup_controller * const dst_cgc,
+ const char * const shares_val)
+{
+#define WEIGHT_STR_LEN 20
+
+ long int weight;
+ char *weight_str = NULL;
+ int ret = 0;
+
+ if (!shares_val)
+ return ECGINVAL;
+
+ if (strlen(shares_val) > 0) {
+ ret = cgroup_strtol(shares_val, 10, &weight);
+ if (ret)
+ goto out;
+
+ /* now scale from cpu.shares to cpu.weight */
+ weight = weight * DEFAULT_WEIGHT_VALUE / DEFAULT_SHARES_VALUE;
+
+ weight_str = calloc(sizeof(char), WEIGHT_STR_LEN);
+ ret = snprintf(weight_str, WEIGHT_STR_LEN, "%ld\n", weight);
+ if (ret == WEIGHT_STR_LEN) {
+ /* we ran out of room in the string. throw an error */
+ cgroup_err("Error: weight too large for string: %d\n",
+ weight);
+ ret = ECGFAIL;
+ goto out;
+ }
+ }
+
+ ret = cgroup_add_value_string(dst_cgc, cpu_weight, weight_str);
+
+out:
+ if (weight_str)
+ free(weight_str);
+
+ return ret;
+}
+
static int v1_to_v2(struct cgroup_controller * const out_cgc,
const struct cgroup_controller * const in_cgc)
{
@@ -43,7 +89,11 @@ static int v1_to_v2(struct cgroup_controller * const out_cgc,
* the case, we can make this function smarter.
*/
for (i = 0; i < in_cgc->index; i++) {
- /* todo - add conversions here */
+ if (strcmp(in_cgc->values[i]->name, cpu_shares) == 0)
+ ret = v1_shares_to_v2(out_cgc,
+ in_cgc->values[i]->value);
+ if (ret)
+ goto out;
}
if (out_cgc->index == 0)
--
2.26.2
_______________________________________________
Libcg-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel