cgroups: improve utility controller handling

parent 1845710f
...@@ -123,12 +123,12 @@ static struct hierarchy *get_hierarchy(struct cgroup_ops *ops, const char *contr ...@@ -123,12 +123,12 @@ static struct hierarchy *get_hierarchy(struct cgroup_ops *ops, const char *contr
*/ */
if (pure_unified_layout(ops)) { if (pure_unified_layout(ops)) {
if (strequal(controller, "devices")) { if (strequal(controller, "devices")) {
if (ops->unified->bpf_device_controller) if (device_utility_controller(ops->unified))
return ops->unified; return ops->unified;
break; break;
} else if (strequal(controller, "freezer")) { } else if (strequal(controller, "freezer")) {
if (ops->unified->freezer_controller) if (freezer_utility_controller(ops->unified))
return ops->unified; return ops->unified;
break; break;
...@@ -1400,7 +1400,7 @@ __cgfsng_ops static void cgfsng_payload_finalize(struct cgroup_ops *ops) ...@@ -1400,7 +1400,7 @@ __cgfsng_ops static void cgfsng_payload_finalize(struct cgroup_ops *ops)
!faccessat(ops->unified->dfd_con, "cgroup.freeze", F_OK, !faccessat(ops->unified->dfd_con, "cgroup.freeze", F_OK,
AT_SYMLINK_NOFOLLOW)) { AT_SYMLINK_NOFOLLOW)) {
TRACE("Unified hierarchy supports freezer"); TRACE("Unified hierarchy supports freezer");
ops->unified->freezer_controller = 1; ops->unified->utilities |= FREEZER_CONTROLLER;
} }
} }
...@@ -2836,7 +2836,7 @@ __cgfsng_ops static bool cgfsng_devices_activate(struct cgroup_ops *ops, struct ...@@ -2836,7 +2836,7 @@ __cgfsng_ops static bool cgfsng_devices_activate(struct cgroup_ops *ops, struct
conf = handler->conf; conf = handler->conf;
unified = ops->unified; unified = ops->unified;
if (!unified || !unified->bpf_device_controller || if (!unified || !device_utility_controller(unified) ||
!unified->path_con || !unified->path_con ||
lxc_list_empty(&(conf->bpf_devices).device_item)) lxc_list_empty(&(conf->bpf_devices).device_item))
return true; return true;
...@@ -3220,7 +3220,7 @@ static int __initialize_cgroups(struct cgroup_ops *ops, bool relative, ...@@ -3220,7 +3220,7 @@ static int __initialize_cgroups(struct cgroup_ops *ops, bool relative,
ops->cgroup_layout = CGROUP_LAYOUT_HYBRID; ops->cgroup_layout = CGROUP_LAYOUT_HYBRID;
} else { } else {
if (bpf_devices_cgroup_supported()) if (bpf_devices_cgroup_supported())
ops->unified->bpf_device_controller = 1; ops->unified->utilities |= DEVICES_CONTROLLER;
ops->cgroup_layout = CGROUP_LAYOUT_UNIFIED; ops->cgroup_layout = CGROUP_LAYOUT_UNIFIED;
} }
} }
......
...@@ -38,6 +38,9 @@ typedef enum { ...@@ -38,6 +38,9 @@ typedef enum {
UNIFIED_HIERARCHY = CGROUP2_SUPER_MAGIC, UNIFIED_HIERARCHY = CGROUP2_SUPER_MAGIC,
} cgroupfs_type_magic_t; } cgroupfs_type_magic_t;
#define DEVICES_CONTROLLER (1U << 0)
#define FREEZER_CONTROLLER (1U << 1)
/* A descriptor for a mounted hierarchy /* A descriptor for a mounted hierarchy
* *
* @controllers * @controllers
...@@ -104,13 +107,26 @@ struct hierarchy { ...@@ -104,13 +107,26 @@ struct hierarchy {
struct /* unified hierarchy specific */ { struct /* unified hierarchy specific */ {
char **delegate; char **delegate;
unsigned int bpf_device_controller : 1; unsigned int utilities;
unsigned int freezer_controller : 1;
}; };
char **controllers; 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 { struct cgroup_ops {
/* string constant */ /* string constant */
const char *driver; const char *driver;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment