<div dir="ltr"><br><br>On Wed, Jan 19, 2022 at 10:44 PM Luke Nowakowski-Krijger <<a href="mailto:luke.nowakowskikrijger@canonical.com" target="_blank">luke.nowakowskikrijger@canonical.com</a>> wrote:<br>><br>> Implement a binary utility that creates an interface to make calls to<br>> the cgroup C API.<br>><br>> This will effectively allow shell scripts to make calls to the cgroup C<br>> api.<br>><br>> Signed-off-by: Luke Nowakowski-Krijger <<a href="mailto:luke.nowakowskikrijger@canonical.com" target="_blank">luke.nowakowskikrijger@canonical.com</a>><br>> ---<br>>  testcases/lib/Makefile    |  2 +-<br>>  testcases/lib/tst_cgctl.c | 69 +++++++++++++++++++++++++++++++++++++++<br>>  2 files changed, 70 insertions(+), 1 deletion(-)<br>>  create mode 100644 testcases/lib/tst_cgctl.c<br>><br>> diff --git a/testcases/lib/Makefile b/testcases/lib/Makefile<br>> index f2de0c832..f4f8c8524 100644<br>> --- a/testcases/lib/Makefile<br>> +++ b/testcases/lib/Makefile<br>> @@ -12,6 +12,6 @@ MAKE_TARGETS          := tst_sleep tst_random tst_checkpoint tst_rod tst_kvcmp\<br>>                            tst_device tst_net_iface_prefix tst_net_ip_prefix tst_net_vars\<br>>                            tst_getconf tst_supported_fs tst_check_drivers tst_get_unused_port\<br>>                            tst_get_median tst_hexdump tst_get_free_pids tst_timeout_kill\<br>> -                          tst_check_kconfigs<br>> +                          tst_check_kconfigs tst_cgctl<br>><br>>  include $(top_srcdir)/include/mk/<a href="http://generic_leaf_target.mk" target="_blank">generic_leaf_target.mk</a><br>> diff --git a/testcases/lib/tst_cgctl.c b/testcases/lib/tst_cgctl.c<br>> new file mode 100644<br>> index 000000000..a6cf88f41<br>> --- /dev/null<br>> +++ b/testcases/lib/tst_cgctl.c<br>> @@ -0,0 +1,69 @@<br><br>We need to add SPDX-License-Identifier and copyright for this file.<br><br>And better to use Tabs (8 characters) instead of 4 spaces for the code indentation:).<div><div>See:<a href="https://www.kernel.org/doc/html/latest/process/coding-style.html#indentation" target="_blank"> https://www.kernel.org/doc/html/latest/process/coding-style.html#indentation</a><br><br>> +#include <stdio.h><br>> +#include <string.h><br>> +#include <stdlib.h><br>> +#include <stdint.h><br>> +#include <unistd.h><br>> +#include "tst_cgroup.h"<br>> +<br>> +static int cgctl_require(const char *ctrl, int test_pid)<br>> +{<br>> +    struct tst_cgroup_opts opts;<br>> +<br>> +    memset(&opts, 0, sizeof(opts));<br>> +    opts.test_pid = test_pid;<br>> +<br>> +    tst_cgroup_require(ctrl, &opts);<br>> +    tst_cgroup_print_config();<br>> +<br>> +    return 0;<br>> +}<br>> +<br>> +static int cgctl_cleanup(const char *config)<br>> +{<br>> +    tst_cgroup_scan();<br>> +    tst_cgroup_load_config(config);<br>> +    tst_cgroup_cleanup();<br>> +<br>> +    return 0;<br>> +}<br>> +<br>> +static int cgctl_print(void)<br>> +{<br>> +    tst_cgroup_scan();<br>> +    tst_cgroup_print_config();<br>> +<br>> +    return 0;<br>> +}<br>> +<br>> +static int cgctl_process_cmd(int argc, char *argv[])<br>> +{<br>> +    int test_pid;<br>> +    const char *cmd_name = argv[1];<br>> +<br>> +    if (!strcmp(cmd_name, "require")) {<br>> +        test_pid = atoi(argv[3]);<br>> +        if (!test_pid) {<br>> +            fprintf(stderr, "tst_cgctl: Invalid test_pid '%s' given\n",<br>> +                    argv[3]);<br>> +            return 1;<br>> +        }<br>> +        return cgctl_require(argv[2], test_pid);<br>> +    } else if (!strcmp(cmd_name, "cleanup")) {<br>> +        return cgctl_cleanup(argv[2]);<br>> +    } else if (!strcmp(cmd_name, "print")) {<br>> +        return cgctl_print();<br>> +    }<br>> +<br>> +    fprintf(stderr, "tst_cgctl: Unknown command '%s' given\n", cmd_name);<br>> +    return 1;<br>> +}<br>> +<br>> +int main(int argc, char *argv[])<br>> +{<br>> +    if (argc < 2 || argc > 4) {<br>> +        fprintf(stderr, "tst_cgctl: Invalid number of arguements given");<br>> +        return 1;<br>> +    }</div><div><br></div><div><div class="gmail_default" style="font-size:small">It'd be great to have a help() function to print the usage.</div><div class="gmail_default" style="font-size:small">Something maybe looks like: </div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">Usage: ./tst_cgctl  require|print|cleanup  ...</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">  # cgroup_state=$(./tst_cgctl require "$ctrl" "$pid")</div><div class="gmail_default" style="font-size:small">  # echo "$cgroup_state"  # to print detailed controllers<br></div><div class="gmail_default" style="font-size:small">  # tst_cgctl cleanup "$cgroup_state"</div><br></div><div><br>> +<br>> +    return cgctl_process_cmd(argc, argv);<br>> +}<br>> --<br>> 2.32.0<br>><br><br><br>--<br>Regards,<br>Li Wang</div></div></div>