https://github.com/util-linux/util-linux/commit/508fb0e7ac103b68531a59db2a4473897853ab52
has hit the prominent distributions, revert --issue-file= hack in units/*getty*service.in
-* Once kernel baseline is 5.7, obsolete DefaultMemoryMin/Low= and DefaultStartupMemoryLow=
- since we can systematically enable memory_recursiveprot on cgroupfs and have those
- enforced by the kernel
-
Features:
* systemd-sysupdate: add support a "best before" in manifests (ie. SHA256SUMS)
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly b MemoryAccounting = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultMemoryLow = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultStartupMemoryLow = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultMemoryMin = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly t MemoryMin = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly t MemoryLow = ...;
<!--property MemoryAccounting is not documented!-->
- <!--property DefaultMemoryLow is not documented!-->
-
- <!--property DefaultStartupMemoryLow is not documented!-->
-
- <!--property DefaultMemoryMin is not documented!-->
-
<!--property MemoryMin is not documented!-->
<!--property MemoryLow is not documented!-->
<variablelist class="dbus-property" generated="True" extra-ref="MemoryAccounting"/>
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultMemoryLow"/>
-
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultStartupMemoryLow"/>
-
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultMemoryMin"/>
-
<variablelist class="dbus-property" generated="True" extra-ref="MemoryMin"/>
<variablelist class="dbus-property" generated="True" extra-ref="MemoryLow"/>
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly b MemoryAccounting = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultMemoryLow = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultStartupMemoryLow = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultMemoryMin = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly t MemoryMin = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly t MemoryLow = ...;
<!--property MemoryAccounting is not documented!-->
- <!--property DefaultMemoryLow is not documented!-->
-
- <!--property DefaultStartupMemoryLow is not documented!-->
-
- <!--property DefaultMemoryMin is not documented!-->
-
<!--property MemoryMin is not documented!-->
<!--property MemoryLow is not documented!-->
<variablelist class="dbus-property" generated="True" extra-ref="MemoryAccounting"/>
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultMemoryLow"/>
-
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultStartupMemoryLow"/>
-
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultMemoryMin"/>
-
<variablelist class="dbus-property" generated="True" extra-ref="MemoryMin"/>
<variablelist class="dbus-property" generated="True" extra-ref="MemoryLow"/>
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly b MemoryAccounting = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultMemoryLow = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultStartupMemoryLow = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultMemoryMin = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly t MemoryMin = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly t MemoryLow = ...;
<!--property MemoryAccounting is not documented!-->
- <!--property DefaultMemoryLow is not documented!-->
-
- <!--property DefaultStartupMemoryLow is not documented!-->
-
- <!--property DefaultMemoryMin is not documented!-->
-
<!--property MemoryMin is not documented!-->
<!--property MemoryLow is not documented!-->
<variablelist class="dbus-property" generated="True" extra-ref="MemoryAccounting"/>
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultMemoryLow"/>
-
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultStartupMemoryLow"/>
-
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultMemoryMin"/>
-
<variablelist class="dbus-property" generated="True" extra-ref="MemoryMin"/>
<variablelist class="dbus-property" generated="True" extra-ref="MemoryLow"/>
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly b MemoryAccounting = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultMemoryLow = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultStartupMemoryLow = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultMemoryMin = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly t MemoryMin = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly t MemoryLow = ...;
<!--property MemoryAccounting is not documented!-->
- <!--property DefaultMemoryLow is not documented!-->
-
- <!--property DefaultStartupMemoryLow is not documented!-->
-
- <!--property DefaultMemoryMin is not documented!-->
-
<!--property MemoryMin is not documented!-->
<!--property MemoryLow is not documented!-->
<variablelist class="dbus-property" generated="True" extra-ref="MemoryAccounting"/>
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultMemoryLow"/>
-
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultStartupMemoryLow"/>
-
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultMemoryMin"/>
-
<variablelist class="dbus-property" generated="True" extra-ref="MemoryMin"/>
<variablelist class="dbus-property" generated="True" extra-ref="MemoryLow"/>
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly b MemoryAccounting = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultMemoryLow = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultStartupMemoryLow = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultMemoryMin = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly t MemoryMin = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly t MemoryLow = ...;
<!--property MemoryAccounting is not documented!-->
- <!--property DefaultMemoryLow is not documented!-->
-
- <!--property DefaultStartupMemoryLow is not documented!-->
-
- <!--property DefaultMemoryMin is not documented!-->
-
<!--property MemoryMin is not documented!-->
<!--property MemoryLow is not documented!-->
<variablelist class="dbus-property" generated="True" extra-ref="MemoryAccounting"/>
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultMemoryLow"/>
-
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultStartupMemoryLow"/>
-
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultMemoryMin"/>
-
<variablelist class="dbus-property" generated="True" extra-ref="MemoryMin"/>
<variablelist class="dbus-property" generated="True" extra-ref="MemoryLow"/>
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly b MemoryAccounting = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultMemoryLow = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultStartupMemoryLow = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
- readonly t DefaultMemoryMin = ...;
- @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly t MemoryMin = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly t MemoryLow = ...;
<!--property MemoryAccounting is not documented!-->
- <!--property DefaultMemoryLow is not documented!-->
-
- <!--property DefaultStartupMemoryLow is not documented!-->
-
- <!--property DefaultMemoryMin is not documented!-->
-
<!--property MemoryMin is not documented!-->
<!--property MemoryLow is not documented!-->
<variablelist class="dbus-property" generated="True" extra-ref="MemoryAccounting"/>
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultMemoryLow"/>
-
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultStartupMemoryLow"/>
-
- <variablelist class="dbus-property" generated="True" extra-ref="DefaultMemoryMin"/>
-
<variablelist class="dbus-property" generated="True" extra-ref="MemoryMin"/>
<variablelist class="dbus-property" generated="True" extra-ref="MemoryLow"/>
<varlistentry>
<term><varname>MemoryMin=<replaceable>bytes</replaceable></varname>, <varname>MemoryLow=<replaceable>bytes</replaceable></varname></term>
- <term><varname>StartupMemoryLow=<replaceable>bytes</replaceable></varname>, <varname>DefaultStartupMemoryLow=<replaceable>bytes</replaceable></varname></term>
+ <term><varname>StartupMemoryLow=<replaceable>bytes</replaceable></varname></term>
<listitem>
<para>These settings control the <option>memory</option> controller in the unified hierarchy.</para>
For details about this control group attribute, see <ulink
url="https://docs.kernel.org/admin-guide/cgroup-v2.html#memory-interface-files">Memory Interface Files</ulink>.</para>
- <para>Units may have their children use a default <literal>memory.min</literal> or
- <literal>memory.low</literal> value by specifying <varname>DefaultMemoryMin=</varname> or
- <varname>DefaultMemoryLow=</varname>, which has the same semantics as
- <varname>MemoryMin=</varname> and <varname>MemoryLow=</varname>, or <varname>DefaultStartupMemoryLow=</varname>
- which has the same semantics as <varname>StartupMemoryLow=</varname>.
- This setting does not affect <literal>memory.min</literal> or <literal>memory.low</literal>
- in the unit itself.
- Using it to set a default child allocation is only useful on kernels older than 5.7,
- which do not support the <literal>memory_recursiveprot</literal> cgroup2 mount option.</para>
-
<para>While <varname>StartupMemoryLow=</varname> applies to the startup and shutdown phases of the system,
<varname>MemoryMin=</varname> applies to normal runtime of the system, and if the former is not set also to
the startup and shutdown phases. Using <varname>StartupMemoryLow=</varname> allows prioritizing specific services at
bool startup = u->manager && IN_SET(manager_state(u->manager), MANAGER_STARTING, MANAGER_INITIALIZING, MANAGER_STOPPING);
if (streq(property_name, "MemoryLow")) {
- unit_value = unit_get_ancestor_memory_low(u);
+ unit_value = c->memory_low;
file = "memory.low";
} else if (startup && streq(property_name, "StartupMemoryLow")) {
- unit_value = unit_get_ancestor_startup_memory_low(u);
+ unit_value = c->startup_memory_low;
file = "memory.low";
} else if (streq(property_name, "MemoryMin")) {
- unit_value = unit_get_ancestor_memory_min(u);
+ unit_value = c->memory_min;
file = "memory.min";
} else if (streq(property_name, "MemoryHigh")) {
unit_value = c->memory_high;
"%sStartupAllowedMemoryNodes: %s\n"
"%sIOWeight: %" PRIu64 "\n"
"%sStartupIOWeight: %" PRIu64 "\n"
- "%sDefaultMemoryMin: %" PRIu64 "\n"
- "%sDefaultMemoryLow: %" PRIu64 "\n"
"%sMemoryMin: %" PRIu64 "%s\n"
"%sMemoryLow: %" PRIu64 "%s\n"
"%sStartupMemoryLow: %" PRIu64 "%s\n"
prefix, strempty(startup_cpuset_mems),
prefix, c->io_weight,
prefix, c->startup_io_weight,
- prefix, c->default_memory_min,
- prefix, c->default_memory_low,
prefix, c->memory_min, format_cgroup_memory_limit_comparison(u, "MemoryMin", cda, sizeof(cda)),
prefix, c->memory_low, format_cgroup_memory_limit_comparison(u, "MemoryLow", cdb, sizeof(cdb)),
prefix, c->startup_memory_low, format_cgroup_memory_limit_comparison(u, "StartupMemoryLow", cdc, sizeof(cdc)),
return 0;
}
-#define UNIT_DEFINE_ANCESTOR_MEMORY_LOOKUP(entry) \
- uint64_t unit_get_ancestor_##entry(Unit *u) { \
- CGroupContext *c; \
- \
- /* 1. Is entry set in this unit? If so, use that. \
- * 2. Is the default for this entry set in any \
- * ancestor? If so, use that. \
- * 3. Otherwise, return CGROUP_LIMIT_MIN. */ \
- \
- assert(u); \
- \
- c = unit_get_cgroup_context(u); \
- if (c && c->entry##_set) \
- return c->entry; \
- \
- while ((u = UNIT_GET_SLICE(u))) { \
- c = unit_get_cgroup_context(u); \
- if (c && c->default_##entry##_set) \
- return c->default_##entry; \
- } \
- \
- /* We've reached the root, but nobody had default for \
- * this entry set, so set it to the kernel default. */ \
- return CGROUP_LIMIT_MIN; \
-}
-
-UNIT_DEFINE_ANCESTOR_MEMORY_LOOKUP(memory_low);
-UNIT_DEFINE_ANCESTOR_MEMORY_LOOKUP(startup_memory_low);
-UNIT_DEFINE_ANCESTOR_MEMORY_LOOKUP(memory_min);
-
static void unit_set_xattr_graceful(Unit *u, const char *name, const void *data, size_t size) {
int r;
(void) set_attribute_and_warn(u, "io.max", buf);
}
-static bool unit_has_memory_config(Unit *u) {
- CGroupContext *c;
-
- assert(u);
-
- assert_se(c = unit_get_cgroup_context(u));
+static bool cgroup_context_has_memory_config(CGroupContext *c) {
+ assert(c);
- return unit_get_ancestor_memory_min(u) > 0 ||
- unit_get_ancestor_memory_low(u) > 0 || unit_get_ancestor_startup_memory_low(u) > 0 ||
+ return c->memory_min > 0 ||
+ c->memory_low > 0 || c->startup_memory_low_set ||
c->memory_high != CGROUP_LIMIT_MAX || c->startup_memory_high_set ||
c->memory_max != CGROUP_LIMIT_MAX || c->startup_memory_max_set ||
c->memory_swap_max != CGROUP_LIMIT_MAX || c->startup_memory_swap_max_set ||
/* 'memory' attributes do not exist on the root cgroup. */
if ((apply_mask & CGROUP_MASK_MEMORY) && !is_local_root) {
- uint64_t max = CGROUP_LIMIT_MAX, swap_max = CGROUP_LIMIT_MAX, zswap_max = CGROUP_LIMIT_MAX, high = CGROUP_LIMIT_MAX;
+ uint64_t low = CGROUP_LIMIT_MIN, max = CGROUP_LIMIT_MAX, swap_max = CGROUP_LIMIT_MAX, zswap_max = CGROUP_LIMIT_MAX, high = CGROUP_LIMIT_MAX;
- if (unit_has_memory_config(u)) {
+ if (cgroup_context_has_memory_config(c)) {
bool startup = IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING, MANAGER_STOPPING);
+ low = startup && c->startup_memory_low_set ? c->startup_memory_low : c->memory_low;
high = startup && c->startup_memory_high_set ? c->startup_memory_high : c->memory_high;
max = startup && c->startup_memory_max_set ? c->startup_memory_max : c->memory_max;
swap_max = startup && c->startup_memory_swap_max_set ? c->startup_memory_swap_max : c->memory_swap_max;
zswap_max = startup && c->startup_memory_zswap_max_set ? c->startup_memory_zswap_max : c->memory_zswap_max;
}
- cgroup_apply_memory_limit(u, "memory.min", unit_get_ancestor_memory_min(u));
- cgroup_apply_memory_limit(u, "memory.low", unit_get_ancestor_memory_low(u));
+ cgroup_apply_memory_limit(u, "memory.min", c->memory_min);
+ cgroup_apply_memory_limit(u, "memory.low", low);
cgroup_apply_memory_limit(u, "memory.high", high);
cgroup_apply_memory_limit(u, "memory.max", max);
cgroup_apply_memory_limit(u, "memory.swap.max", swap_max);
mask |= CGROUP_MASK_IO;
if (c->memory_accounting ||
- unit_has_memory_config(u))
+ cgroup_context_has_memory_config(c))
mask |= CGROUP_MASK_MEMORY;
if (cgroup_context_has_device_policy(c))
LIST_HEAD(CGroupIODeviceLimit, io_device_limits);
LIST_HEAD(CGroupIODeviceLatency, io_device_latencies);
- uint64_t default_memory_min;
- uint64_t default_memory_low;
- uint64_t default_startup_memory_low;
uint64_t memory_min;
uint64_t memory_low;
uint64_t startup_memory_low;
uint64_t memory_zswap_max;
uint64_t startup_memory_zswap_max;
- bool default_memory_min_set:1;
- bool default_memory_low_set:1;
- bool default_startup_memory_low_set:1;
- bool memory_min_set:1;
- bool memory_low_set:1;
bool startup_memory_low_set:1;
bool startup_memory_high_set:1;
bool startup_memory_max_set:1;
Unit* manager_get_unit_by_pidref_watching(Manager *m, const PidRef *pid);
Unit* manager_get_unit_by_pidref(Manager *m, PidRef *pid);
-uint64_t unit_get_ancestor_memory_min(Unit *u);
-uint64_t unit_get_ancestor_memory_low(Unit *u);
-uint64_t unit_get_ancestor_startup_memory_low(Unit *u);
-
int unit_search_main_pid(Unit *u, PidRef *ret);
int unit_get_memory_available(Unit *u, uint64_t *ret);
SD_BUS_PROPERTY("IOWriteIOPSMax", "a(st)", property_get_io_device_limits, 0, 0),
SD_BUS_PROPERTY("IODeviceLatencyTargetUSec", "a(st)", property_get_io_device_latency, 0, 0),
SD_BUS_PROPERTY("MemoryAccounting", "b", bus_property_get_bool, offsetof(CGroupContext, memory_accounting), 0),
- SD_BUS_PROPERTY("DefaultMemoryLow", "t", NULL, offsetof(CGroupContext, default_memory_low), 0),
- SD_BUS_PROPERTY("DefaultStartupMemoryLow", "t", NULL, offsetof(CGroupContext, default_startup_memory_low), 0),
- SD_BUS_PROPERTY("DefaultMemoryMin", "t", NULL, offsetof(CGroupContext, default_memory_min), 0),
SD_BUS_PROPERTY("MemoryMin", "t", NULL, offsetof(CGroupContext, memory_min), 0),
SD_BUS_PROPERTY("MemoryLow", "t", NULL, offsetof(CGroupContext, memory_low), 0),
SD_BUS_PROPERTY("StartupMemoryLow", "t", NULL, offsetof(CGroupContext, startup_memory_low), 0),
SD_BUS_PROPERTY("BlockIOWriteBandwidth", "a(st)", property_get_blockio_ast, 0, SD_BUS_VTABLE_DEPRECATED|SD_BUS_VTABLE_HIDDEN),
/* since kernel v4.15 CPU accounting requires no controller, i.e. is available everywhere */
SD_BUS_PROPERTY("CPUAccounting", "b", bus_property_get_bool_true, 0, SD_BUS_VTABLE_DEPRECATED|SD_BUS_VTABLE_HIDDEN),
+ /* since kernel v5.7 kernel would take care of these when cgroup is mounted with memory_recursiveprot */
+ SD_BUS_PROPERTY("DefaultMemoryMin", "t", bus_property_get_uint64_0, 0, SD_BUS_VTABLE_DEPRECATED|SD_BUS_VTABLE_HIDDEN),
+ SD_BUS_PROPERTY("DefaultMemoryLow", "t", bus_property_get_uint64_0, 0, SD_BUS_VTABLE_DEPRECATED|SD_BUS_VTABLE_HIDDEN),
+ SD_BUS_PROPERTY("DefaultStartupMemoryLow", "t", bus_property_get_uint64_0, 0, SD_BUS_VTABLE_DEPRECATED|SD_BUS_VTABLE_HIDDEN),
SD_BUS_VTABLE_END
};
if (streq(name, "MemoryAccounting"))
return bus_cgroup_set_boolean(u, name, &c->memory_accounting, CGROUP_MASK_MEMORY, message, flags, reterr_error);
- if (streq(name, "MemoryMin")) {
- r = bus_cgroup_set_memory_protection(u, name, &c->memory_min, message, flags, reterr_error);
- if (r > 0)
- c->memory_min_set = true;
- return r;
- }
+ if (streq(name, "MemoryMin"))
+ return bus_cgroup_set_memory_protection(u, name, &c->memory_min, message, flags, reterr_error);
- if (streq(name, "MemoryLow")) {
- r = bus_cgroup_set_memory_protection(u, name, &c->memory_low, message, flags, reterr_error);
- if (r > 0)
- c->memory_low_set = true;
- return r;
- }
+ if (streq(name, "MemoryLow"))
+ return bus_cgroup_set_memory_protection(u, name, &c->memory_low, message, flags, reterr_error);
if (streq(name, "StartupMemoryLow")) {
r = bus_cgroup_set_memory_protection(u, name, &c->startup_memory_low, message, flags, reterr_error);
return r;
}
- if (streq(name, "DefaultMemoryMin")) {
- r = bus_cgroup_set_memory_protection(u, name, &c->default_memory_min, message, flags, reterr_error);
- if (r > 0)
- c->default_memory_min_set = true;
- return r;
- }
-
- if (streq(name, "DefaultMemoryLow")) {
- r = bus_cgroup_set_memory_protection(u, name, &c->default_memory_low, message, flags, reterr_error);
- if (r > 0)
- c->default_memory_low_set = true;
- return r;
- }
-
- if (streq(name, "DefaultStartupMemoryLow")) {
- r = bus_cgroup_set_memory_protection(u, name, &c->default_startup_memory_low, message, flags, reterr_error);
- if (r > 0)
- c->default_startup_memory_low_set = true;
- return r;
- }
-
if (streq(name, "MemoryHigh"))
return bus_cgroup_set_memory(u, name, &c->memory_high, message, flags, reterr_error);
return r;
}
- if (streq(name, "MemoryMinScale")) {
- r = bus_cgroup_set_memory_protection_scale(u, name, &c->memory_min, message, flags, reterr_error);
- if (r > 0)
- c->memory_min_set = true;
- return r;
- }
-
- if (streq(name, "MemoryLowScale")) {
- r = bus_cgroup_set_memory_protection_scale(u, name, &c->memory_low, message, flags, reterr_error);
- if (r > 0)
- c->memory_low_set = true;
- return r;
- }
-
- if (streq(name, "DefaultMemoryMinScale")) {
- r = bus_cgroup_set_memory_protection_scale(u, name, &c->default_memory_min, message, flags, reterr_error);
- if (r > 0)
- c->default_memory_min_set = true;
- return r;
- }
+ if (streq(name, "MemoryMinScale"))
+ return bus_cgroup_set_memory_protection_scale(u, name, &c->memory_min, message, flags, reterr_error);
- if (streq(name, "DefaultMemoryLowScale")) {
- r = bus_cgroup_set_memory_protection_scale(u, name, &c->default_memory_low, message, flags, reterr_error);
- if (r > 0)
- c->default_memory_low_set = true;
- return r;
- }
+ if (streq(name, "MemoryLowScale"))
+ return bus_cgroup_set_memory_protection_scale(u, name, &c->memory_low, message, flags, reterr_error);
if (streq(name, "MemoryHighScale"))
return bus_cgroup_set_memory_scale(u, name, &c->memory_high, message, flags, reterr_error);
return 1;
}
- /* deprecated CGroup v1 properties */
if (STR_IN_SET(name,
+ /* deprecated CGroup v1 properties */
"MemoryLimit",
"MemoryLimitScale",
"CPUShares",
"BlockIODeviceWeight",
"BlockIOReadBandwidth",
"BlockIOWriteBandwidth",
- "CPUAccounting")) { /* see comment in bus_cgroup_vtable */
+ /* see comments in bus_cgroup_vtable */
+ "CPUAccounting",
+ "DefaultMemoryMin",
+ "DefaultMemoryMinScale",
+ "DefaultMemoryLow",
+ "DefaultMemoryLowScale",
+ "DefaultStartupMemoryLow")) {
r = sd_bus_message_skip(message, NULL);
if (r < 0)
return r;
}
- if (c->default_memory_min > 0) {
- r = serialize_item_format(f, "exec-cgroup-context-default-memory-min", "%" PRIu64, c->default_memory_min);
- if (r < 0)
- return r;
- }
-
- if (c->default_memory_low > 0) {
- r = serialize_item_format(f, "exec-cgroup-context-default-memory-low", "%" PRIu64, c->default_memory_low);
- if (r < 0)
- return r;
- }
-
if (c->memory_min > 0) {
r = serialize_item_format(f, "exec-cgroup-context-memory-min", "%" PRIu64, c->memory_min);
if (r < 0)
return r;
}
- r = serialize_bool_elide(f, "exec-cgroup-context-default-memory-min-set", c->default_memory_min_set);
- if (r < 0)
- return r;
-
- r = serialize_bool_elide(f, "exec-cgroup-context-default-memory-low-set", c->default_memory_low_set);
- if (r < 0)
- return r;
-
- r = serialize_bool_elide(f, "exec-cgroup-context-default-startup-memory-low-set", c->default_startup_memory_low_set);
- if (r < 0)
- return r;
-
- r = serialize_bool_elide(f, "exec-cgroup-context-memory-min-set", c->memory_min_set);
- if (r < 0)
- return r;
-
- r = serialize_bool_elide(f, "exec-cgroup-context-memory-low-set", c->memory_low_set);
- if (r < 0)
- return r;
-
r = serialize_bool_elide(f, "exec-cgroup-context-startup-memory-low-set", c->startup_memory_low_set);
if (r < 0)
return r;
r = safe_atou64(val, &c->startup_io_weight);
if (r < 0)
return r;
- } else if ((val = startswith(l, "exec-cgroup-context-default-memory-min="))) {
- r = safe_atou64(val, &c->default_memory_min);
- if (r < 0)
- return r;
- } else if ((val = startswith(l, "exec-cgroup-context-default-memory-low="))) {
- r = safe_atou64(val, &c->default_memory_low);
- if (r < 0)
- return r;
} else if ((val = startswith(l, "exec-cgroup-context-memory-min="))) {
r = safe_atou64(val, &c->memory_min);
if (r < 0)
r = safe_atou64(val, &c->tasks_max.scale);
if (r < 0)
return r;
- } else if ((val = startswith(l, "exec-cgroup-context-default-memory-min-set="))) {
- r = parse_boolean(val);
- if (r < 0)
- return r;
- c->default_memory_min_set = r;
- } else if ((val = startswith(l, "exec-cgroup-context-default-memory-low-set="))) {
- r = parse_boolean(val);
- if (r < 0)
- return r;
- c->default_memory_low_set = r;
- } else if ((val = startswith(l, "exec-cgroup-context-default-startup-memory-low-set="))) {
- r = parse_boolean(val);
- if (r < 0)
- return r;
- c->default_startup_memory_low_set = r;
- } else if ((val = startswith(l, "exec-cgroup-context-memory-min-set="))) {
- r = parse_boolean(val);
- if (r < 0)
- return r;
- c->memory_min_set = r;
- } else if ((val = startswith(l, "exec-cgroup-context-memory-low-set="))) {
- r = parse_boolean(val);
- if (r < 0)
- return r;
- c->memory_low_set = r;
} else if ((val = startswith(l, "exec-cgroup-context-startup-memory-low-set="))) {
r = parse_boolean(val);
if (r < 0)
{{type}}.CPUQuotaPeriodSec, config_parse_sec_def_infinity, 0, offsetof({{type}}, cgroup_context.cpu_quota_period_usec)
{{type}}.MemoryAccounting, config_parse_bool, 0, offsetof({{type}}, cgroup_context.memory_accounting)
{{type}}.MemoryMin, config_parse_memory_limit, 0, offsetof({{type}}, cgroup_context)
-{{type}}.DefaultMemoryMin, config_parse_memory_limit, 0, offsetof({{type}}, cgroup_context)
-{{type}}.DefaultMemoryLow, config_parse_memory_limit, 0, offsetof({{type}}, cgroup_context)
-{{type}}.DefaultStartupMemoryLow, config_parse_memory_limit, 0, offsetof({{type}}, cgroup_context)
{{type}}.MemoryLow, config_parse_memory_limit, 0, offsetof({{type}}, cgroup_context)
{{type}}.StartupMemoryLow, config_parse_memory_limit, 0, offsetof({{type}}, cgroup_context)
+{{type}}.DefaultMemoryMin, config_parse_warn_compat, DISABLED_LEGACY, 0
+{{type}}.DefaultMemoryLow, config_parse_warn_compat, DISABLED_LEGACY, 0
+{{type}}.DefaultStartupMemoryLow, config_parse_warn_compat, DISABLED_LEGACY, 0
{{type}}.MemoryHigh, config_parse_memory_limit, 0, offsetof({{type}}, cgroup_context)
{{type}}.StartupMemoryHigh, config_parse_memory_limit, 0, offsetof({{type}}, cgroup_context)
{{type}}.MemoryMax, config_parse_memory_limit, 0, offsetof({{type}}, cgroup_context)
uint64_t bytes = CGROUP_LIMIT_MAX;
int r;
- if (isempty(rvalue) && STR_IN_SET(lvalue, "DefaultMemoryLow",
- "DefaultMemoryMin",
- "MemoryLow",
+ if (isempty(rvalue) && STR_IN_SET(lvalue, "MemoryLow",
"StartupMemoryLow",
"MemoryMin"))
bytes = CGROUP_LIMIT_MIN;
"StartupMemoryZSwapMax",
"MemoryLow",
"StartupMemoryLow",
- "MemoryMin",
- "DefaultMemoryLow",
- "DefaultstartupMemoryLow",
- "DefaultMemoryMin"))) {
+ "MemoryMin"))) {
log_syntax(unit, LOG_WARNING, filename, line, 0, "Memory limit '%s' out of range, ignoring.", rvalue);
return 0;
}
}
- if (streq(lvalue, "DefaultMemoryLow")) {
- c->default_memory_low = bytes;
- c->default_memory_low_set = true;
- } else if (streq(lvalue, "DefaultStartupMemoryLow")) {
- c->default_startup_memory_low = bytes;
- c->default_startup_memory_low_set = true;
- } else if (streq(lvalue, "DefaultMemoryMin")) {
- c->default_memory_min = bytes;
- c->default_memory_min_set = true;
- } else if (streq(lvalue, "MemoryMin")) {
+ if (streq(lvalue, "MemoryMin"))
c->memory_min = bytes;
- c->memory_min_set = true;
- } else if (streq(lvalue, "MemoryLow")) {
+ else if (streq(lvalue, "MemoryLow"))
c->memory_low = bytes;
- c->memory_low_set = true;
- } else if (streq(lvalue, "StartupMemoryLow")) {
+ else if (streq(lvalue, "StartupMemoryLow")) {
c->startup_memory_low = bytes;
c->startup_memory_low_set = true;
} else if (streq(lvalue, "MemoryHigh"))
/* Memory Accounting and Control */
SD_JSON_BUILD_PAIR_BOOLEAN("MemoryAccounting", c->memory_accounting),
- JSON_BUILD_PAIR_CONDITION_UNSIGNED(c->memory_min_set, "MemoryMin", c->memory_min),
- JSON_BUILD_PAIR_CONDITION_UNSIGNED(c->default_memory_min_set, "DefaultMemoryMin", c->default_memory_min),
- JSON_BUILD_PAIR_CONDITION_UNSIGNED(c->memory_low_set, "MemoryLow", c->memory_low),
- JSON_BUILD_PAIR_CONDITION_UNSIGNED(c->default_memory_low_set, "DefaultMemoryLow", c->default_memory_low),
+ JSON_BUILD_PAIR_UNSIGNED_NOT_EQUAL("MemoryMin", c->memory_min, CGROUP_LIMIT_MIN),
+ JSON_BUILD_PAIR_UNSIGNED_NOT_EQUAL("MemoryLow", c->memory_low, CGROUP_LIMIT_MIN),
JSON_BUILD_PAIR_CONDITION_UNSIGNED(c->startup_memory_low_set, "StartupMemoryLow", c->startup_memory_low),
- JSON_BUILD_PAIR_CONDITION_UNSIGNED(c->default_startup_memory_low_set, "DefaultStartupMemoryLow", c->default_startup_memory_low),
JSON_BUILD_PAIR_UNSIGNED_NOT_EQUAL("MemoryHigh", c->memory_high, CGROUP_LIMIT_MAX),
JSON_BUILD_PAIR_CONDITION_UNSIGNED(c->startup_memory_high_set, "StartupMemoryHigh", c->startup_memory_high),
JSON_BUILD_PAIR_UNSIGNED_NOT_EQUAL("MemoryMax", c->memory_max, CGROUP_LIMIT_MAX),
BUS_DEFINE_PROPERTY_GET_GLOBAL(bus_property_get_bool_false, "b", 0);
BUS_DEFINE_PROPERTY_GET_GLOBAL(bus_property_get_bool_true, "b", 1);
+BUS_DEFINE_PROPERTY_GET_GLOBAL(bus_property_get_uint64_0, "t", UINT64_C(0));
BUS_DEFINE_PROPERTY_GET_GLOBAL(bus_property_get_uint64_max, "t", UINT64_MAX);
int bus_property_get_bool(
/* For deprecated properties. */
int bus_property_get_bool_false(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *reterr_error);
int bus_property_get_bool_true(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *reterr_error);
+int bus_property_get_uint64_0(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *reterr_error);
int bus_property_get_uint64_max(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *reterr_error);
if (isempty(eq) || streq(eq, "infinity")) {
uint64_t x = streq(eq, "infinity") ? CGROUP_LIMIT_MAX :
STR_IN_SET(field,
- "DefaultMemoryLow",
- "DefaultMemoryMin",
"MemoryLow",
"MemoryMin") ? CGROUP_LIMIT_MIN : CGROUP_LIMIT_MAX;
{ "DisableControllers", bus_append_strv },
{ "Delegate", bus_append_parse_delegate },
{ "MemoryMin", bus_append_parse_resource_limit },
- { "DefaultMemoryLow", bus_append_parse_resource_limit },
- { "DefaultMemoryMin", bus_append_parse_resource_limit },
{ "MemoryLow", bus_append_parse_resource_limit },
{ "MemoryHigh", bus_append_parse_resource_limit },
{ "MemoryMax", bus_append_parse_resource_limit },
{ "BlockIOReadBandwidth", warn_deprecated },
{ "BlockIOWriteBandwidth", warn_deprecated },
{ "CPUAccounting", warn_deprecated },
+ { "DefaultMemoryMin", warn_deprecated },
+ { "DefaultMemoryLow", warn_deprecated },
{ NULL, bus_try_append_parse_cgroup_io_limit, cgroup_io_limits_list },
{}
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.resource-control.html#MemoryMin=bytes,%20MemoryLow=bytes"),
SD_VARLINK_DEFINE_FIELD(MemoryMin, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.resource-control.html#MemoryMin=bytes,%20MemoryLow=bytes"),
- SD_VARLINK_DEFINE_FIELD(DefaultMemoryMin, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
- SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.resource-control.html#MemoryMin=bytes,%20MemoryLow=bytes"),
SD_VARLINK_DEFINE_FIELD(MemoryLow, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.resource-control.html#MemoryMin=bytes,%20MemoryLow=bytes"),
- SD_VARLINK_DEFINE_FIELD(DefaultMemoryLow, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
- SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.resource-control.html#MemorySwapMax=bytes"),
SD_VARLINK_DEFINE_FIELD(StartupMemoryLow, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
- SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.resource-control.html#MemoryMin=bytes,%20MemoryLow=bytes"),
- SD_VARLINK_DEFINE_FIELD(DefaultStartupMemoryLow, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.resource-control.html#MemoryHigh=bytes"),
SD_VARLINK_DEFINE_FIELD(MemoryHigh, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.resource-control.html#MemoryHigh=bytes"),
uint64_t io_read_bytes;
uint64_t io_write_bytes;
- uint64_t default_memory_min;
- uint64_t default_memory_low;
- uint64_t default_startup_memory_low;
-
/* Exec Quotas */
QuotaInfo exec_directories_quota[_EXEC_DIRECTORY_TYPE_MAX];
{ "MemorySwapPeak", "t", NULL, offsetof(UnitStatusInfo, memory_swap_peak) },
{ "MemoryZSwapCurrent", "t", NULL, offsetof(UnitStatusInfo, memory_zswap_current) },
{ "MemoryAvailable", "t", NULL, offsetof(UnitStatusInfo, memory_available) },
- { "DefaultMemoryMin", "t", NULL, offsetof(UnitStatusInfo, default_memory_min) },
- { "DefaultMemoryLow", "t", NULL, offsetof(UnitStatusInfo, default_memory_low) },
- { "DefaultStartupMemoryLow", "t", NULL, offsetof(UnitStatusInfo, default_startup_memory_low) },
{ "MemoryMin", "t", NULL, offsetof(UnitStatusInfo, memory_min) },
{ "MemoryLow", "t", NULL, offsetof(UnitStatusInfo, memory_low) },
{ "StartupMemoryLow", "t", NULL, offsetof(UnitStatusInfo, startup_memory_low) },
'sources' : files('test-cgroup-mask.c'),
'dependencies' : common_test_dependencies,
},
- core_test_template + {
- 'sources' : files('test-cgroup-unit-default.c'),
- },
core_test_template + {
'sources' : files('test-chown-rec.c'),
},
+++ /dev/null
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-
-#include "cgroup.h"
-#include "manager.h"
-#include "rm-rf.h"
-#include "tests.h"
-#include "unit.h"
-
-TEST_RET(default_memory_low, .sd_booted = true) {
- _cleanup_(rm_rf_physical_and_freep) char *runtime_dir = NULL;
- _cleanup_(manager_freep) Manager *m = NULL;
- Unit *root, *dml,
- *dml_passthrough, *dml_passthrough_empty, *dml_passthrough_set_dml, *dml_passthrough_set_ml,
- *dml_override, *dml_override_empty,
- *dml_discard, *dml_discard_empty, *dml_discard_set_ml;
- uint64_t dml_tree_default;
- int r;
-
- r = enter_cgroup_subroot(NULL);
- if (r == -ENOMEDIUM)
- return log_tests_skipped("cgroupfs not available");
-
- _cleanup_free_ char *unit_dir = NULL;
- ASSERT_OK(get_testdata_dir("test-cgroup-unit-default", &unit_dir));
- ASSERT_OK(setenv_unit_path(unit_dir));
- assert_se(runtime_dir = setup_fake_runtime_dir());
- r = manager_new(RUNTIME_SCOPE_USER, MANAGER_TEST_RUN_BASIC, &m);
- if (IN_SET(r, -EPERM, -EACCES)) {
- log_error_errno(r, "manager_new: %m");
- return log_tests_skipped("cannot create manager");
- }
-
- ASSERT_OK(r);
- ASSERT_OK(manager_startup(m, NULL, NULL, NULL));
-
- /* dml.slice has DefaultMemoryLow=50. Beyond that, individual subhierarchies look like this:
- *
- * 1. dml-passthrough.slice sets MemoryLow=100. This should not affect its children, as only
- * DefaultMemoryLow is propagated, not MemoryLow. As such, all leaf services should end up with
- * memory.low as 50, inherited from dml.slice, *except* for dml-passthrough-set-ml.service, which
- * should have the value of 0, as it has MemoryLow explicitly set.
- *
- * ┌───────────┐
- * │ dml.slice │
- * └─────┬─────┘
- * MemoryLow=100
- * ┌───────────┴───────────┐
- * │ dml-passthrough.slice │
- * └───────────┬───────────┘
- * ┌───────────────────────────────────┼───────────────────────────────────┐
- * no new settings DefaultMemoryLow=15 MemoryLow=0
- * ┌───────────────┴───────────────┐ ┌────────────────┴────────────────┐ ┌───────────────┴────────────────┐
- * │ dml-passthrough-empty.service │ │ dml-passthrough-set-dml.service │ │ dml-passthrough-set-ml.service │
- * └───────────────────────────────┘ └─────────────────────────────────┘ └────────────────────────────────┘
- *
- * 2. dml-override.slice sets DefaultMemoryLow=10. As such, dml-override-empty.service should also
- * end up with a memory.low of 10. dml-override.slice should still have a memory.low of 50.
- *
- * ┌───────────┐
- * │ dml.slice │
- * └─────┬─────┘
- * DefaultMemoryLow=10
- * ┌─────────┴──────────┐
- * │ dml-override.slice │
- * └─────────┬──────────┘
- * no new settings
- * ┌─────────────┴──────────────┐
- * │ dml-override-empty.service │
- * └────────────────────────────┘
- *
- * 3. dml-discard.slice sets DefaultMemoryLow= with no rvalue. As such,
- * dml-discard-empty.service should end up with a value of 0.
- * dml-discard-set-ml.service sets MemoryLow=15, and as such should have that override the
- * reset DefaultMemoryLow value. dml-discard.slice should still have an eventual memory.low of 50.
- *
- * ┌───────────┐
- * │ dml.slice │
- * └─────┬─────┘
- * DefaultMemoryLow=
- * ┌─────────┴─────────┐
- * │ dml-discard.slice │
- * └─────────┬─────────┘
- * ┌──────────────┴───────────────┐
- * no new settings MemoryLow=15
- * ┌─────────────┴─────────────┐ ┌─────────────┴──────────────┐
- * │ dml-discard-empty.service │ │ dml-discard-set-ml.service │
- * └───────────────────────────┘ └────────────────────────────┘
- */
- ASSERT_OK(manager_load_startable_unit_or_warn(m, "dml.slice", NULL, &dml));
-
- ASSERT_OK(manager_load_startable_unit_or_warn(m, "dml-passthrough.slice", NULL, &dml_passthrough));
- assert_se(UNIT_GET_SLICE(dml_passthrough) == dml);
- ASSERT_OK(manager_load_startable_unit_or_warn(m, "dml-passthrough-empty.service", NULL, &dml_passthrough_empty));
- assert_se(UNIT_GET_SLICE(dml_passthrough_empty) == dml_passthrough);
- ASSERT_OK(manager_load_startable_unit_or_warn(m, "dml-passthrough-set-dml.service", NULL, &dml_passthrough_set_dml));
- assert_se(UNIT_GET_SLICE(dml_passthrough_set_dml) == dml_passthrough);
- ASSERT_OK(manager_load_startable_unit_or_warn(m, "dml-passthrough-set-ml.service", NULL, &dml_passthrough_set_ml));
- assert_se(UNIT_GET_SLICE(dml_passthrough_set_ml) == dml_passthrough);
-
- ASSERT_OK(manager_load_startable_unit_or_warn(m, "dml-override.slice", NULL, &dml_override));
- assert_se(UNIT_GET_SLICE(dml_override) == dml);
- ASSERT_OK(manager_load_startable_unit_or_warn(m, "dml-override-empty.service", NULL, &dml_override_empty));
- assert_se(UNIT_GET_SLICE(dml_override_empty) == dml_override);
-
- ASSERT_OK(manager_load_startable_unit_or_warn(m, "dml-discard.slice", NULL, &dml_discard));
- assert_se(UNIT_GET_SLICE(dml_discard) == dml);
- ASSERT_OK(manager_load_startable_unit_or_warn(m, "dml-discard-empty.service", NULL, &dml_discard_empty));
- assert_se(UNIT_GET_SLICE(dml_discard_empty) == dml_discard);
- ASSERT_OK(manager_load_startable_unit_or_warn(m, "dml-discard-set-ml.service", NULL, &dml_discard_set_ml));
- assert_se(UNIT_GET_SLICE(dml_discard_set_ml) == dml_discard);
-
- assert_se(root = UNIT_GET_SLICE(dml));
- assert_se(!UNIT_GET_SLICE(root));
-
- assert_se(unit_get_ancestor_memory_low(root) == CGROUP_LIMIT_MIN);
-
- assert_se(unit_get_ancestor_memory_low(dml) == CGROUP_LIMIT_MIN);
- dml_tree_default = unit_get_cgroup_context(dml)->default_memory_low;
- assert_se(dml_tree_default == 50);
-
- assert_se(unit_get_ancestor_memory_low(dml_passthrough) == 100);
- assert_se(unit_get_ancestor_memory_low(dml_passthrough_empty) == dml_tree_default);
- assert_se(unit_get_ancestor_memory_low(dml_passthrough_set_dml) == 50);
- assert_se(unit_get_ancestor_memory_low(dml_passthrough_set_ml) == 0);
-
- assert_se(unit_get_ancestor_memory_low(dml_override) == dml_tree_default);
- assert_se(unit_get_ancestor_memory_low(dml_override_empty) == 10);
-
- assert_se(unit_get_ancestor_memory_low(dml_discard) == dml_tree_default);
- assert_se(unit_get_ancestor_memory_low(dml_discard_empty) == CGROUP_LIMIT_MIN);
- assert_se(unit_get_ancestor_memory_low(dml_discard_set_ml) == 15);
-
- return 0;
-}
-
-DEFINE_TEST_MAIN(LOG_DEBUG);
'journal-data',
'knot-data',
'test-cgroup-mask',
- 'test-cgroup-unit-default',
'test-engine',
'test-execute',
'test-fstab-generator',
+++ /dev/null
-# SPDX-License-Identifier: LGPL-2.1-or-later
-[Unit]
-Description=DML discard empty service
-
-[Service]
-Slice=dml-discard.slice
-Type=oneshot
-ExecStart=true
+++ /dev/null
-# SPDX-License-Identifier: LGPL-2.1-or-later
-[Unit]
-Description=DML discard set ml service
-
-[Service]
-Slice=dml-discard.slice
-Type=oneshot
-ExecStart=true
-MemoryLow=15
+++ /dev/null
-# SPDX-License-Identifier: LGPL-2.1-or-later
-[Unit]
-Description=DML discard slice
-
-[Slice]
-DefaultMemoryLow=
+++ /dev/null
-# SPDX-License-Identifier: LGPL-2.1-or-later
-[Unit]
-Description=DML override empty service
-
-[Service]
-Slice=dml-override.slice
-Type=oneshot
-ExecStart=true
+++ /dev/null
-# SPDX-License-Identifier: LGPL-2.1-or-later
-[Unit]
-Description=DML override slice
-
-[Slice]
-DefaultMemoryLow=10
+++ /dev/null
-# SPDX-License-Identifier: LGPL-2.1-or-later
-[Unit]
-Description=DML passthrough empty service
-
-[Service]
-Slice=dml-passthrough.slice
-Type=oneshot
-ExecStart=true
+++ /dev/null
-# SPDX-License-Identifier: LGPL-2.1-or-later
-[Unit]
-Description=DML passthrough set DML service
-
-[Service]
-Slice=dml-passthrough.slice
-Type=oneshot
-ExecStart=true
-DefaultMemoryLow=15
+++ /dev/null
-# SPDX-License-Identifier: LGPL-2.1-or-later
-[Unit]
-Description=DML passthrough set ML service
-
-[Service]
-Slice=dml-passthrough.slice
-Type=oneshot
-ExecStart=true
-MemoryLow=0
+++ /dev/null
-# SPDX-License-Identifier: LGPL-2.1-or-later
-[Unit]
-Description=DML passthrough slice
-
-[Slice]
-MemoryLow=100
+++ /dev/null
-# SPDX-License-Identifier: LGPL-2.1-or-later
-[Unit]
-Description=DML slice
-
-[Slice]
-DefaultMemoryLow=50