Add a function to convert from cgroup v2 cpu.weight to
cgroup v1.
Signed-off-by: Tom Hromatka <[email protected]>
---
src/abstraction-common.h | 3 +++
src/ctrl-cpu.c | 47 +++++++++++++++++++++++++++++++++++++++-
2 files changed, 49 insertions(+), 1 deletion(-)
diff --git a/src/abstraction-common.h b/src/abstraction-common.h
index 4b0f3e8e87e5..bb43d9cefb74 100644
--- a/src/abstraction-common.h
+++ b/src/abstraction-common.h
@@ -77,6 +77,9 @@ int cgroup_convert_cpu(struct cgroup_controller * const
out_cgc,
#ifdef UNIT_TEST
int v1_shares_to_v2(struct cgroup_controller * const dst_cgc,
const char * const shares_val);
+
+int v2_weight_to_v1(struct cgroup_controller * const dst_cgc,
+ const char * const weight_val);
#endif /* UNIT_TEST */
__END_DECLS
diff --git a/src/ctrl-cpu.c b/src/ctrl-cpu.c
index 2b59312bc6b7..78c7bf130638 100644
--- a/src/ctrl-cpu.c
+++ b/src/ctrl-cpu.c
@@ -74,6 +74,46 @@ out:
return ret;
}
+STATIC int v2_weight_to_v1(struct cgroup_controller * const dst_cgc,
+ const char * const weight_val)
+{
+#define SHARES_STR_LEN 20
+
+ long int shares;
+ char *shares_str = NULL;
+ int ret = 0;
+
+ if (!weight_val)
+ return ECGINVAL;
+
+ if (strlen(weight_val) > 0) {
+ ret = cgroup_strtol(weight_val, 10, &shares);
+ if (ret)
+ goto out;
+
+ /* now scale from cpu.shares to cpu.weight */
+ shares = shares * DEFAULT_SHARES_VALUE / DEFAULT_WEIGHT_VALUE;
+
+ shares_str = calloc(sizeof(char), SHARES_STR_LEN);
+ ret = snprintf(shares_str, SHARES_STR_LEN, "%ld\n", shares);
+ if (ret == SHARES_STR_LEN) {
+ /* we ran out of room in the string. throw an error */
+ cgroup_err("Error: shares too large for string: %d\n",
+ shares);
+ ret = ECGFAIL;
+ goto out;
+ }
+ }
+
+ ret = cgroup_add_value_string(dst_cgc, cpu_shares, shares_str);
+
+out:
+ if (shares_str)
+ free(shares_str);
+
+ return ret;
+}
+
static int v1_to_v2(struct cgroup_controller * const out_cgc,
const struct cgroup_controller * const in_cgc)
{
@@ -119,7 +159,12 @@ static int v2_to_v1(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_weight) == 0) {
+ ret = v2_weight_to_v1(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