]> git.ipfire.org Git - thirdparty/libcgroup.git/log
thirdparty/libcgroup.git
2 years agoftests: Retry run() command after websocket failure
Tom Hromatka [Mon, 3 Jul 2023 15:51:58 +0000 (09:51 -0600)] 
ftests: Retry run() command after websocket failure

LXC/LXD will sometimes throw an "Error: websocket: bad handshake" error
on underpowered machines.  Wait a bit (arbitrarily chosen 5 seconds) and
retry the command.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agotools/cgclassify: fix controller overflow array range
Kamalesh Babulal [Mon, 3 Jul 2023 05:05:40 +0000 (10:35 +0530)] 
tools/cgclassify: fix controller overflow array range

Fix out-of-bounds write issue, reported by Coverity tool:

CID 321270 (#1 of 1): Out-of-bounds write (OVERRUN)47. overrun-local:
Overrunning array info of 16 4128-byte elements at element index 16
(byte offset 70175) using index i (which evaluates to 16).

MAX_MNT_ELEMENTS is an array that's allocated for array parsing and
populating the mount points, as per Linux Kernel, this can't be above
16 and it works fine while checking for index < MAX_MNT_ELEMENTS, but
in this case, we rely on the mount point name to be empty ('\0'), since
allowed maximum mount points are 16, increase the allocation index to
17 for the info structure, to accommodate 16 controllers, but that is
unlikely.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agopython: remove unused var in Cgroup::add_setting()
Kamalesh Babulal [Sun, 2 Jul 2023 14:38:51 +0000 (20:08 +0530)] 
python: remove unused var in Cgroup::add_setting()

In Cgroup::add_setting(), remove unused variable 'value'

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agosamples: Add automake files for the cmdline directory
Tom Hromatka [Sat, 20 May 2023 01:53:22 +0000 (19:53 -0600)] 
samples: Add automake files for the cmdline directory

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agosamples: Add a python example that creates a systemd scope
Tom Hromatka [Fri, 19 May 2023 22:16:46 +0000 (16:16 -0600)] 
samples: Add a python example that creates a systemd scope

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoftests: Rework test 071 to use cgroup_write_systemd_default_cgroup()
Tom Hromatka [Wed, 24 May 2023 13:34:51 +0000 (07:34 -0600)] 
ftests: Rework test 071 to use cgroup_write_systemd_default_cgroup()

cgroup_write_systemd_default_cgroup() populates libcgroup's /var/run
file with the default slice/scope.  No verification is done at the time
of writing.

cgroup_set_default_systemd_cgroup() reads the /var/run file and verifies
that it points to a valid path.  If so, it populates libcgroup's global
variable, systemd_default_cgroup.  systemd_default_cgroup is then used
in any subsequent building of libcgroup paths.

Previously, test 071 tested cgroup_set_default_systemd_cgroup() but it
didn't exercise cgroup_write_systemd_default_cgroup().  Rework test 071
to exercise the most likely combinations of writing/setting the default
path that a user would encounter.

-----------------------------------------------------------------
Test Results:
Run Date:                          May 24 07:32:54
Passed:                                  1 test(s)
Skipped:                                 0 test(s)
Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
Test                                       Time (sec)
-----------------------------------------------------
setup                                            0.00
071-sudo-set_default_systemd_cgroup.py           4.67
teardown                                         0.00
-----------------------------------------------------
Total Run Time                                   4.67

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agopython: Add support for NULL controllers[] in get_processes()
Tom Hromatka [Fri, 19 May 2023 22:09:54 +0000 (16:09 -0600)] 
python: Add support for NULL controllers[] in get_processes()

Add support for an empty controllers list in the Python bindings.
The python method, get_processes(), will then send in a NULL pointer
in the controllers field into the C function cgroup_get_procs().

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agopython: Add cgroup v1 support to move_process()
Tom Hromatka [Wed, 24 May 2023 20:12:45 +0000 (14:12 -0600)] 
python: Add cgroup v1 support to move_process()

Add support for providing a single controller to Cgroup.move_process().
move_process() invokes cgroup_change_cgroup_path() which utilizes an
array of controller strings.

This change only adds support for a single controller via the python
bindings, but a list of controllers could be supported in the future.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agopython: Add method to clear the default slice/scope
Tom Hromatka [Thu, 25 May 2023 02:35:35 +0000 (20:35 -0600)] 
python: Add method to clear the default slice/scope

Add a convenience method to clear the default slice/scope.  This may be
useful in cases where the user is done with the slice/scope and wants to
resume operating at the root cgroup level.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agopython: Add bindings for cgroup_write_systemd_default_cgroup()
Tom Hromatka [Fri, 19 May 2023 22:05:25 +0000 (16:05 -0600)] 
python: Add bindings for cgroup_write_systemd_default_cgroup()

Add python bindings for cgroup_write_systemd_default_cgroup().  As part
of this change, demote cgroup_set_default_systemd_cgroup() to an
internal function - __set_default_systemd_cgroup().  I would expect
users to invoke write_default_systemd_scope() and utilize that to set
the default slice/scope.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agopython: Add bindings for cgroup_set_default_logger()
Tom Hromatka [Fri, 19 May 2023 21:59:36 +0000 (15:59 -0600)] 
python: Add bindings for cgroup_set_default_logger()

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agofix: malloc size off-by-one in cgroup_process_v2_mnt
Adriaan Schmidt [Wed, 28 Jun 2023 08:12:15 +0000 (10:12 +0200)] 
fix: malloc size off-by-one in cgroup_process_v2_mnt

need to allocate the length of both strings, plus the space added in
the sprintf, plus the terminating null byte.

Signed-off-by: Adriaan Schmidt <adriaan.schmidt@siemens.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agocgcreate: cgget: Fix help spacing
Tom Hromatka [Tue, 27 Jun 2023 19:54:56 +0000 (13:54 -0600)] 
cgcreate: cgget: Fix help spacing

Fix spacing in cgcreate and cgget help where spaces were used instead
of tabs.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoapi: fix build warning
Kamalesh Babulal [Fri, 23 Jun 2023 09:40:00 +0000 (15:10 +0530)] 
api: fix build warning

Fix a build warning:
cgcreate.c: In function ‘create_systemd_scope’:
cgcreate.c:81:17: warning: ‘strncpy’ specified bound depends on the length of the source argument [-Wstringop-truncation]
   81 |                 strncpy(slice, cg->name, len);
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cgcreate.c:80:23: note: length computed here
   80 |                 len = strlen(cg->name) - strlen(scope);

fix it by using, length of destination in the strncpy().

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoapi: add ret value check in cgroup_get_current_controller_path()
Kamalesh Babulal [Fri, 23 Jun 2023 06:19:04 +0000 (11:49 +0530)] 
api: add ret value check in cgroup_get_current_controller_path()

Fix unchecked return value, reported by the Coverity tool:

CID 320874 (#1 of 1): Unchecked return value from library
(CHECKED_RETURN)13. check_return: Calling fscanf(pid_cgroup_fd,
"%*[^\n]\n") without checking return value. This library function may
fail and return an error code.

add the missing return value check from fscanf() in
cgroup_get_current_controller_path()

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agocgcreate: fix null pointer dereference in create_systemd_scope()
Kamalesh Babulal [Wed, 21 Jun 2023 04:16:20 +0000 (09:46 +0530)] 
cgcreate: fix null pointer dereference in create_systemd_scope()

Fix a NULL pointer dereference, reported by the Coverity tool:

CID 321267 (#1 of 1): Dereference null return value (NULL_RETURNS)6.
dereference: Dereferencing a pointer that might be NULL scope when
calling strlen.

check for the return value from strstr(), before dereferencing it.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agotools/cgexec: fix uninitialized variable in find_scope_pid()
Kamalesh Babulal [Sun, 18 Jun 2023 07:35:38 +0000 (13:05 +0530)] 
tools/cgexec: fix uninitialized variable in find_scope_pid()

Fix uninitialized variable, reported by the Coverity tool:

CID 321266: Uninitialized scalar variable (UNINIT)

memset(), ctrl_name with every iteration, to avoid using the stale value
or uninitialized values.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agotools/cgexec: fix memory leak in find_scope_pid()
Kamalesh Babulal [Sun, 18 Jun 2023 07:10:33 +0000 (12:40 +0530)] 
tools/cgexec: fix memory leak in find_scope_pid()

Fix a memory leak, reported by the Coverity tool.

CID 321265 (#1-2 of 2): Resource leak (RESOURCE_LEAK)37. leaked_storage:
Variable pids going out of scope leaks the storage it points to.

find_scope_pid (), calls cgroup_get_procs() to get the pids of the
tasks under cgroup name, and it's up to the caller to free the allocated
pids. Fix it by calling free(pids) after every call to
cgroup_get_procs().

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoman: cgclassify: document -r option
Kamalesh Babulal [Thu, 1 Jun 2023 11:18:52 +0000 (11:18 +0000)] 
man: cgclassify: document -r option

Document -r option. It replaces the systemd scope's idle process with
the first pid of the list of pids provided.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests: add test to replace scope idle_thread using cgclassify
Kamalesh Babulal [Thu, 15 Jun 2023 11:22:06 +0000 (16:52 +0530)] 
ftests: add test to replace scope idle_thread using cgclassify

Add a test to replace systemd scope default idle_thread using
cgclassify '-r' flag.
-----------------------------------------------------------------
Test Results:
        Run Date:                          Jun 15 11:20:25
        Passed:                                  1 test(s)
        Skipped:                                 0 test(s)
        Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
        Test                                     Time (sec)
        ---------------------------------------------------
        setup                                          0.00
        088-sudo-cgclassify_systemd_scope.py          17.63
        teardown                                       0.00
        ---------------------------------------------------
        Total Run Time                                17.63

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests: add support to replace idle_thread of systemd scope
Kamalesh Babulal [Thu, 1 Jun 2023 11:11:42 +0000 (11:11 +0000)] 
ftests: add support to replace idle_thread of systemd scope

Allow replacing the default idle_thread during process classification
into a cgroup using cgclassify by introducing replace_id flag, that
when unset(default) has no effect on the process created into systemd
scope cgroup, when set replaces the default idle_thread with the
process being created.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agotools/cgclassify: add -r option for systemd scope
Kamalesh Babulal [Tue, 20 Jun 2023 11:44:25 +0000 (17:14 +0530)] 
tools/cgclassify: add -r option for systemd scope

Provide an option for users to replace the default idle_thread created
for systemd scope.  With '-r' option specified, the first pid passed as
the argument to cgclassify will replace the default idle_thread, if it
exists.  Also, if it's the only task, killing it will remove the .scope
cgroup it's running in.

$ sudo cgclassify -r -gcpu:libcgroup.slice/db.scope 1234 1235

For non scope cgroups, it launches the task program. The algorithm in
brief is as follows:
Once the first pid of argument list migrated to the expected cgroup(s):
1. The controller, cgroups details of the pid is captured before the
   migration, so incase an error occurs, it easy to roll back to the
   original cgroups the pid belonged to.
2. Once the migrated is done, parse /proc/<pid>/cgroup of the first
   pid and if the cgroup name ends with .scope and has a task with
   /proc/<pid>/cmdline as "libcgroup_systemd_idle_thread", kill
   the task. This gives the illusion of replacement.
3. If an error occurs, migrate the pid back to the original cgroups.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoman: cgexec: document -r option
Kamalesh Babulal [Wed, 24 May 2023 11:39:25 +0000 (11:39 +0000)] 
man: cgexec: document -r option

Document -r option. It replaces the systemd scope's idle process with
command provided.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests: add test to replace scope idle_thread using cgexec
Kamalesh Babulal [Thu, 1 Jun 2023 07:03:13 +0000 (07:03 +0000)] 
ftests: add test to replace scope idle_thread using cgexec

Add a test to replace systemd scope default idle_thread using cgexec
'-r' flag.

-----------------------------------------------------------------
Test Results:
        Run Date:                          Jun 01 07:02:45
        Passed:                                  1 test(s)
        Skipped:                                 0 test(s)
        Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
        Test                                 Time (sec)
        -----------------------------------------------
        setup                                      0.00
        085-sudo-cgexec_systemd_scope.py           9.19
        teardown                                   0.00
        -----------------------------------------------
        Total Run Time                             9.19

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests: add support to replace idle_thread of systemd scope
Kamalesh Babulal [Wed, 24 May 2023 11:39:15 +0000 (11:39 +0000)] 
ftests: add support to replace idle_thread of systemd scope

Allow replacing the default idle_thread during process creation into a
cgroup using cgexec by introducing replace_id flag, that when unset
(default) has no effect on the process created into systemd scope
cgroup, when set replaces the default idle_thread with the process
being created.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agotools/cgexec: add -r option for systemd scope
Kamalesh Babulal [Thu, 15 Jun 2023 10:36:54 +0000 (16:06 +0530)] 
tools/cgexec: add -r option for systemd scope

Provide an option for users to replace the default idle_thread created
for systemd scope.  With '-r' option specified, the program passed as
the argument to cgexec will replace the default idle_thread, if it
exists.  Also, if it's the only task, killing it will remove the .scope
cgroup it's running in.

$ sudo cgexec -r -gcpu:libcgroup.slice/db.scope ./new_default

For non scope cgroups, it launches the task program. The algorithm in
brief is as follows:
Once the current task, instance of cgexec is migrated to the
expected cgroup(s):
1. fork() and in the child path perform the exec to program passed in
   the command line.  This means, we have cgexec instance and program
   executing in the desired cgroup(s).
2. In the parent, parse /proc/<pid>/cgroup of the current process
   (cgexec) and if the cgroup name ends with .scope and has a task
   with /proc/<pid>/cmdline as "libcgroup_systemd_idle_thread", kill
   the task. This gives the illusion of replacement.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agowrapper: fix missing unlock() in cgroup_add_all_controllers()
Kamalesh Babulal [Thu, 15 Jun 2023 09:54:06 +0000 (15:24 +0530)] 
wrapper: fix missing unlock() in cgroup_add_all_controllers()

Fix missing unlock(), reported by Coverity tool:

CID 313906 (#1 of 1): Missing unlock (LOCK)6. missing_unlock: Returning
without unlocking cg_mount_table_lock

add the missing pthread_rwlock_unlock() in the error path of the
cgroup_add_all_controllers()

Fixes: 4124f4d6853a ("wrapper: Add cgroup v2 support to cgroup_add_all_controllers()")
Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests-999: fix random dir name generation logic 355/head
Kamalesh Babulal [Tue, 13 Jun 2023 04:29:21 +0000 (09:59 +0530)] 
ftests-999: fix random dir name generation logic

The current logic of creating a random directory under the /tmp/
the directory is incorrect because the random directory is generated
under '/tmp/999stress', making it a common parent directory and
attempting to create/delete it will fail the test instance, that
overlaps. Fix this by generating '/tmp/<random-999stress>' making
unique per run.

-----------------------------------------------------------------
Test Results:
        Run Date:                          Jun 12 11:39:41
        Passed:                                  1 test(s)
        Skipped:                                 0 test(s)
        Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
        Test                          Time (sec)
        ----------------------------------------
        setup                               0.00
        999-stress-cgroup_init.py           1.55
        teardown                            0.00
        ----------------------------------------
        Total Run Time                      1.55

Fixes: b81915a1fbe7 ("tests-999: add a random directory to mount path")
Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoconfig.c: fix memory leak in convert_controller_versions()
Kamalesh Babulal [Mon, 12 Jun 2023 10:06:03 +0000 (15:36 +0530)] 
config.c: fix memory leak in convert_controller_versions()

Fix memory leak warning in convert_controller_versions(), reported by
Coverity tool:

CID 313911 (#1 of 1): Resource leak (RESOURCE_LEAK)9. leaked_storage:
Variable cgrp_cpy going out of scope leaks the storage it points to.

struct cgroup cgrp_cpy was not free'd in the success path, fix it.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoworkflows/ci: add build test for samples and systemd disabled 341/head
Kamalesh Babulal [Thu, 25 May 2023 09:07:43 +0000 (14:37 +0530)] 
workflows/ci: add build test for samples and systemd disabled

Fold the build tests under single job "build tests" and also add build
test with  samples=yes and systemd=no.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agosamples/create_systemd_scope: build when systemd is enabled
Kamalesh Babulal [Wed, 24 May 2023 06:56:39 +0000 (06:56 +0000)] 
samples/create_systemd_scope: build when systemd is enabled

create_systemd_scope sample program depends on the systemd support to be
build, and add the dependency in the Makefile.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agosamples: Add a C example that creates a systemd scope
Tom Hromatka [Wed, 17 May 2023 20:53:45 +0000 (14:53 -0600)] 
samples: Add a C example that creates a systemd scope

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agogithub: Add a workflow to build libcgroup with samples enabled
Tom Hromatka [Thu, 18 May 2023 13:13:47 +0000 (07:13 -0600)] 
github: Add a workflow to build libcgroup with samples enabled

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agopython: Rename get_procs() to get_processes()
Tom Hromatka [Tue, 23 May 2023 20:47:10 +0000 (14:47 -0600)] 
python: Rename get_procs() to get_processes()

Rename the python method get_procs() to get_processes() to be more
consistent with other functions in the python cgroup class.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests: Add a test for cgroup_change_cgroup_path()
Tom Hromatka [Wed, 17 May 2023 20:52:01 +0000 (14:52 -0600)] 
ftests: Add a test for cgroup_change_cgroup_path()

Add a functional test that exercises cgroup_change_cgroup_path()
via the python bindings.

-----------------------------------------------------------------
Test Results:
Run Date:                          May 17 21:20:19
Passed:                                  1 test(s)
Skipped:                                 0 test(s)
Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
Test                           Time (sec)
-----------------------------------------
setup                                0.00
087-sudo-move_pid.py                 2.06
teardown                             0.00
-----------------------------------------
Total Run Time

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agopython: Add bindings for cgroup_change_cgroup_path()
Tom Hromatka [Wed, 17 May 2023 20:49:31 +0000 (14:49 -0600)] 
python: Add bindings for cgroup_change_cgroup_path()

Add python bindings for cgroup_change_cgroup_path().  Note
that the bindings currently only support cgroup v2 (unified)
systems.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoapi: Support NULL controllers[] in cgroup_change_cgroup_path()
Tom Hromatka [Wed, 17 May 2023 20:46:58 +0000 (14:46 -0600)] 
api: Support NULL controllers[] in cgroup_change_cgroup_path()

cgroup_change_cgroup_path() allows the user to move a pid to a
different cgroup (via the cgroup name and not a cgroup struct).
In cgroup v1, it's imperative that the controller(s) are
provided, so that the proper path can be built up.  In cgroup v2,
the list of controllers is optional, since they are not a part
of the path.

Add support for the controllers[] list to be NULL iff we are
running in unified (cgroup v2) mode.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoconfig: systemd: Add a return code to cgroup_set_default_systemd_cgroup()
Tom Hromatka [Thu, 18 May 2023 13:14:55 +0000 (07:14 -0600)] 
config: systemd: Add a return code to cgroup_set_default_systemd_cgroup()

Add a return code to cgroup_set_default_systemd_cgroup().  This is
critical for users of the libcgroup C API, as they need to be certain
that a default slice/scope is set.  If they mistakenly think one is
set when it is not, then they could erroneously operate on the root
cgroup.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agosystemd: Set last_errno when ECGOTHER occurs
Tom Hromatka [Wed, 17 May 2023 20:43:36 +0000 (14:43 -0600)] 
systemd: Set last_errno when ECGOTHER occurs

Within libcgroup, ECGOTHER denotes an error when invoking a system
call.  The user can call cgroup_get_last_errno() to receive this
value.

Set last_errno any time a systemd function - cgroup_create_scope()
cgroup_create_scope2(), etc. - returns ECGOTHER.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agotests-999: add a random directory to mount path
Kamalesh Babulal [Mon, 22 May 2023 11:27:54 +0000 (11:27 +0000)] 
tests-999: add a random directory to mount path

Currently, the mount path is static/hard coded and sometimes there might
be corners cases where the mount path directories are not deleted
completely, or there might be two instances of CI running at the same
time. Let's introduce an additional directory to the mount path, that's
generated randomly, so that every run is unique and doesn't interfere
with each other.

-----------------------------------------------------------------
Test Results:
        Run Date:                          May 22 11:27:45
        Passed:                                  1 test(s)
        Skipped:                                 0 test(s)
        Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
        Test                          Time (sec)
        ----------------------------------------
        setup                               0.00
        999-stress-cgroup_init.py           1.36
        teardown                            0.00
        ----------------------------------------
        Total Run Time                      1.36

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agosamples: Add systemd command line example
Tom Hromatka [Wed, 10 May 2023 20:37:14 +0000 (14:37 -0600)] 
samples: Add systemd command line example

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoftests: Add a test for samples/cmdline/systemd-with-idle-process.md
Tom Hromatka [Thu, 11 May 2023 22:56:13 +0000 (16:56 -0600)] 
ftests: Add a test for samples/cmdline/systemd-with-idle-process.md

Add a test that performs the steps outlined in the sample command
line document systemd-with-idle-process.md.

-----------------------------------------------------------------
Test Results:
Run Date:                          May 11 16:55:43
Passed:                                  1 test(s)
Skipped:                                 0 test(s)
Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
Test                                    Time (sec)
--------------------------------------------------
setup                                         0.00
086-sudo-systemd_cmdline_example.py           6.19
teardown                                      0.00
--------------------------------------------------
Total Run Time                                6.19

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoftests: Add support for None controller to Cgroup.classify()
Tom Hromatka [Thu, 11 May 2023 22:54:08 +0000 (16:54 -0600)] 
ftests: Add support for None controller to Cgroup.classify()

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoapi: Delete the cgroup if cgroup_create_cgroup() fails
Tom Hromatka [Thu, 11 May 2023 19:53:18 +0000 (13:53 -0600)] 
api: Delete the cgroup if cgroup_create_cgroup() fails

cgroup_create_cgroup() loops through the controllers in struct cgroup
and creates the requested cgroups.  Some controllers could succeed
before a controller fails.  This results in a case where the cgroup
directory has been created and remains in /sys/fs/cgroup even after a
failure.

Invoke cgroup_delete_cgroup() after we fail to create a cgroup under a
controller.  This will delete the cgroup directory if it had been
created and put the system (nearly) back to its original state.  (It's
possible that the parent cgroup's subtree_control file was modified and
not restored, but that's best fixed in another patch.)

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agogithub: Add a workflow to build libcgroup with SYSTEMD undefined
Tom Hromatka [Tue, 9 May 2023 20:51:44 +0000 (14:51 -0600)] 
github: Add a workflow to build libcgroup with SYSTEMD undefined

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agotests/ftests: cgroup: rename blacklist, whitelist terms
Kamalesh Babulal [Mon, 8 May 2023 05:18:17 +0000 (10:48 +0530)] 
tests/ftests: cgroup: rename blacklist, whitelist terms

Rename 'cgsnapshot_blacklist.conf -> cgsnapshot_denylist.conf'.  Also,
update the error messages, check to search for replaced terms.

Suggested-by: Tom Hromatka <tom.hromatka@oracle.com>
Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agosamples/config: cgsnapshot: rename blacklist, whitelist config
Kamalesh Babulal [Mon, 8 May 2023 05:17:42 +0000 (10:47 +0530)] 
samples/config: cgsnapshot: rename blacklist, whitelist config

Rename 'cgsnapshot_whitelist.conf' -> 'cgsnapshot_allowlist.conf' and
'cgsnapshot_blacklist.conf -> cgsnapshot_denylist.conf'.  Also, update
Makefile with renames.

Suggested-by: Tom Hromatka <tom.hromatka@oracle.com>
Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoman: cgsnapshot: replace blacklist, whitelist terms
Kamalesh Babulal [Mon, 8 May 2023 05:17:36 +0000 (10:47 +0530)] 
man: cgsnapshot: replace blacklist, whitelist terms

Replace terms 'blacklist' -> 'denylist' and
'whitelist' -> 'allowlist'.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agotools/cgsnapshot: replace blacklist, whitelist terms
Kamalesh Babulal [Mon, 8 May 2023 05:16:24 +0000 (10:46 +0530)] 
tools/cgsnapshot: replace blacklist, whitelist terms

Replace terms 'blacklist' -> 'denylist' and
'whitelist' -> 'allowlist'. No functional changes.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agofix: include paths for out-of-source builds
Adriaan Schmidt [Tue, 9 May 2023 12:51:56 +0000 (14:51 +0200)] 
fix: include paths for out-of-source builds

This is so the generated libcgroup/init.h is found when not
building in the source tree.

Signed-off-by: Adriaan Schmidt <adriaan.schmidt@siemens.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agofix: repair build for --disable-systemd
Adriaan Schmidt [Tue, 9 May 2023 12:54:26 +0000 (14:54 +0200)] 
fix: repair build for --disable-systemd

Ensure that the prototypes of `create_systemd_scope` match for both
`WITH_SYSTEMD` and `!WITH_SYSTEMD`.

Signed-off-by: Adriaan Schmidt <adriaan.schmidt@siemens.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoapi: cgroup_get_current_controller_path: fix a segfault
Kamalesh Babulal [Wed, 3 May 2023 10:47:06 +0000 (16:17 +0530)] 
api: cgroup_get_current_controller_path: fix a segfault

cgroup_get_current_controller_path(pid, controller, current_path), the
third argument isn't currently validated and will cause segfault if the
user passes NULL, in place of expect char **.  Introduce a check to
validate current_path argument too.

Reproducer:
___________
 #include <stdio.h>
 #include <stdlib.h>
 #include <libcgroup.h>

 int main(int argc, char **argv)
 {
  pid_t pid;
  int ret;

  ret = cgroup_init();
  if (ret) {
  printf("cgroup initialization failed:%s\n", cgroup_strerror(ret));
  return ret;
  }

ret = cgroup_get_current_controller_path(atoi(argv[1]), NULL, NULL);
/* should not reach here */
return 0;
 }

 # gcc -o rep rep.c
 # ./rep <valid pid>
 Segmentation fault (core dumped)

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoman: cgcreate: document -p option
Tom Hromatka [Thu, 27 Apr 2023 13:02:40 +0000 (13:02 +0000)] 
man: cgcreate: document -p option

Add documentation about the -p option. It helps users to specify the
task they want to use in place of the default idle process created by
libcgroup, during systemd scope.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests: add test to pass pid to systemd scope create via cgcreate
Kamalesh Babulal [Fri, 28 Apr 2023 04:57:57 +0000 (10:27 +0530)] 
ftests: add test to pass pid to systemd scope create via cgcreate

Add a test to pass task pid to systemd scope during creation using the
cgcreate tool.

-----------------------------------------------------------------
Test Results:
        Run Date:                          Apr 27 12:54:10
        Passed:                                  1 test(s)
        Skipped:                                 0 test(s)
        Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
        Test                                       Time (sec)
        -----------------------------------------------------
        setup                                            0.00
        084-sudo-cgcreate_systemd_scope_pid.py           2.16
        teardown                                         0.00
        -----------------------------------------------------
        Total Run Time                                   2.16

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
TJH: Added one more call to Cgroup.get_pids_in_cgroup()

2 years agoftests: cgroup: add support to pass pid for systemd scope
Kamalesh Babulal [Tue, 25 Apr 2023 13:01:55 +0000 (18:31 +0530)] 
ftests: cgroup: add support to pass pid for systemd scope

Add support to pass a task pid, while creating systemd slice/scope, this
helps the users to specify the task they wish to run instead of the
default idle_thread in the transient scope.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agotools/cgcreate: add -p <pid> support for systemd scope
Kamalesh Babulal [Thu, 27 Apr 2023 12:38:42 +0000 (12:38 +0000)] 
tools/cgcreate: add -p <pid> support for systemd scope

Currently, an idle_thread is created for the transient systemd scope by
default, it works fine, when the slice/scope creation is treated in par
to create of traditional cgroup, but the user may wish to create a
slice/scope, with a process of their choice, instead of a default idle
thread.  Add support to pass task pid via '-p/--pid' option, while
creating a systemd slice/scope.

 # ./src/tools/cgcreate -c -gcpu:foo.slice/bar.scope --pid=4253

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests: Add cgroup_get_current_controller_path() (v2) test
Kamalesh Babulal [Thu, 27 Apr 2023 11:22:04 +0000 (11:22 +0000)] 
ftests: Add cgroup_get_current_controller_path() (v2) test

Add a test cases to stress pybindings of get_current_controller_path(),
that calls cgroup_get_current_controller_path() on unified mode.

-----------------------------------------------------------------
Test Results:
        Run Date:                          Apr 27 11:21:33
        Passed:                                  1 test(s)
        Skipped:                                 0 test(s)
        Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
        Test                                             Time (sec)
        -----------------------------------------------------------
        setup                                                  0.00
        082-pybindings-cgrp_get_curr_ctrl_path-v2.py           2.18
        teardown                                               0.00
        -----------------------------------------------------------
        Total Run Time                                         2.18

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests: Add cgroup_get_current_controller_path() (v1) test
Kamalesh Babulal [Thu, 27 Apr 2023 11:11:16 +0000 (11:11 +0000)] 
ftests: Add cgroup_get_current_controller_path() (v1) test

Add a test cases to stress pybindings of get_current_controller_path(),
that calls cgroup_get_current_controller_path() on legacy/hybrid mode.

-----------------------------------------------------------------
Test Results:
        Run Date:                          Apr 27 11:10:22
        Passed:                                  1 test(s)
        Skipped:                                 0 test(s)
        Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
        Test                                             Time (sec)
        -----------------------------------------------------------
        setup                                                  0.00
        081-pybindings-cgrp_get_curr_ctrl_path-v1.py           2.34
        teardown                                               0.00
        -----------------------------------------------------------
        Total Run Time                                         2.34

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agopython: Add python bindings for get_current_controller_path()
Kamalesh Babulal [Thu, 27 Apr 2023 11:09:05 +0000 (11:09 +0000)] 
python: Add python bindings for get_current_controller_path()

Add python bindings for get_current_controller_path()

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoapi.c: add cgroup v2 support to cgroup_get_current_controller_path()
Kamalesh Babulal [Sun, 23 Apr 2023 11:16:48 +0000 (16:46 +0530)] 
api.c: add cgroup v2 support to cgroup_get_current_controller_path()

Add support to read/parse cgroup v2 format /proc/<pid>/cgroup to
cgroup_get_current_controller_path(). The format of /proc/<pid>/cgroup
remains the same:
hierarchy-ID:controller-list:cgroup-path

the difference is that in cgroup v2 mode:
- hierarchy-ID is always 0 (one hierarchy allowed)
- controller-list is empty

there can also be a mix of both legacy and unified controllers for a
given task if the cgroup mode is hybrid mode.  This patch, add support
for the mixed cgroup setup mode too.

Reported-by: Adriaan Schmidt <adriaan.schmidt@siemens.com>
Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests: add test case to excerise cgroup_setup_mode helpers
Kamalesh Babulal [Tue, 25 Apr 2023 12:36:28 +0000 (12:36 +0000)] 
ftests: add test case to excerise cgroup_setup_mode helpers

Add tests to excerise the cgroup_setup_mode() helpers pybindings
is_cgroup_mode_{legacy,hybrid,unified}

-----------------------------------------------------------------
Test Results:
        Run Date:                          Apr 25 12:46:29
        Passed:                                  1 test(s)
        Skipped:                                 0 test(s)
        Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
        Test                                      Time (sec)
        ----------------------------------------------------
        setup                                           0.00
        083-pybindings-helpers_cgroup_mode.py           0.00
        teardown                                        0.00
        ----------------------------------------------------
        Total Run Time                                  0.00

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agopython: add pybindings for cgroup_setup_mode() helpers
Kamalesh Babulal [Mon, 24 Apr 2023 09:02:44 +0000 (09:02 +0000)] 
python: add pybindings for cgroup_setup_mode() helpers

Add pybindings for the cgroup_setup_mode() helper functions:
- is_cgroup_mode_legacy()
- is_cgroup_mode_hybrid()
- is_cgroup_mode_unified()

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
TJH: Fixed a few comment typos

2 years agoapi: add helpers functions to check cgroup setup mode
Kamalesh Babulal [Tue, 25 Apr 2023 12:32:08 +0000 (12:32 +0000)] 
api: add helpers functions to check cgroup setup mode

Add helpers functions is_cgroup_mode_{legacy,hybrid,unified}() to check
for a particular cgroup setup mode. Also, export them.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agosamples/c: add sample program for cgroup_setup_mode()
Kamalesh Babulal [Tue, 25 Apr 2023 12:27:02 +0000 (12:27 +0000)] 
samples/c: add sample program for cgroup_setup_mode()

Add a sample program to demonstrate the usage of the cgroup_setup_mode()
to the developers.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoapi: export cgroup_setup_mode()
Kamalesh Babulal [Mon, 24 Apr 2023 07:00:51 +0000 (07:00 +0000)] 
api: export cgroup_setup_mode()

export cgroup_setup_mode(), the function will be helpful for the
developers to take decisions/actions based on the cgroup setup mode the
system is booted with.

Suggested-by: Tom Hromatka <tom.hromatka@oracle.com>
Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agowrapper: cgroup_add_all_controllers(): fix variable typo
Kamalesh Babulal [Sun, 23 Apr 2023 11:35:05 +0000 (17:05 +0530)] 
wrapper: cgroup_add_all_controllers(): fix variable typo

Coverity reported uninitialized value:

CID 313909 (#1 of 1): Uninitialized scalar variable (UNINIT)8.
uninit_use_in_call: Using uninitialized value *info.name as argument to
%s when calling fprintf.

In cgroup_add_all_controllers(), fix the wrong variable name in the
error message, while parsing the controller name.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests: Add a domain invalid test
Tom Hromatka [Mon, 17 Apr 2023 14:58:15 +0000 (14:58 +0000)] 
ftests: Add a domain invalid test

-----------------------------------------------------------------
Test Results:
Run Date:                          Apr 13 19:23:11
Passed:                                  1 test(s)
Skipped:                                 0 test(s)
Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
Test                             Time (sec)
-------------------------------------------
setup                                  0.00
080-kernel-domain_invalid.py           4.22
teardown                               0.00
-------------------------------------------
Total Run Time                         4.22

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoftests: Add a test to create a default systemd scope via cgcreate
Tom Hromatka [Mon, 17 Apr 2023 14:57:15 +0000 (14:57 +0000)] 
ftests: Add a test to create a default systemd scope via cgcreate

Add a test to create a systemd scope via the cgcreate command
line tool.  The scope is set as the default and used to create
a child cgroup.

-----------------------------------------------------------------
Test Results:
        Run Date:                          Apr 10 21:39:10
        Passed:                                  1 test(s)
        Skipped:                                 0 test(s)
        Failed:                                  0 test(s)
-----------------------------------------------------------------
        Test                                          Time (sec)
        --------------------------------------------------------
        setup                                               0.00
        079-sudo-cgcreate_default_systemd_scope.py          5.06
        teardown                                            0.00
        --------------------------------------------------------
        Total Run Time                                      5.06

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoftests: Add a test to create a systemd scope via cgcreate
Tom Hromatka [Tue, 4 Apr 2023 22:32:12 +0000 (22:32 +0000)] 
ftests: Add a test to create a systemd scope via cgcreate

Add a test to create a systemd scope via the cgcreate command
line tool.

-----------------------------------------------------------------
Test Results:
        Run Date:                          Apr 05 01:35:43
        Passed:                                  1 test(s)
        Skipped:                                 0 test(s)
        Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
        Test                                  Time (sec)
        ------------------------------------------------
        setup                                       0.00
        078-sudo-cgcreate_systemd_scope.py          5.03
        teardown                                    0.00
        ------------------------------------------------
        Total Run Time                              5.03

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoman: document cgcreate's -c and -S options
Tom Hromatka [Thu, 6 Apr 2023 19:36:57 +0000 (13:36 -0600)] 
man: document cgcreate's -c and -S options

Add documentation about the -c (create scope) option and the -S
(set as default) option in the cgcreate man page. -c instructs
cgcreate to invoke cgroup_create_scope2() and create a systemd
scope.  -S (used in conjunction with -c) will set the provided
scope as the default for subsequent libcgroup operations.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoapi: Add support for domain invalid cgroups
Tom Hromatka [Mon, 10 Apr 2023 22:01:23 +0000 (22:01 +0000)] 
api: Add support for domain invalid cgroups

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agosrc: ftests: Better management of libcgroup idle thread
Tom Hromatka [Wed, 5 Apr 2023 15:38:55 +0000 (15:38 +0000)] 
src: ftests: Better management of libcgroup idle thread

Add the libcgroup_systemd_idle_thread to the EXTRA_DIST list. This
makes it available during `make distcheck`.

Modifying the PATH environment variable when running sudo is not
allowed on some systems.  Copy the libcgroup_systemd_idle_thread
to /bin to overcome this.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoftests: Add support for lists in Cgroup.exists()
Tom Hromatka [Fri, 7 Apr 2023 22:18:30 +0000 (16:18 -0600)] 
ftests: Add support for lists in Cgroup.exists()

Add support for checking if a cgroup exists when a list of
controllers is provided.  For example, given:

controllers = ['cpu', 'pids']
cgroup_name = 'test_cgroup'

Cgroup.exists(config, controllers, cgroup_name)

will now work.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoftests: Add cgcreate systemd scope support
Tom Hromatka [Tue, 4 Apr 2023 22:31:51 +0000 (22:31 +0000)] 
ftests: Add cgcreate systemd scope support

Add support for creating systemd scopes via the cgcreate command
line tool.

Python's subprocess.Popen.communicate() will not return until the
spawned process and all of its children finish running.  This will
cause a cgcreate of a scope to hang because libcgroup creates an
idle process in the newly-created scope.  Add a timeout to the run()
method so that it can complete even when a child process remains.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agocgcreate: Add support to create a systemd scope
Tom Hromatka [Mon, 3 Apr 2023 15:39:31 +0000 (09:39 -0600)] 
cgcreate: Add support to create a systemd scope

Add support to create a systemd scope.  A user can create a delegated
systemd scope using the following format:
$ cgcreate -c -g <controllers>:<slicename>/<scopename>

e.g.
$ cgcreate -c -g cpu,memory:libcgroup.slice/database.scope

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agosystemd: Cleanup return codes in cgroup_create_scope()
Tom Hromatka [Tue, 4 Apr 2023 21:31:12 +0000 (21:31 +0000)] 
systemd: Cleanup return codes in cgroup_create_scope()

cgroup_create_scope() used a single variable, ret, to handle return
codes from systemd/dbus, system calls, and internal libcgroup functions.
Use a separate return variable for each of these three cases to clearly
delineate errors.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoman/cgget: add '-c' option description
Kamalesh Babulal [Tue, 18 Apr 2023 08:20:54 +0000 (13:50 +0530)] 
man/cgget: add '-c' option description

Add a brief explanation about '-c' option. It displays the controllers
and their versions.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agotools/cgget: add '-c' option
Kamalesh Babulal [Tue, 18 Apr 2023 08:20:48 +0000 (13:50 +0530)] 
tools/cgget: add '-c' option

Add '-c' option to cgget, that prints the controllers and their
versions,
this is useful for the user, who wants to list the available controllers
and/or their version too.

 $ cgget -c
 #Controller     Version
 cpu             2
 memory          2
 cpuset          1
 misc            1
 hugetlb         1
 blkio           1
 net_cls         1
 net_prio        1
 freezer         1
 devices         1
 pids            1
 perf_event      1
 rdma            1

this option works with legacy, unified, and hybrid cgroup setup modes.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
TJH: Changed comment formatting

2 years agotools/cgxget: fix segfault in free path
Kamalesh Babulal [Fri, 14 Apr 2023 15:30:01 +0000 (15:30 +0000)] 
tools/cgxget: fix segfault in free path

cgxget tool crashes, when passing basic operations such as multiple
cgroups as arguments or invalid parameters, it turns out the address of
struct cgroup passed for cgroup_free() has been invalid.

$ sudo ./src/tools/cgxget -1 -r cpu.shares a b
Segmentation fault (core dumped)

$ sudo ./src/tools/cgxget -1 cpu.shares a b
Segmentation fault (core dumped)

this patch fixes it by passing the right address of the struct cgroup[]
to cgroup_free().

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agotools/cgget: fix '-m' option usage
Kamalesh Babulal [Sun, 16 Apr 2023 04:40:13 +0000 (10:10 +0530)] 
tools/cgget: fix '-m' option usage

'-m' is logically an independent option and should not be mixed and
matched with other options and also when used with '-h', help always
takes precedence over other options. Fix both cases of usage with
a bool flag, that gets set when parsing the command line option but
executes only it meets the rules of not mixing with other options.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests: Add test for cgroup_get_procs()
Tom Hromatka [Fri, 17 Mar 2023 15:25:49 +0000 (09:25 -0600)] 
ftests: Add test for cgroup_get_procs()

Add a functional test for cgroup_get_procs()

-----------------------------------------------------------------
Test Results:
Run Date:                          Mar 17 16:11:34
Passed:                                  1 test(s)
Skipped:                                 0 test(s)
Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
Test                                   Time (sec)
-------------------------------------------------
setup                                        0.00
077-pybindings-cgroup_get_procs.py          40.31
teardown                                     0.00
-------------------------------------------------
Total Run Time                              40.31

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoftests: Add controller list() support to Cgroup.classify()
Tom Hromatka [Fri, 17 Mar 2023 15:24:32 +0000 (09:24 -0600)] 
ftests: Add controller list() support to Cgroup.classify()

Add support for passing in a list of controllers to Cgroup.classify().

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agopython: Add python bindings for cgroup_get_procs()
Tom Hromatka [Fri, 17 Mar 2023 15:23:59 +0000 (09:23 -0600)] 
python: Add python bindings for cgroup_get_procs()

Add python bindings for cgroup_get_procs().

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
2 years agoftests-070: avoid enabling controller on leaf cgroup node
Kamalesh Babulal [Wed, 12 Apr 2023 14:31:01 +0000 (14:31 +0000)] 
ftests-070: avoid enabling controller on leaf cgroup node

cgroup v2, has no internal process constraint, where the process runs
only on the leaf node of the cgroup hierarchy and no controllers should
be enabled on the leaf cgroup node too. Let's not enable cpu controller
on the leaf cgroup node.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests-068: avoid enabling controller on leaf cgroup node
Kamalesh Babulal [Wed, 12 Apr 2023 14:30:34 +0000 (14:30 +0000)] 
ftests-068: avoid enabling controller on leaf cgroup node

cgroup v2, has no internal process constraint, where the process runs
only on the leaf node of the cgroup hierarchy and no controllers should
be enabled on the leaf cgroup node too. Let's not enable cpu controller
on the leaf cgroup node.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests-066: avoid enabling controller on leaf cgroup node
Kamalesh Babulal [Wed, 12 Apr 2023 14:28:37 +0000 (14:28 +0000)] 
ftests-066: avoid enabling controller on leaf cgroup node

cgroup v2, has no internal process constraint, where the process runs
only on the leaf node of the cgroup hierarchy and no controllers should
be enabled on the leaf cgroup node too. Let's not enable cpu controller
on the leaf cgroup node. Also, fix the expected stderr, accordingly
while migrating the tasks using cgclassify.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests-064: avoid enabling controller on leaf cgroup node
Kamalesh Babulal [Wed, 12 Apr 2023 14:27:58 +0000 (14:27 +0000)] 
ftests-064: avoid enabling controller on leaf cgroup node

cgroup v2, has no internal process constraint, where the process runs
only on the leaf node of the cgroup hierarchy and no controllers should
be enabled on the leaf cgroup node too. Let's not enable cpu controller
on the leaf cgroup node.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests-062: avoid enabling controller on leaf cgroup node
Kamalesh Babulal [Wed, 12 Apr 2023 14:27:06 +0000 (14:27 +0000)] 
ftests-062: avoid enabling controller on leaf cgroup node

cgroup v2, has no internal process constraint, where the process runs
only on the leaf node of the cgroup hierarchy and no controllers should
be enabled on the leaf cgroup node too. Let's not enable cpu controller
on the leaf cgroup node.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoRevert "gunit/test-015: Populate subtree_control for leaf cgroup"
Kamalesh Babulal [Wed, 12 Apr 2023 09:34:19 +0000 (09:34 +0000)] 
Revert "gunit/test-015: Populate subtree_control for leaf cgroup"

This reverts commit 328ec5e8e4f00790cb91f81ff53f2cdd42d0106f.

Revert the logic to rely on the leaf cgroup node's subtree_control file
to examine the enabled controllers, this breaks the cgroup v2's no
internal process constraint and fallback to the original idea of relying
upon on leaf cgroup nodes, parent subtree_control to examine the enabled
controllers.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoRevert "gunit/test-012: Create subtree_control for leaf cgroup"
Kamalesh Babulal [Wed, 12 Apr 2023 09:34:30 +0000 (09:34 +0000)] 
Revert "gunit/test-012: Create subtree_control for leaf cgroup"

This reverts commit c567528cdb9c8394c9c61c906e68daa0d91a80d8.

Fallback to the original approach of no internal process constraint,
revert the logic to enable the controller on the cgroup leaf node.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoRevert "api: cgroup v2 – read subtree_control of the leaf node"
Kamalesh Babulal [Wed, 12 Apr 2023 14:51:17 +0000 (20:21 +0530)] 
Revert "api: cgroup v2 – read subtree_control of the leaf node"

This reverts commit 39012eeefa454e09fc4192cacddb508ee00abee6.

As per the no internal process constraint, of cgroup v2 no controller
should be enabled in the leaf cgroup node. This patch breaks this
constraint by assuming the controllers are enabled until the leaf node
of the hierarchy. Let's revert to the original approach of reading
until the parent of the leaf cgroup node.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoRevert "api: cgroup v2 – enable controller at the leaf node"
Kamalesh Babulal [Wed, 12 Apr 2023 14:49:45 +0000 (20:19 +0530)] 
Revert "api: cgroup v2 – enable controller at the leaf node"

This reverts commit bb291add5db87fe36a82a18c6eb6aaf64dc07694.

cgroup v2, has no internal process constraint, where the process runs
only on the leaf node of the cgroup hierarchy and no controllers should
be enabled on the leaf cgroup node too, so that they don't compete with
the parent's internal process. This patch broke this rule by enabling
the controller on the leaf node by default. Let's revert to the original
approach of not enabling the controller on the leaf cgroup node.

Signed-by-off: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests: Add cgconfigparser auto convert test
Kamalesh Babulal [Fri, 7 Apr 2023 14:15:19 +0000 (19:45 +0530)] 
ftests: Add cgconfigparser auto convert test

Add a test to exercise cgconfigparser auto convert functionality.

-----------------------------------------------------------------
Test Results:
        Run Date:                          Apr 07 14:14:57
        Passed:                                  1 test(s)
        Skipped:                                 0 test(s)
        Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
        Test                             Time (sec)
        -------------------------------------------
        setup                                  0.00
        076-cgconfig-auto_convert.py           0.11
        teardown                               0.00
        -------------------------------------------
        Total Run Time                         0.11

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
TJH: Changed test number to 76 and added it to Makefile.am

2 years agocgconfig: auto convert cgroup controller versions
Kamalesh Babulal [Wed, 12 Apr 2023 09:15:01 +0000 (14:45 +0530)] 
cgconfig: auto convert cgroup controller versions

The user might be using cgroup v1 controller settings in the
cgconfig.conf and when migrating to the cgroup v2 setup, they are
required to manually edit the cgconfig.conf file to map v1 controllers
settings to that of v2 settings, this might be cumbersome activity.
This patch tries to address the mapping issue, by silently mapping
the possible controller settings to the current cgroup setup.

Consider the scenario:
$ cgget -m
Unified Mode (Cgroup v2 only).

$ cat cgconfig.conf
group foo {
        cpu {
                cpu.shares = 512;
                cpu.cfs_quota_us = 5000;
        }
        cpuset {
                cpuset.cpus = 0-1;
        }
}

the cpu controller settings are of cgroup v1 but the system is booted
into cgroup v2 setup. Running cgconfigparser without the patch, the user
will be warned about invalid settings and the parser will exit.

$ sudo cgconfigparser -l ./cgconfig.conf
cgconfigparser; error loading cgconfig.conf: Cgroup, requested group parameter does not exist

with this patch, cgconfigparser will attempt to convert the settings.
$ sudo cgconfigparser -l ./cgconfig.conf
$ cat /sys/fs/cgroup/foo/cpu.weight
50
$ cat /sys/fs/cgroup/foo/cpu.max
5000 100000

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests: cleanup return statements
Kamalesh Babulal [Mon, 10 Apr 2023 12:40:02 +0000 (18:10 +0530)] 
ftests: cleanup return statements

This patch cleans up a few oddities around return statements:
1. Removes redundant return statements across the ftests/*, mostly in
   the function prereqs and a few other places too.
2. Follows the same function template for prereqs, across the ftests/*.,
   and removes the checks for success on return from prereqs function,
   those will be true always.
3. Also, replace consts.TEST_PASSED, None with pass for functions, that
   serves as stub and remove the return value checks for stubs.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests-072: fix flake8 warning
Kamalesh Babulal [Mon, 3 Apr 2023 10:05:08 +0000 (15:35 +0530)] 
ftests-072: fix flake8 warning

Fix "E302 expected 2 blank lines, found 1" flake warnings.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agotests-059: fix flake8 warnings
Kamalesh Babulal [Mon, 3 Apr 2023 10:05:04 +0000 (15:35 +0530)] 
tests-059: fix flake8 warnings

Fix "F401 'utils' imported but unused" and
"E303 too many blank lines (2)" warnings.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests-050: fix flake8 unused import warning
Kamalesh Babulal [Mon, 3 Apr 2023 10:05:00 +0000 (15:35 +0530)] 
ftests-050: fix flake8 unused import warning

Fix "F401 'run.Run' imported but unused" flake8 warning.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agoftests: Add cgroup_compare_cgroup() test
Tom Hromatka [Tue, 7 Mar 2023 19:49:23 +0000 (12:49 -0700)] 
ftests: Add cgroup_compare_cgroup() test

Add a test for the cgroup_compare_cgroup() python bindings

-----------------------------------------------------------------
Test Results:
Run Date:                          Mar 07 12:49:07
Passed:                                  1 test(s)
Skipped:                                 0 test(s)
Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
Test                                        Time (sec)
------------------------------------------------------
setup                                             0.00
075-pybindings-cgroup_compare_cgroup.py           0.09
teardown                                          0.00
------------------------------------------------------
Total Run Time                                    0.09

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
2 years agopython: Add python bindings for cgroup_compare_cgroup()
Tom Hromatka [Tue, 7 Mar 2023 19:45:35 +0000 (12:45 -0700)] 
python: Add python bindings for cgroup_compare_cgroup()

Add python bindings for comparing two Cgroup instances.  Perform
the usual python comparisons and also invoke cgroup_compare_cgroup()
to ensure the cgroups completely match.

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>