]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
cgroups: improve utility controller handling
authorChristian Brauner <christian.brauner@ubuntu.com>
Sun, 21 Feb 2021 13:32:56 +0000 (14:32 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sun, 21 Feb 2021 13:32:56 +0000 (14:32 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/cgroups/cgfsng.c
src/lxc/cgroups/cgroup.h

index 4a809e5ac01a25bf539a2a3f9bc4ae0a8fc160c4..71bee9de972e1f437810582e64f39fa7f17b58a3 100644 (file)
@@ -123,12 +123,12 @@ static struct hierarchy *get_hierarchy(struct cgroup_ops *ops, const char *contr
                 */
                if (pure_unified_layout(ops)) {
                        if (strequal(controller, "devices")) {
-                               if (ops->unified->bpf_device_controller)
+                               if (device_utility_controller(ops->unified))
                                        return ops->unified;
 
                                break;
                        } else if (strequal(controller, "freezer")) {
-                               if (ops->unified->freezer_controller)
+                               if (freezer_utility_controller(ops->unified))
                                        return ops->unified;
 
                                break;
@@ -1402,7 +1402,7 @@ __cgfsng_ops static void cgfsng_payload_finalize(struct cgroup_ops *ops)
             !faccessat(ops->unified->dfd_con, "cgroup.freeze", F_OK,
                        AT_SYMLINK_NOFOLLOW)) {
                TRACE("Unified hierarchy supports freezer");
-               ops->unified->freezer_controller = 1;
+               ops->unified->utilities |= FREEZER_CONTROLLER;
         }
 }
 
@@ -2838,7 +2838,7 @@ __cgfsng_ops static bool cgfsng_devices_activate(struct cgroup_ops *ops, struct
        conf = handler->conf;
 
        unified = ops->unified;
-       if (!unified || !unified->bpf_device_controller ||
+       if (!unified || !device_utility_controller(unified) ||
            !unified->path_con ||
            lxc_list_empty(&(conf->bpf_devices).device_item))
                return true;
@@ -3222,7 +3222,7 @@ static int __initialize_cgroups(struct cgroup_ops *ops, bool relative,
                        ops->cgroup_layout = CGROUP_LAYOUT_HYBRID;
                } else {
                        if (bpf_devices_cgroup_supported())
-                               ops->unified->bpf_device_controller = 1;
+                               ops->unified->utilities |= DEVICES_CONTROLLER;
                        ops->cgroup_layout = CGROUP_LAYOUT_UNIFIED;
                }
        }
index 28db9e97b2ea8c2274d06c60ca263c456815b1b9..85ffb260de66d64fc6bab96037d146639b0d5d70 100644 (file)
@@ -38,6 +38,9 @@ typedef enum {
        UNIFIED_HIERARCHY = CGROUP2_SUPER_MAGIC,
 } cgroupfs_type_magic_t;
 
+#define DEVICES_CONTROLLER (1U << 0)
+#define FREEZER_CONTROLLER (1U << 1)
+
 /* A descriptor for a mounted hierarchy
  *
  * @controllers
@@ -104,13 +107,26 @@ struct hierarchy {
 
        struct /* unified hierarchy specific */ {
                char **delegate;
-               unsigned int bpf_device_controller : 1;
-               unsigned int freezer_controller : 1;
+               unsigned int utilities;
        };
 
        char **controllers;
 };
 
+static inline bool device_utility_controller(const struct hierarchy *h)
+{
+       if (h->fs_type == UNIFIED_HIERARCHY && (h->utilities & DEVICES_CONTROLLER))
+               return true;
+       return false;
+}
+
+static inline bool freezer_utility_controller(const struct hierarchy *h)
+{
+       if (h->fs_type == UNIFIED_HIERARCHY && (h->utilities & FREEZER_CONTROLLER))
+               return true;
+       return false;
+}
+
 struct cgroup_ops {
        /* string constant */
        const char *driver;