steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744
- - uses: systemd/mkosi@cb5974d013f7c4c2a45f67c9ae990767e32e9034
+ - uses: systemd/mkosi@adaa41512aa30c952daae5ba0abcf2622d66b93b
- name: Configure
run: |
- # We configure ExtraSearchPaths=build/ so make sure build/ exists.
- mkdir build/
-
tee mkosi.conf <<- EOF
[Distribution]
Distribution=${{ matrix.distro }}
<varname>ExtensionDirectories</varname>
see systemd.exec(5) for their meaning.</para>
- <para><varname>MemoryAvailable</varname> indicates how much unused memory is available to the unit before
- the <literal>MemoryMax</literal> or <literal>MemoryHigh</literal> (whichever is lower) limit set by the cgroup
- memory controller is reached. It will take into consideration limits on all parent slices, other than the
- limits set on the unit itself.</para>
+ <para><varname>MemoryAvailable</varname> takes into account unit's and parents' <literal>MemoryMax</literal>
+ or <literal>MemoryHigh</literal> or physically available RAM versus given level's memory consumption
+ and takes minimum. Beware that other units below the tightest parent slice may consume the memory quicker
+ and less than reported value would remain for own allocation.
+ It works better in conjunction with <varname>MemoryAccounting=yes</varname> on involved units.</para>
<para><varname>DelegateSubgroup</varname> contains the cgroup subgroup to place invoked unit processes
in. As configured by the option of the same name in unit files. This is set to the empty string when it
--- /dev/null
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+[Match]
+PathExists=build/
+
+[Host]
+ExtraSearchPaths=build/
Distribution=fedora
[Distribution]
-@Release=38
+@Release=39
# SPDX-License-Identifier: LGPL-2.1-or-later
+[Preset]
+Presets=system
+
[Output]
OutputDirectory=mkosi.output
BuildDirectory=mkosi.builddir
[Host]
@Incremental=yes
@QemuMem=2G
-ExtraSearchPaths=build/
# Make sure we don't trigger systemd-firstboot prompting for the root password.
Credentials=passwd.plaintext-password.root=
KernelCommandLineExtra=systemd.crash_shell
--- /dev/null
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+[Match]
+PathExists=!build/
+SystemdVersion=<254
+
+[Host]
+ToolsTree=default
# SPDX-License-Identifier: LGPL-2.1-or-later
-[Match]
-Bootable=|auto
-Bootable=|yes
-
[Preset]
Dependencies=base
[Preset]
Dependencies=base
- initrd
[Content]
Autologin=yes
BaseTrees=../../mkosi.output/base
ExtraTrees=../../mkosi.output/base-systemd
ExtraTrees=../../src:/usr/src/src
-Initrds=../../mkosi.output/initrd
Packages=
acl
bash-completion
--- /dev/null
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+[Match]
+Bootable=!no
+Format=disk
+
+[Preset]
+Dependencies=initrd
+
+[Content]
+Initrds=../../mkosi.output/initrd
cd "$SRCDIR"
mkdir -p "$BUILDDIR"
+ # Prevent a distro's custom installkernel script from being used.
+ if [ -x /sbin/installkernel ]; then
+ mount --bind /dev/null /sbin/installkernel
+ fi
+
# Ensure fast incremental builds by fixating these values which usually change for each build.
export KBUILD_BUILD_TIMESTAMP="Fri Jun 5 15:58:00 CEST 2015"
export KBUILD_BUILD_HOST="mkosi"
}
int unit_get_memory_available(Unit *u, uint64_t *ret) {
- uint64_t unit_current, available = UINT64_MAX;
- CGroupContext *unit_context;
- const char *memory_file;
- int r;
+ uint64_t available = UINT64_MAX, current = 0;
assert(u);
assert(ret);
* claim before hitting the configured cgroup limits (if any). Consider both MemoryHigh
* and MemoryMax, and also any slice the unit might be nested below. */
- if (!UNIT_CGROUP_BOOL(u, memory_accounting))
- return -ENODATA;
-
- if (!u->cgroup_path)
- return -ENODATA;
-
- /* The root cgroup doesn't expose this information */
- if (unit_has_host_root_cgroup(u))
- return -ENODATA;
-
- if ((u->cgroup_realized_mask & CGROUP_MASK_MEMORY) == 0)
- return -ENODATA;
-
- r = cg_all_unified();
- if (r < 0)
- return r;
- memory_file = r > 0 ? "memory.current" : "memory.usage_in_bytes";
-
- r = cg_get_attribute_as_uint64("memory", u->cgroup_path, memory_file, &unit_current);
- if (r < 0)
- return r;
-
- assert_se(unit_context = unit_get_cgroup_context(u));
-
- if (unit_context->memory_max != UINT64_MAX || unit_context->memory_high != UINT64_MAX)
- available = LESS_BY(MIN(unit_context->memory_max, unit_context->memory_high), unit_current);
-
- for (Unit *slice = UNIT_GET_SLICE(u); slice; slice = UNIT_GET_SLICE(slice)) {
- uint64_t slice_current, slice_available = UINT64_MAX;
- CGroupContext *slice_context;
+ do {
+ uint64_t unit_available, unit_limit = UINT64_MAX;
+ CGroupContext *unit_context;
/* No point in continuing if we can't go any lower */
if (available == 0)
break;
- if (!slice->cgroup_path)
- continue;
+ unit_context = unit_get_cgroup_context(u);
+ if (!unit_context)
+ return -ENODATA;
- slice_context = unit_get_cgroup_context(slice);
- if (!slice_context)
+ if (!u->cgroup_path)
continue;
- if (slice_context->memory_max == UINT64_MAX && slice_context->memory_high == UINT64_MAX)
- continue;
+ (void) unit_get_memory_current(u, ¤t);
+ /* in case of error, previous current propagates as lower bound */
- r = cg_get_attribute_as_uint64("memory", slice->cgroup_path, memory_file, &slice_current);
- if (r < 0)
+ if (unit_has_name(u, SPECIAL_ROOT_SLICE))
+ unit_limit = physical_memory();
+ else if (unit_context->memory_max == UINT64_MAX && unit_context->memory_high == UINT64_MAX)
continue;
+ unit_limit = MIN3(unit_limit, unit_context->memory_max, unit_context->memory_high);
- slice_available = LESS_BY(MIN(slice_context->memory_max, slice_context->memory_high), slice_current);
- available = MIN(slice_available, available);
- }
+ unit_available = LESS_BY(unit_limit, current);
+ available = MIN(unit_available, available);
+ } while ((u = UNIT_GET_SLICE(u)));
*ret = available;
else if ((STR_IN_SET(name, "CPUWeight", "StartupCPUWeight", "IOWeight", "StartupIOWeight") && u == CGROUP_WEIGHT_INVALID) ||
(STR_IN_SET(name, "CPUShares", "StartupCPUShares") && u == CGROUP_CPU_SHARES_INVALID) ||
(STR_IN_SET(name, "BlockIOWeight", "StartupBlockIOWeight") && u == CGROUP_BLKIO_WEIGHT_INVALID) ||
- (STR_IN_SET(name, "MemoryCurrent", "TasksCurrent") && u == UINT64_MAX) ||
+ (STR_IN_SET(name, "MemoryCurrent", "MemoryAvailable", "TasksCurrent") && u == UINT64_MAX) ||
(endswith(name, "NSec") && u == UINT64_MAX))
bus_print_property_value(name, expected_value, flags, "[not set]");
- else if ((STR_IN_SET(name, "DefaultMemoryLow", "DefaultMemoryMin", "MemoryLow", "MemoryHigh", "MemoryMax", "MemorySwapMax", "MemoryZSwapMax", "MemoryLimit", "MemoryAvailable") && u == CGROUP_LIMIT_MAX) ||
+ else if ((STR_IN_SET(name, "DefaultMemoryLow", "DefaultMemoryMin", "MemoryLow", "MemoryHigh", "MemoryMax", "MemorySwapMax", "MemoryZSwapMax", "MemoryLimit") && u == CGROUP_LIMIT_MAX) ||
(STR_IN_SET(name, "TasksMax", "DefaultTasksMax") && u == UINT64_MAX) ||
(startswith(name, "Limit") && u == UINT64_MAX) ||
(startswith(name, "DefaultLimit") && u == UINT64_MAX))