diff --git a/adaptived/doc/internal/list-of-built-in-effects.md b/adaptived/doc/internal/list-of-built-in-effects.md index 2147cdb..a8fe1db 100644 --- a/adaptived/doc/internal/list-of-built-in-effects.md +++ b/adaptived/doc/internal/list-of-built-in-effects.md @@ -14,6 +14,7 @@ Parameters that accept long long or float also support some human-readable forma | [logger](../../src/effects/logger.c) | Given an array of files, write their contents to "logfile" | | [ftest 043](../../tests/ftests/043-effect-logger-no-separators.json)
[ftest 044](../../tests/ftests/044-effect-logger-date-format.json) | | | [print](../../src/effects/print.c) | Print a message to a file | | [Jimmy Buffett Example](../examples/jimmy-buffett-config.json) | | | [print_schedstat](../../src/effects/print_schedstat.c) | Print schedstat to a file | | [ftest 054](../../tests/ftests/054-effect-print_schedstat.json) | | +| [sd_bus_setting](../../src/effects/sd_bus_setting.c) | Operate on sd_bus properties | | [ftest 1000](../../tests/ftests/1000-sudo-effect-sd_bus_setting_set_int.json)
[ftest 1001](../../tests/ftests/1001-sudo-effect-sd_bus_setting_add_int.json)
[ftest 1002](../../tests/ftests/1002-sudo-effect-sd_bus_setting_sub_int.json)
[ftest 1003](../../tests/ftests/1003-sudo-effect-sd_bus_setting-CPUQuota.json)
[ftest 1004](../../tests/ftests/1004-sudo-effect-sd_bus_setting_add_int_infinity.json)
[ftest 1005](../../tests/ftests/1005-sudo-effect-sd_bus_setting_sub_infinity.json)
[ftest 1006](../../tests/ftests/1006-sudo-effect-sd_bus_setting_set_int_scope.json)
[ftest 1007](../../tests/ftests/1007-sudo-effect-sd_bus_setting_set_str.json) | | | [setting](../../src/effects/cgroup_setting.c) | Write to a setting file | | [ftest 055](../../tests/ftests/055-effect-setting_set_int.json)
[ftest 056](../../tests/ftests/056-effect-setting_add_int.json)
[ftest 057](../../tests/ftests/057-effect-setting_sub_int.json) | Shares a code base with the cgroup effect code | | [signal](../../src/effects/kill_processes.c) | Send a signal to the process(es) that match the user-specified process name(s) | | [ftest_069](../../tests/ftests/069-effect-signal.json) | | | [snooze](../../src/effects/snooze.c) | Once the cause(s) in a rule have triggered, snooze (i.e. ignore any more triggers) for a specified duration | | [ftest 010](../../tests/ftests/010-snooze_effect.json) | | diff --git a/adaptived/include/adaptived-utils.h b/adaptived/include/adaptived-utils.h index 1a23779..8ca3678 100644 --- a/adaptived/include/adaptived-utils.h +++ b/adaptived/include/adaptived-utils.h @@ -263,6 +263,7 @@ int adaptived_farray_linear_regression(float * const array, int array_len, int i int interp_x, float * const interp_y); #define ADAPTIVED_CGROUP_FLAGS_VALIDATE 0x1 +#define ADAPTIVED_CGROUP_FLAGS_RUNTIME 0x2 /* systemctl --runtime: make changes only temporarily */ /** * Write a long long value to a cgroup setting diff --git a/adaptived/src/effects/sd_bus_setting.c b/adaptived/src/effects/sd_bus_setting.c index ebad5ec..f4ff0a9 100644 --- a/adaptived/src/effects/sd_bus_setting.c +++ b/adaptived/src/effects/sd_bus_setting.c @@ -46,6 +46,7 @@ struct cg_opts { enum effect_op_enum op; + bool runtime; bool limit_provided; struct adaptived_cgroup_value limit; /* optional */ bool validate; @@ -69,6 +70,7 @@ int sd_bus_setting_init(struct adaptived_effect * const eff, struct json_object opts->value.type = ADAPTIVED_CGVAL_CNT; opts->limit.type = ADAPTIVED_CGVAL_CNT; opts->limit_provided = false; + opts->runtime = false; ret = adaptived_parse_string(args_obj, "target", &target_str); if (ret) @@ -152,6 +154,15 @@ int sd_bus_setting_init(struct adaptived_effect * const eff, struct json_object } } + ret = adaptived_parse_bool(args_obj, "runtime", &opts->runtime); + if (ret == -ENOENT) { + opts->runtime = false; + ret = 0; + } else if (ret) { + adaptived_err("Failed to parse the sd_bus_setting runtime arg: %d\n", ret); + goto error; + } + ret = adaptived_parse_bool(args_obj, "validate", &opts->validate); if (ret == -ENOENT) { opts->validate = false; @@ -212,6 +223,9 @@ static int add(const struct cg_opts * const opts, struct adaptived_cgroup_value if (opts->validate) cgflags |= ADAPTIVED_CGROUP_FLAGS_VALIDATE; + if (opts->runtime) + cgflags |= ADAPTIVED_CGROUP_FLAGS_RUNTIME; + ret = adaptived_sd_bus_set_ll(opts->target, opts->setting, sum, cgflags); if (ret) return ret; @@ -244,6 +258,9 @@ static int subtract(const struct cg_opts * const opts, struct adaptived_cgroup_v if (opts->validate) cgflags |= ADAPTIVED_CGROUP_FLAGS_VALIDATE; + if (opts->runtime) + cgflags |= ADAPTIVED_CGROUP_FLAGS_RUNTIME; + ret = adaptived_sd_bus_set_ll(opts->target, opts->setting, diff, cgflags); if (ret) return ret; @@ -292,6 +309,8 @@ static int _sd_bus_setting_main(struct adaptived_effect * const eff) case EOP_SET: if (opts->validate) cgflags |= ADAPTIVED_CGROUP_FLAGS_VALIDATE; + if (opts->runtime) + cgflags |= ADAPTIVED_CGROUP_FLAGS_RUNTIME; ret = adaptived_sd_bus_set_value(opts->target, opts->setting, &opts->value, cgflags); if (ret) @@ -318,6 +337,9 @@ int sd_bus_setting_main(struct adaptived_effect * const eff) if (ret) return ret; + if (opts->runtime) + cgflags |= ADAPTIVED_CGROUP_FLAGS_RUNTIME; + ret = adaptived_sd_bus_set_ll(opts->target, opts->setting, ll_value, cgflags); if (ret) return ret; @@ -332,8 +354,14 @@ int sd_bus_setting_main(struct adaptived_effect * const eff) ret = adaptived_get_meminfo_field(PROC_MEMINFO, "MemTotal", &ll_value); if (ret) return ret; + + cgflags = ADAPTIVED_CGROUP_FLAGS_VALIDATE; + + if (opts->runtime) + cgflags |= ADAPTIVED_CGROUP_FLAGS_RUNTIME; + ret = adaptived_sd_bus_set_ll(opts->target, opts->setting, ll_value, - ADAPTIVED_CGROUP_FLAGS_VALIDATE); + cgflags); if (ret) return ret; adaptived_dbg("%s: %s at max. Changed to %lld\n", __func__, opts->setting, ll_value); diff --git a/adaptived/src/parse.c b/adaptived/src/parse.c index d81aa91..94591e1 100644 --- a/adaptived/src/parse.c +++ b/adaptived/src/parse.c @@ -624,6 +624,8 @@ static int parse_json(struct adaptived_ctx * const ctx, const char * const buf) obj = json_tokener_parse_verbose(buf, &err); if (!obj || err) { + if (err) + adaptived_err("%s: %s\n", __func__, json_tokener_error_desc(err)); ret = -EINVAL; goto out; } diff --git a/adaptived/src/utils/sd_bus_utils.c b/adaptived/src/utils/sd_bus_utils.c index 1896ff5..f2a6405 100644 --- a/adaptived/src/utils/sd_bus_utils.c +++ b/adaptived/src/utils/sd_bus_utils.c @@ -234,7 +234,7 @@ static int property_assignment(sd_bus_message *m, cgroupType t, const char *prop } static int set_property(const char *name, const char *property, - const struct adaptived_cgroup_value * const value) + const struct adaptived_cgroup_value * const value, bool arg_runtime) { sd_bus_error error = SD_BUS_ERROR_NULL; sd_bus_message *m = NULL; @@ -242,7 +242,7 @@ static int set_property(const char *name, const char *property, int r; cgroupType t; - adaptived_dbg("set_property: name=%s, property=%s\n", name, property); + adaptived_dbg("set_property: name=%s, property=%s, arg_runtime=%d\n", name, property, arg_runtime); r = sd_bus_default_system(&bus); if (r < 0) { @@ -264,7 +264,7 @@ static int set_property(const char *name, const char *property, return t; } - r = sd_bus_message_append(m, "sb", name, false); + r = sd_bus_message_append(m, "sb", name, arg_runtime); if (r < 0) { adaptived_err("set_property: sd_bus_message_append() failed, r=%d\n", r); return r; @@ -359,6 +359,7 @@ API int adaptived_sd_bus_set_ll(const char * const target, const char * const pr { struct adaptived_cgroup_value val; int ret = 0; + bool arg_runtime = false; if (!target || !property) return -EINVAL; @@ -368,7 +369,10 @@ API int adaptived_sd_bus_set_ll(const char * const target, const char * const pr val.type = ADAPTIVED_CGVAL_LONG_LONG; val.value.ll_value = value; - ret = set_property(target, property, &val); + if (flags & ADAPTIVED_CGROUP_FLAGS_RUNTIME) + arg_runtime = true; + + ret = set_property(target, property, &val, arg_runtime); if (ret < 0) return ret; @@ -395,6 +399,7 @@ API int adaptived_sd_bus_set_str(const char * const target, const char * const p { struct adaptived_cgroup_value val; int ret = 0; + bool arg_runtime = false; if (!target || !property || !value) return -EINVAL; @@ -404,7 +409,10 @@ API int adaptived_sd_bus_set_str(const char * const target, const char * const p val.type = ADAPTIVED_CGVAL_STR; val.value.str_value = (char *)value; - ret = set_property(target, property, &val); + if (flags & ADAPTIVED_CGROUP_FLAGS_RUNTIME) + arg_runtime = true; + + ret = set_property(target, property, &val, arg_runtime); if (ret < 0) return ret; diff --git a/adaptived/tests/ftests/1000-sudo-effect-sd_bus_setting_set_int.c b/adaptived/tests/ftests/1000-sudo-effect-sd_bus_setting_set_int.c index 35f9b8d..8c44956 100644 --- a/adaptived/tests/ftests/1000-sudo-effect-sd_bus_setting_set_int.c +++ b/adaptived/tests/ftests/1000-sudo-effect-sd_bus_setting_set_int.c @@ -67,11 +67,7 @@ int main(int argc, char *argv[]) ret = adaptived_set_attr(ctx, ADAPTIVED_ATTR_LOG_LEVEL, LOG_DEBUG); if (ret) goto err; - ret = start_slice(cgroup_slice_name, "cat"); - if (ret) { - adaptived_err("Failed to create slice: %s, ret=%d\n", cgroup_slice_name, ret); - goto err; - } + ret = adaptived_loop(ctx, true); if (ret != EXPECTED_RET) goto err; diff --git a/adaptived/tests/ftests/1000-sudo-effect-sd_bus_setting_set_int.json b/adaptived/tests/ftests/1000-sudo-effect-sd_bus_setting_set_int.json index 1cd2192..71f8836 100644 --- a/adaptived/tests/ftests/1000-sudo-effect-sd_bus_setting_set_int.json +++ b/adaptived/tests/ftests/1000-sudo-effect-sd_bus_setting_set_int.json @@ -17,7 +17,8 @@ "setting": "MemoryMax", "value": 89997312, "operator": "set", - "validate": true + "validate": true, + "runtime": true } } ] diff --git a/adaptived/tests/ftests/1001-sudo-effect-sd_bus_setting_add_int.c b/adaptived/tests/ftests/1001-sudo-effect-sd_bus_setting_add_int.c index 633300c..f9a26b3 100644 --- a/adaptived/tests/ftests/1001-sudo-effect-sd_bus_setting_add_int.c +++ b/adaptived/tests/ftests/1001-sudo-effect-sd_bus_setting_add_int.c @@ -67,11 +67,7 @@ int main(int argc, char *argv[]) ret = adaptived_set_attr(ctx, ADAPTIVED_ATTR_LOG_LEVEL, LOG_DEBUG); if (ret) goto err; - ret = start_slice(cgroup_slice_name, "cat"); - if (ret) { - adaptived_err("Failed to create slice: %s, ret=%d\n", cgroup_slice_name, ret); - goto err; - } + ret = adaptived_loop(ctx, true); if (ret != EXPECTED_RET) goto err; diff --git a/adaptived/tests/ftests/1001-sudo-effect-sd_bus_setting_add_int.json b/adaptived/tests/ftests/1001-sudo-effect-sd_bus_setting_add_int.json index 3e013c6..6051a4a 100644 --- a/adaptived/tests/ftests/1001-sudo-effect-sd_bus_setting_add_int.json +++ b/adaptived/tests/ftests/1001-sudo-effect-sd_bus_setting_add_int.json @@ -16,7 +16,8 @@ "target": "sudo1001.slice", "setting": "MemoryMax", "value": 89997312, - "operator": "set" + "operator": "set", + "runtime": true } }, { @@ -26,7 +27,8 @@ "setting": "MemoryMax", "value": 4096, "operator": "add", - "validate": true + "validate": true, + "runtime": true } } ] diff --git a/adaptived/tests/ftests/1002-sudo-effect-sd_bus_setting_sub_int.c b/adaptived/tests/ftests/1002-sudo-effect-sd_bus_setting_sub_int.c index ff79f1f..0f34a12 100644 --- a/adaptived/tests/ftests/1002-sudo-effect-sd_bus_setting_sub_int.c +++ b/adaptived/tests/ftests/1002-sudo-effect-sd_bus_setting_sub_int.c @@ -67,11 +67,7 @@ int main(int argc, char *argv[]) ret = adaptived_set_attr(ctx, ADAPTIVED_ATTR_LOG_LEVEL, LOG_DEBUG); if (ret) goto err; - ret = start_slice(cgroup_slice_name, "cat"); - if (ret) { - adaptived_err("Failed to create slice: %s, ret=%d\n", cgroup_slice_name, ret); - goto err; - } + ret = adaptived_loop(ctx, true); if (ret != EXPECTED_RET) goto err; diff --git a/adaptived/tests/ftests/1002-sudo-effect-sd_bus_setting_sub_int.json b/adaptived/tests/ftests/1002-sudo-effect-sd_bus_setting_sub_int.json index 2f7bf05..48dad0b 100644 --- a/adaptived/tests/ftests/1002-sudo-effect-sd_bus_setting_sub_int.json +++ b/adaptived/tests/ftests/1002-sudo-effect-sd_bus_setting_sub_int.json @@ -16,7 +16,8 @@ "target": "sudo1002.slice", "setting": "MemoryMax", "value": 89997312, - "operator": "set" + "operator": "set", + "runtime": true } }, { @@ -26,7 +27,8 @@ "setting": "MemoryMax", "value": 4096, "operator": "subtract", - "validate": true + "validate": true, + "runtime": true } } ] diff --git a/adaptived/tests/ftests/1003-sudo-effect-sd_bus_setting-CPUQuota.c b/adaptived/tests/ftests/1003-sudo-effect-sd_bus_setting-CPUQuota.c index fa8ef1e..12296e0 100644 --- a/adaptived/tests/ftests/1003-sudo-effect-sd_bus_setting-CPUQuota.c +++ b/adaptived/tests/ftests/1003-sudo-effect-sd_bus_setting-CPUQuota.c @@ -73,11 +73,7 @@ int main(int argc, char *argv[]) ret = adaptived_set_attr(ctx, ADAPTIVED_ATTR_LOG_LEVEL, LOG_DEBUG); if (ret) goto err; - ret = start_slice(cgroup_slice_name, "cat"); - if (ret) { - adaptived_err("Failed to create slice: %s, ret=%d\n", cgroup_slice_name, ret); - goto err; - } + ret = adaptived_loop(ctx, true); if (ret != EXPECTED_RET) goto err; diff --git a/adaptived/tests/ftests/1003-sudo-effect-sd_bus_setting-CPUQuota.json b/adaptived/tests/ftests/1003-sudo-effect-sd_bus_setting-CPUQuota.json index c85c97a..6557b4c 100644 --- a/adaptived/tests/ftests/1003-sudo-effect-sd_bus_setting-CPUQuota.json +++ b/adaptived/tests/ftests/1003-sudo-effect-sd_bus_setting-CPUQuota.json @@ -16,7 +16,8 @@ "target": "sudo1003.slice", "setting": "CPUQuotaPeriodSec", "value": "1s", - "operator": "set" + "operator": "set", + "runtime": true } }, { @@ -25,7 +26,8 @@ "target": "sudo1003.slice", "setting": "CPUQuota", "value": "44%", - "operator": "set" + "operator": "set", + "runtime": true } } ] diff --git a/adaptived/tests/ftests/1004-sudo-effect-sd_bus_setting_add_int_infinity.c b/adaptived/tests/ftests/1004-sudo-effect-sd_bus_setting_add_int_infinity.c index 811a4a0..a32ced1 100644 --- a/adaptived/tests/ftests/1004-sudo-effect-sd_bus_setting_add_int_infinity.c +++ b/adaptived/tests/ftests/1004-sudo-effect-sd_bus_setting_add_int_infinity.c @@ -68,11 +68,7 @@ int main(int argc, char *argv[]) ret = adaptived_set_attr(ctx, ADAPTIVED_ATTR_LOG_LEVEL, LOG_DEBUG); if (ret) goto err; - ret = start_slice(cgroup_slice_name, "cat"); - if (ret) { - adaptived_err("Failed to create slice: %s, ret=%d\n", cgroup_slice_name, ret); - goto err; - } + ret = adaptived_loop(ctx, true); if (ret != EXPECTED_RET) goto err; diff --git a/adaptived/tests/ftests/1004-sudo-effect-sd_bus_setting_add_int_infinity.json b/adaptived/tests/ftests/1004-sudo-effect-sd_bus_setting_add_int_infinity.json index 6b03ef5..f140702 100644 --- a/adaptived/tests/ftests/1004-sudo-effect-sd_bus_setting_add_int_infinity.json +++ b/adaptived/tests/ftests/1004-sudo-effect-sd_bus_setting_add_int_infinity.json @@ -17,7 +17,8 @@ "setting": "MemoryMax", "value": "infinity", "operator": "set", - "validate": true + "validate": true, + "runtime": true } }, { @@ -27,7 +28,8 @@ "setting": "MemoryMax", "value": 4096, "operator": "add", - "validate": true + "validate": true, + "runtime": true } } ] diff --git a/adaptived/tests/ftests/1005-sudo-effect-sd_bus_setting_sub_infinity.c b/adaptived/tests/ftests/1005-sudo-effect-sd_bus_setting_sub_infinity.c index 77eaf26..0832c35 100644 --- a/adaptived/tests/ftests/1005-sudo-effect-sd_bus_setting_sub_infinity.c +++ b/adaptived/tests/ftests/1005-sudo-effect-sd_bus_setting_sub_infinity.c @@ -73,11 +73,7 @@ int main(int argc, char *argv[]) ret = adaptived_set_attr(ctx, ADAPTIVED_ATTR_LOG_LEVEL, LOG_DEBUG); if (ret) goto err; - ret = start_slice(cgroup_slice_name, "cat"); - if (ret) { - adaptived_err("Failed to create slice: %s, ret=%d\n", cgroup_slice_name, ret); - goto err; - } + ret = adaptived_loop(ctx, true); if (ret != EXPECTED_RET) goto err; diff --git a/adaptived/tests/ftests/1005-sudo-effect-sd_bus_setting_sub_infinity.json b/adaptived/tests/ftests/1005-sudo-effect-sd_bus_setting_sub_infinity.json index ecd4e4a..f293e95 100644 --- a/adaptived/tests/ftests/1005-sudo-effect-sd_bus_setting_sub_infinity.json +++ b/adaptived/tests/ftests/1005-sudo-effect-sd_bus_setting_sub_infinity.json @@ -17,7 +17,8 @@ "setting": "MemoryMax", "value": "infinity", "operator": "set", - "validate": true + "validate": true, + "runtime": true } }, { @@ -27,7 +28,8 @@ "setting": "MemoryMax", "value": 4096, "operator": "subtract", - "validate": true + "validate": true, + "runtime": true } } ] diff --git a/adaptived/tests/ftests/1006-sudo-effect-sd_bus_setting_set_int_scope.json b/adaptived/tests/ftests/1006-sudo-effect-sd_bus_setting_set_int_scope.json index d7a228c..de97120 100644 --- a/adaptived/tests/ftests/1006-sudo-effect-sd_bus_setting_set_int_scope.json +++ b/adaptived/tests/ftests/1006-sudo-effect-sd_bus_setting_set_int_scope.json @@ -17,7 +17,8 @@ "setting": "MemoryMax", "value": 89997312, "operator": "set", - "validate": true + "validate": true, + "runtime": true } } ] diff --git a/adaptived/tests/ftests/1007-sudo-effect-sd_bus_setting_set_str.c b/adaptived/tests/ftests/1007-sudo-effect-sd_bus_setting_set_str.c index aa3201e..b682ccf 100644 --- a/adaptived/tests/ftests/1007-sudo-effect-sd_bus_setting_set_str.c +++ b/adaptived/tests/ftests/1007-sudo-effect-sd_bus_setting_set_str.c @@ -68,11 +68,7 @@ int main(int argc, char *argv[]) ret = adaptived_set_attr(ctx, ADAPTIVED_ATTR_LOG_LEVEL, LOG_DEBUG); if (ret) goto err; - ret = start_slice(cgroup_slice_name, "cat"); - if (ret) { - adaptived_err("Failed to create slice: %s, ret=%d\n", cgroup_slice_name, ret); - goto err; - } + ret = adaptived_loop(ctx, true); if (ret != EXPECTED_RET) goto err; diff --git a/adaptived/tests/ftests/1007-sudo-effect-sd_bus_setting_set_str.json b/adaptived/tests/ftests/1007-sudo-effect-sd_bus_setting_set_str.json index b58238e..514ee26 100644 --- a/adaptived/tests/ftests/1007-sudo-effect-sd_bus_setting_set_str.json +++ b/adaptived/tests/ftests/1007-sudo-effect-sd_bus_setting_set_str.json @@ -17,7 +17,8 @@ "setting": "DevicePolicy", "value": "closed", "operator": "set", - "validate": true + "validate": true, + "runtime": true } } ] diff --git a/adaptived/tests/ftests/ftests.c b/adaptived/tests/ftests/ftests.c index b5f93c5..7b50cd1 100644 --- a/adaptived/tests/ftests/ftests.c +++ b/adaptived/tests/ftests/ftests.c @@ -389,6 +389,7 @@ double time_elapsed(const struct timespec * const start, const struct timespec * int stop_transient(const char *transient_name) { char cmdline[FILENAME_MAX]; + char *cgrp_path = NULL; int ret; if (!transient_name) @@ -399,6 +400,25 @@ int stop_transient(const char *transient_name) return ret; ret = system(cmdline); adaptived_dbg("stop_transient: %s, ret=%d\n", cmdline, ret); + + ret = build_systemd_cgroup_path(transient_name, &cgrp_path); + if (ret < 0 || cgrp_path == NULL) { + adaptived_err("%s: Failed to build the systemd cgroup path for %s, ret: %d\n", __func__, transient_name, ret); + return ret; + } + + if (access(cgrp_path, F_OK) == 0) { + adaptived_dbg("stop_transient: %s still exists...\n", cgrp_path); + ret = snprintf(cmdline, FILENAME_MAX - 1, "sudo rmdir %s", cgrp_path); + if (ret < 0) + return ret; + ret = system(cmdline); + adaptived_dbg("stop_transient: %s, ret=%d\n", cmdline, ret); + } + +err: + if (cgrp_path) + free(cgrp_path); return 0; }