diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
index 9411ea2e03..c618e403f7 100644
--- a/man/systemd.unit.xml
+++ b/man/systemd.unit.xml
@@ -1602,14 +1602,23 @@
ConditionControlGroupController=
Check whether given cgroup controllers (e.g. cpu) are available
- for use on the system.
+ for use on the system or whether the legacy v1 cgroup or the modern v2 cgroup hierarchy is used.
+
Multiple controllers may be passed with a space separating them; in this case the condition
will only pass if all listed controllers are available for use. Controllers unknown to systemd are
- ignored. Valid controllers are cpu, cpuset,
- io, memory, and pids. Even if available in
- the kernel, a particular controller may not be available if it was disabled on the kernel command
- line with cgroup_disable=controller.
+ ignored. Valid controllers are cpu, io,
+ memory, and pids. Even if available in the kernel, a
+ particular controller may not be available if it was disabled on the kernel command line with
+ cgroup_disable=controller.
+
+ Alternatively, two special strings v1 and v2 may be
+ specified (without any controller names). v2 will pass if the unified v2 cgroup
+ hierarchy is used, and v1 will pass if the legacy v1 hierarchy or the hybrid
+ hierarchy are used. Note that legacy or hybrid hierarchies have been deprecated. See
+ systemd1 for
+ more information.
+
diff --git a/src/core/unit.c b/src/core/unit.c
index e3a57e3b84..642db41e41 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -1546,7 +1546,8 @@ static int unit_add_mount_dependencies(Unit *u) {
static int unit_add_oomd_dependencies(Unit *u) {
CGroupContext *c;
- bool wants_oomd;
+ CGroupMask mask;
+ int r;
assert(u);
@@ -1557,10 +1558,20 @@ static int unit_add_oomd_dependencies(Unit *u) {
if (!c)
return 0;
- wants_oomd = (c->moom_swap == MANAGED_OOM_KILL || c->moom_mem_pressure == MANAGED_OOM_KILL);
+ bool wants_oomd = c->moom_swap == MANAGED_OOM_KILL || c->moom_mem_pressure == MANAGED_OOM_KILL;
if (!wants_oomd)
return 0;
+ if (!cg_all_unified())
+ return 0;
+
+ r = cg_mask_supported(&mask);
+ if (r < 0)
+ return log_debug_errno(r, "Failed to determine supported controllers: %m");
+
+ if (!FLAGS_SET(mask, CGROUP_MASK_MEMORY))
+ return 0;
+
return unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_WANTS, "systemd-oomd.service", true, UNIT_DEPENDENCY_FILE);
}