]> git.ipfire.org Git - thirdparty/systemd.git/log
thirdparty/systemd.git
8 days agologind: keep lingering users at startup-time GC
Rocker Zhang [Sat, 16 May 2026 05:07:56 +0000 (13:07 +0800)] 
logind: keep lingering users at startup-time GC

manager_startup() runs manager_gc(m, /* drop_not_started= */ false)
before the user_start() loop. user_may_gc()'s linger guard requires
user_unit_active() to be true to keep a user, but at this point the
per-user units have not been started yet, so for any lingering user
that ended up in the user_gc_queue the guard falls through and
manager_gc frees the User struct before user_start() ever runs.

This only manifests after `systemctl soft-reboot`, because /run is
tmpfs and survives soft-reboot: /run/systemd/users/UID files persist,
and manager_enumerate_users() in src/login/logind.c explicitly calls
user_add_to_gc_queue() for every UID it loads from there. Cold boot is
unaffected because /run is empty, so the linger users that come in via
manager_enumerate_linger_users() never enter the GC queue at all and
reach user_start() directly.

Special-case the startup-time GC: if a linger file exists, keep the
user regardless of unit state — user_start() is about to run and will
queue the appropriate jobs. Steady-state GC (drop_not_started=true, in
the event loop) still requires user_unit_active() so we don't hold on
to records for lingering users whose units genuinely died.

Fixes: https://github.com/systemd/systemd/issues/41789
Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
8 days agovmspawn: add shell completion for --coco
Paul Meyer [Thu, 21 May 2026 06:07:51 +0000 (08:07 +0200)] 
vmspawn: add shell completion for --coco

Fixes 4f8215add24ac9018fb68399f0b957cf0eb3b0c6.

Signed-off-by: Paul Meyer <katexochen0@gmail.com>
8 days agotree-wide: standardize header names across src/fundamental, src/basic and src/shared
Daan De Meyer [Mon, 18 May 2026 20:29:04 +0000 (20:29 +0000)] 
tree-wide: standardize header names across src/fundamental, src/basic and src/shared

Drop the -fundamental suffix from src/fundamental/ headers in favor of names
that match their src/basic/ or src/shared/ counterparts (e.g.
macro-fundamental.h -> macro.h, assert-fundamental.h -> assert-util.h,
cleanup-fundamental.h -> cleanup-util.h). Rename src/basic/{btrfs,label}.{c,h}
to use the -util suffix to match the existing shared/btrfs-util and
shared/label-util siblings. Rename src/shared/mkdir-label.{c,h} to mkdir.{c,h}
and src/shared/tmpfile-util-label.{c,h} to tmpfile-util.{c,h} to match the
corresponding src/basic names.

This saves us from having to come up with separate names for files that do
the same thing across tiers, and it makes it easier to move stuff between
src/fundamental, src/basic and src/shared: consumers just #include "foo.h"
and pick up whichever tier their -I path resolves to first, so call sites
don't need to be updated when an API moves between layers.

Where a higher-tier wrapper exists (e.g. src/basic/macro.h wrapping
src/fundamental/macro.h), the wrapper uses an explicit "../fundamental/foo.h"
or "../basic/foo.h" relative include for the lower-tier header. We can't use
GCC's #include_next directive for this — when the wrapper is reachable both
via same-dir-as-source lookup and via -I (e.g. -Isrc/shared) for the
directory it lives in, #include_next advances by exactly one slot in libcpp's
internal directory chain and lands on the same physical directory it was
already in, never reaching the lower-tier sibling (see make_cpp_dir() in
gcc/libcpp/files.cc:1986).

To make sure the right headers are always picked up, the include directories
are reordered so that e.g. src/shared always takes priority over src/basic and
similar for the other directories.

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
8 days agotest-network: follow-up for modem manager test and add test case for networkctl dhcp...
Yu Watanabe [Thu, 21 May 2026 00:10:30 +0000 (09:10 +0900)] 
test-network: follow-up for modem manager test and add test case for networkctl dhcp-lease (#42203)

8 days agofirstboot: make clear where the full screen console wizards end
Lennart Poettering [Wed, 20 May 2026 21:17:11 +0000 (23:17 +0200)] 
firstboot: make clear where the full screen console wizards end

The three first boot screens are visually separated from the console
output before them via the "chome" and welcome strings and sufficient
whitespace. But so far they weren't from the output after them. This is
sometimes a big confusing. Let's add a bit of a separator between the
end and what comes next, too.

Just cosmetics, nothing else.

8 days agovmspawn: rearrange --help and man page a bit (#42200)
Yu Watanabe [Thu, 21 May 2026 00:07:34 +0000 (09:07 +0900)] 
vmspawn: rearrange --help and man page a bit (#42200)

This does not change man page or --help contents at all, but it does
introduce new sections, and moves some knobs between sections. It also
reorders things in the man page so that man page and --help show items
in the same order again.

8 days agoreport: use new --help formatting calls
Lennart Poettering [Wed, 20 May 2026 13:45:30 +0000 (15:45 +0200)] 
report: use new --help formatting calls

8 days agotest-network: add test cases for 'networkctl dhcp-lease' command 42203/head
Yu Watanabe [Wed, 20 May 2026 15:28:38 +0000 (00:28 +0900)] 
test-network: add test cases for 'networkctl dhcp-lease' command

Addresses the request:
https://github.com/systemd/systemd/pull/42137#pullrequestreview-4305664376

8 days agotest-network: try to stop test-modem-manager-mock.service only when necessary
Yu Watanabe [Wed, 20 May 2026 14:40:51 +0000 (23:40 +0900)] 
test-network: try to stop test-modem-manager-mock.service only when necessary

Otherwise, all test cases that does not create/start the service emits
the following error:
```
Failed to stop test-modem-manager-mock.service: Unit test-modem-manager-mock.service not loaded.
```

Moreover, without this change, extra 'systemctl daemon-reload' is triggered after
all test cases. That's super heavy, especially when the test is running on
sanitizers.

Follow-up for abe3d570f8006fca5138b2d5cfb4e8b530be02e5.

8 days agoinclude: update kernel headers from v7.1-rc4
Yu Watanabe [Wed, 20 May 2026 19:57:21 +0000 (04:57 +0900)] 
include: update kernel headers from v7.1-rc4

It seems there is no notable changes to us.

8 days agotest-network: use networkctl_status() helper function at one more place
Yu Watanabe [Wed, 20 May 2026 19:33:01 +0000 (04:33 +0900)] 
test-network: use networkctl_status() helper function at one more place

8 days agoBump minimum required version of musl to 1.2.6 (#42208)
Yu Watanabe [Wed, 20 May 2026 22:04:12 +0000 (07:04 +0900)] 
Bump minimum required version of musl to 1.2.6 (#42208)

musl v1.2.6 has been released on 2026-03-20, and alpine-edge already has it:
https://pkgs.alpinelinux.org/package/edge/main/x86_64/musl

8 days agomkosi: update debian commit reference to 3e1930512d1efee7e11b619a5f493b3229594a51
Luca Boccassi [Wed, 20 May 2026 20:18:35 +0000 (21:18 +0100)] 
mkosi: update debian commit reference to 3e1930512d1efee7e11b619a5f493b3229594a51

3e1930512d Downgrade dependency on dbus to recommends in sd-container
61d6ecf0a0 Conflict with sysuser-helper
fbc4646437 autopkgtest: add dependency on procps

8 days agoman: order --secure-boot= to the same location in man page as in --help for vmspawn 42200/head
Lennart Poettering [Wed, 20 May 2026 14:23:36 +0000 (16:23 +0200)] 
man: order --secure-boot= to the same location in man page as in --help for vmspawn

8 days agovmspawn: move --kernel=/--initrd= under the "Execution" section
Lennart Poettering [Wed, 20 May 2026 13:52:57 +0000 (15:52 +0200)] 
vmspawn: move --kernel=/--initrd= under the "Execution" section

This has little to do with host configuration (where it was so far), and
a lot with what being executed, let's move it over.

Note that --help and man page so far differed here quite a bit: the
former had the "Execution" section, the latter didn't. This creates it
in the man page, to bring the two back in sync.

8 days agovmspawn: split out networking related options into its own "Networking" section in...
Lennart Poettering [Wed, 20 May 2026 13:50:32 +0000 (15:50 +0200)] 
vmspawn: split out networking related options into its own "Networking" section in --help

8 days agovmspawn: split 'Integration' section into 'Logging' and 'SSH'
Lennart Poettering [Wed, 20 May 2026 13:48:44 +0000 (15:48 +0200)] 
vmspawn: split 'Integration' section into 'Logging' and 'SSH'

Each of the two has multiple options, hence let's split them out.

8 days agovmspawn: move image related knobs close to --image=
Lennart Poettering [Wed, 20 May 2026 13:45:57 +0000 (15:45 +0200)] 
vmspawn: move image related knobs close to --image=

(Also, arrange the order if the image options group in the man page to
the same as in the --help text)

9 days agoNEWS: mention bump of musl requirement 42208/head
Yu Watanabe [Wed, 20 May 2026 19:07:36 +0000 (04:07 +0900)] 
NEWS: mention bump of musl requirement

9 days agomusl: drop several statx definitions
Yu Watanabe [Wed, 20 May 2026 16:14:59 +0000 (01:14 +0900)] 
musl: drop several statx definitions

Those dropped definitions have been provided since musl v1.2.6.

9 days agomusl: drop renameat2() wrapper
Yu Watanabe [Wed, 20 May 2026 16:08:24 +0000 (01:08 +0900)] 
musl: drop renameat2() wrapper

musl provides renameat2() since v1.2.6:
https://git.musl-libc.org/cgit/musl/commit/?id=05ce67fea99ca09cd4b6625cff7aec9cc222dd5a

9 days agoREADME: bump required minimum version of musl to 1.2.6
Yu Watanabe [Wed, 20 May 2026 16:30:43 +0000 (01:30 +0900)] 
README: bump required minimum version of musl to 1.2.6

musl v1.2.6 has been released on 2026-03-20:
https://git.musl-libc.org/cgit/musl/commit/?id=9fa28ece75d8a2191de7c5bb53bed224c5947417

alpine/postmarketos already have musl v1.2.6 in the edge repository:
https://pkgs.alpinelinux.org/package/edge/main/x86_64/musl

Also, Yocto Project 6.0 (wrynose) already has v1.2.6.

Let's bump the requirement now.

9 days agoupdatectl: Add a --no-ask-password argument
Philip Withnall [Wed, 20 May 2026 16:15:00 +0000 (17:15 +0100)] 
updatectl: Add a --no-ask-password argument

While commit 83c1e8ff5f9 added support for interactive polkit
authentication in `updatectl`, some users might want to disable that for
some use cases; so add the standard `--no-ask-password` argument.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
Helps: https://github.com/systemd/systemd/issues/37412

9 days agoCouple of rearragements for src/core/meson.build (#42207)
Yu Watanabe [Wed, 20 May 2026 19:18:14 +0000 (04:18 +0900)] 
Couple of rearragements for src/core/meson.build (#42207)

Net result is `import-creds.c` moving from libcore to systemd

9 days agoci: run the musl build & test under mkosi with a postmarketOS tools tree (#42171)
Daan De Meyer [Wed, 20 May 2026 19:03:14 +0000 (21:03 +0200)] 
ci: run the musl build & test under mkosi with a postmarketOS tools tree (#42171)

9 days agoinclude: move several missing definitions to musl
Yu Watanabe [Wed, 20 May 2026 15:54:26 +0000 (00:54 +0900)] 
include: move several missing definitions to musl

Those moved ones have been defined in glibc <= 2.34, and only
necessary when built with musl.

Follow-up for c8c1bcf1941047d1fe43d9827ad4826b4620297a.

9 days agofirstboot: auto-fill keymap/locale questions with data from firmware, if available...
Yu Watanabe [Wed, 20 May 2026 18:50:43 +0000 (03:50 +0900)] 
firstboot: auto-fill keymap/locale questions with data from firmware, if available (#42177)

Let's make the installer experience a tiny bit nicer, and prefill
everything with the data the firmware gives us.

9 days agodns-packet: bail out early if the packet is too short (#42189)
Yu Watanabe [Wed, 20 May 2026 18:43:18 +0000 (03:43 +0900)] 
dns-packet: bail out early if the packet is too short (#42189)

This should address the nit from Claude in
https://github.com/systemd/systemd/pull/42178#pullrequestreview-4320763076.

9 days agoci: run the musl build & test under mkosi with a postmarketOS tools tree 42171/head
Daan De Meyer [Tue, 19 May 2026 10:36:01 +0000 (10:36 +0000)] 
ci: run the musl build & test under mkosi with a postmarketOS tools tree

Drop the standalone Unit-tests (musl) workflow that ran on an Alpine sandbox
spun up by jirutka/setup-alpine, and merge it into unit-tests.yml as a new
build-musl job that provisions a postmarketOS tools tree via mkosi and runs
the meson build + test suite through 'mkosi box'. postmarketOS is musl-native,
so the musl-gcc / -idirafter /usr/include wrappers the Fedora tools tree
needed are gone; the linter.yml's own musl build step also goes away since
the unit-tests workflow now covers it (and tests it).

postmarketOS doesn't ship a downstream systemd packaging spec, so the new
tools tree config in mkosi.tools.conf/mkosi.conf.d/postmarketos.conf does not
set PrepareScripts and lists build deps manually. mkosi.sync now early-exits
when PKG_SUBDIR is unset so the missing pkgenv entry doesn't trip set -u.

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
9 days agotest-path: Skip test when we can't create a cgroup
Daan De Meyer [Wed, 20 May 2026 17:21:13 +0000 (17:21 +0000)] 
test-path: Skip test when we can't create a cgroup

Instead of having CI runner specific checks, let's just
skip the test if we get EXIT_CGROUP which is what we get
when we can't create a cgroup. This makes the check work
independently of CI runner, and specifically also on github
actions.

9 days agomeson: move one source file from libcore to systemd array 42207/head
Luca Boccassi [Wed, 20 May 2026 17:15:52 +0000 (18:15 +0100)] 
meson: move one source file from libcore to systemd array

9 days agomeson: reorder core sources alphabetically
Luca Boccassi [Wed, 20 May 2026 16:32:08 +0000 (17:32 +0100)] 
meson: reorder core sources alphabetically

9 days agomeson: reorder core sources array
Luca Boccassi [Wed, 20 May 2026 16:30:31 +0000 (17:30 +0100)] 
meson: reorder core sources array

To hint that sources should be added to the lowest common denominator
first

9 days agotest-path: Migrate to test framework and macros
Daan De Meyer [Wed, 20 May 2026 13:30:28 +0000 (13:30 +0000)] 
test-path: Migrate to test framework and macros

- Also clean up the logging in check_states() to
  only log on state changes so it's less noisy.

9 days agotest-path: Fail earlier on start-limit-hit
Daan De Meyer [Wed, 20 May 2026 08:52:21 +0000 (08:52 +0000)] 
test-path: Fail earlier on start-limit-hit

9 days agomeson: Skip coccinelle suite by default
Daan De Meyer [Wed, 20 May 2026 07:18:41 +0000 (07:18 +0000)] 
meson: Skip coccinelle suite by default

It's not fully passing yet so disable it by default until it is.
clang-tidy follows the same model.

9 days agotest-ukify: Skip kernel images we can't access
Daan De Meyer [Wed, 20 May 2026 08:51:56 +0000 (08:51 +0000)] 
test-ukify: Skip kernel images we can't access

9 days agomkosi: update mkosi ref to be746d51bc90568b196951a60095ba87bf51ca8b
Daan De Meyer [Tue, 19 May 2026 21:07:10 +0000 (21:07 +0000)] 
mkosi: update mkosi ref to be746d51bc90568b196951a60095ba87bf51ca8b

be746d51bc Make full $PATH available when building tools tree

9 days agoptyfwd: Imply PTY_FORWARD_READ_ONLY if stdin isn't readable
Daan De Meyer [Wed, 20 May 2026 12:14:52 +0000 (12:14 +0000)] 
ptyfwd: Imply PTY_FORWARD_READ_ONLY if stdin isn't readable

if stdin is connected to a closed pipe or similar, imply
PTY_FORWARD_READ_ONLY so we don't even try to read from it
in the first place. Otherwise we'll immediately get a hangup
which will cause the forwarder to call sd_event_exit() and
shut down the event loop.

Debugged-by: Christian Brauner <brauner@kernel.org>
9 days agovmspawn: initial support for SEV-SNP guests (#42193)
Lennart Poettering [Wed, 20 May 2026 15:42:26 +0000 (17:42 +0200)] 
vmspawn: initial support for SEV-SNP guests  (#42193)

9 days agosystemd-udevd: configure NIC IRQs CPU affinity (#40304)
Yu Watanabe [Wed, 20 May 2026 15:39:47 +0000 (00:39 +0900)] 
systemd-udevd: configure NIC IRQs CPU affinity (#40304)

# Context

#40195 defines the initial proposal and the motivation behind this PR.

This PR introduces 3 new options for `.link` files `[Link]` section:
- `IRQAffinityPolicy=`
- `IRQAffinity=`
- `IRQAffinityNUMA=`

The purpose is to allow `systemd-udevd` to configure a NIC's IRQs
affinity to specific CPU(s).

`IRQAffinityPolicy=` supports two policies:
- `single`: assign all the NIC IRQs to CPU 0, or the first CPU in the
CPU set resulting from the union of `IRQAffinity=` and
`IRQAffinityNUMA=`.
- `spread`: assign all the NIC IRQs to all the CPUs (or the union of
`IRQAffinity=` and `IRQAffinityNUMA=` if defined) in a round-robin
fashion while optimizing for cache locally while spreading apart queues
on CPUs as much as possible.

Both `IRQAffinity=` and `IRQAffinityNUMA=` behaves as filters to reduce
the CPU set to assign IRQs to, and are only valid if
`IRQAffinityPolicy=` is defined.

# Spreading IRQs

This section describes the algorithm responsible for spreading IRQs over
different CPUs to maximize performance.

## 1. Discover CPU topology

Read from `/sys/devices/system/cpu/cpu*/topology` to identify:
- L3 cache domains (dies)
- Physical cores VS hyperthreads
- NUMA nodes
- Core ordering within each die

```
Example: Dual-socket server with 2 dies per socket, 4 cores per die

      ┌─────────────────────────────────────────────────────────────────┐
      │                         NUMA Node 0                             │
      │   ┌─────────────────────────┐   ┌─────────────────────────┐     │
      │   │   Die 0 (L3 Cache)      │   │   Die 1 (L3 Cache)      │     │
      │   │  ┌────┐┌────┐┌────┐┌────│   │  ┌────┐┌────┐┌────┐┌────│     │
      │   │  │ C0 ││ C1 ││ C2 ││ C3 │   │  │ C4 ││ C5 ││ C6 ││ C7 │     │
      │   │  │0,16││1,17││2,18││3,19│   │  │4,20││5,21││6,22││7,23│     │
      │   │  └────┘└────┘└────┘└────│   │  └────┘└────┘└────┘└────│     │
      │   └─────────────────────────┘   └─────────────────────────┘     │
      └─────────────────────────────────────────────────────────────────┘
      ┌─────────────────────────────────────────────────────────────────┐
      │                         NUMA Node 1                             │
      │   ┌─────────────────────────┐   ┌─────────────────────────┐     │
      │   │   Die 2 (L3 Cache)      │   │   Die 3 (L3 Cache)      │     │
      │   │  ┌────┐┌────┐┌────┐┌────│   │  ┌────┐┌────┐┌────┐┌────│     │
      │   │  │ C8 ││ C9 ││C10 ││C11 │   │  │C12 ││C13 ││C14 ││C15 │     │
      │   │  │8,24││9,25││10,2││11,2│   │  │12,2││13,2││14,3││15,3│     │
      │   │  └────┘└────┘└────┘└────│   │  └────┘└────┘└────┘└────│     │
      │   └─────────────────────────┘   └─────────────────────────┘     │
      └─────────────────────────────────────────────────────────────────┘
                  (Numbers show CPU IDs: first HT, second HT)
```

## 2. Filter the first hyperthread only

Use only the first hyperthread of each physical core to avoid SMT
contention. Two IRQs on sibling HTs contend for ALU/cache without cache
benefit.

```
      Before: CPUs 0-31 (16 cores × 2 HTs)
      After:  CPUs 0-15 (first HT of each core)
```

## 3. Equidistant permutations

Reorder dies and CPUs so consecutive selections are maximally spread
apart.

```
        Original order:  [0, 1, 2, 3]          (adjacent dies/CPUs)
                            |
                            v
        Equidistant:     [0, 2, 1, 3]          (spread apart)
```

This ensures that even if only 2 IRQs are assigned, they land on dies 0
and 2 (not 0 and 1), maximizing physical distance. The permutation is
also applied within each die:

```
        Die permutation:   Die0 -> Die2 -> Die1 -> Die3

        Within each die:
        ┌───────────────────────────────────────────────┐
        │ Die 0: [C0,C1,C2,C3]     -> [C0,C2,C1,C3]     │
        │ Die 1: [C4,C5,C6,C7]     -> [C4,C6,C5,C7]     │
        │ Die 2: [C8,C9,C10,C11]   -> [C8,C10,C9,C11]   │
        │ Die 3: [C12,C13,C14,C15] -> [C12,C14,C13,C15] │
        └───────────────────────────────────────────────┘
```

## 4. Round-robin selection across dies

Pick one CPU from each die in rotation, following permuted order.

```

      Round 1:     Die0->C0   Die2->C8   Die1->C4   Die3->C12
                      |          |          |          |
                      v          v          v          v
      IRQs:         [IRQ0]     [IRQ1]     [IRQ2]     [IRQ3]

      Round 2:     Die0->C2   Die2->C10  Die1->C6   Die3->C14
                      |          |          |          |
                      v          v          v          v
      IRQs:         [IRQ4]     [IRQ5]     [IRQ6]     [IRQ7]
```

If there are more IRQs than physical cores, this logic wraps around and
reuse CPUs. Only the first hyperthread of each core is used to avoid
cache line contention between queues.

Closes #40195.

9 days agoRevert "meson: shrink developer-mode build artifacts"
Luca Boccassi [Wed, 20 May 2026 14:51:17 +0000 (15:51 +0100)] 
Revert "meson: shrink developer-mode build artifacts"

This reverts commit 68910161491cdd161bff29a32032e52301831164.

9 days agoupdate TODO 42177/head
Lennart Poettering [Tue, 19 May 2026 13:54:48 +0000 (15:54 +0200)] 
update TODO

9 days agofirstboot: port help() to help-util.[ch] APIs
Lennart Poettering [Wed, 20 May 2026 14:34:13 +0000 (16:34 +0200)] 
firstboot: port help() to help-util.[ch] APIs

9 days agofirstboot: prefill language prompt with firmware language if it makes
Lennart Poettering [Tue, 19 May 2026 13:50:39 +0000 (15:50 +0200)] 
firstboot: prefill language prompt with firmware language if it makes
sense

9 days agobootctl: show platform lang in bootctl status output
Lennart Poettering [Tue, 19 May 2026 13:50:35 +0000 (15:50 +0200)] 
bootctl: show platform lang in bootctl status output

9 days agolocale-setup: pick up platform lang from firmware
Lennart Poettering [Tue, 19 May 2026 13:50:20 +0000 (15:50 +0200)] 
locale-setup: pick up platform lang from firmware

9 days agosysinstall: prefill firmware variable question with 'yes'
Lennart Poettering [Tue, 19 May 2026 13:08:46 +0000 (15:08 +0200)] 
sysinstall: prefill firmware variable question with 'yes'

9 days agofirstboot: prefill keymap question with EFI provided info
Lennart Poettering [Tue, 19 May 2026 13:07:32 +0000 (15:07 +0200)] 
firstboot: prefill keymap question with EFI provided info

9 days agoask-string: support prefilling a string query with an explicit string
Lennart Poettering [Tue, 19 May 2026 12:59:38 +0000 (14:59 +0200)] 
ask-string: support prefilling a string query with an explicit string

9 days agovconsole-util: move code to read EFI keyboard layout into generic code
Lennart Poettering [Tue, 19 May 2026 12:51:41 +0000 (14:51 +0200)] 
vconsole-util: move code to read EFI keyboard layout into generic code

9 days agobasic/math-util: drop libm where possible
Daan De Meyer [Fri, 15 May 2026 14:59:49 +0000 (14:59 +0000)] 
basic/math-util: drop libm where possible

- test-random-util is reworked to not use sqrt()
- pretty-print.c inlines ceil() so libm doesn't have
  to be linked into libshared
- We add fno-math-errno to allow inlining of more math
  functions by not requiring standard math functions to
  set errno on invalid input.

9 days agomeson: shrink developer-mode build artifacts
Daan De Meyer [Fri, 15 May 2026 20:46:54 +0000 (20:46 +0000)] 
meson: shrink developer-mode build artifacts

Two complementary changes in the developer-mode branch of meson.build:

  1. -ffunction-sections -fdata-sections: pair with the existing
     -Wl,--gc-sections so the linker can drop unused individual functions
     and data instead of being forced to pull whole .o files into each
     binary. Biggest impact on statically-linked NSS/PAM modules (a single
     call into creds-util.c used to drag in the entire creds-util
     translation unit, which transitively pulled TPM2, OpenSSL, PKCS11 and
     KDF helpers via tpm2-util.c / openssl-util.c) and on tests that embed
     daemon objects via meson's objects: extraction.

  2. -gz=zstd + -fdebug-types-section + -Wl,--compress-debug-sections=zstd:
     compress every .debug_* section with zstd, and move type DIEs into a
     COMDAT-mergeable section so identical types described across many TUs
     land once. Both are transparent to GDB / readelf / addr2line.

Gated to mode == 'developer' for now: no major distro (Fedora, Debian/
Ubuntu, Arch, Alpine, Gentoo, openSUSE, Yocto) enables -ffunction-sections
in their system-wide default CFLAGS, and the interaction with -flto=auto +
-ffat-lto-objects (which Fedora et al. ship by default) deserves a broader
evaluation before turning it on for release builds. Developer mode benefits
straightforwardly: smaller plugins, smaller tests, smaller libraries, no
interference with the hardening/LTO flag combinations distros pin.

Size impact on a clean developer-mode build, 626 ELF objects:

| Category                   |   n |      Before |       After |               Δ |     % |
| -------------------------- | --: | ----------: | ----------: | --------------: | ----: |
| NSS plugins                |   4 |  22,163,272 |   6,681,120 |    −15,482,152  | −69.9 |
| PAM plugins                |   3 |  18,132,160 |   5,764,880 |    −12,367,280  | −68.2 |
| libsystemd.so (public ABI) |   1 |   6,009,360 |   3,350,168 |     −2,659,192  | −44.3 |
| libudev.so (public ABI)    |   1 |   4,379,336 |   1,441,256 |     −2,938,080  | −67.1 |
| libsystemd-shared-261.so   |   1 |  15,130,264 |  11,293,952 |     −3,836,312  | −25.4 |
| libsystemd-core-261.so     |   1 |   7,356,408 |   4,992,600 |     −2,363,808  | −32.1 |
| cryptsetup-token plugins   |   3 |     139,800 |     113,344 |        −26,456  | −18.9 |
| daemons / CLI tools        | 178 |  43,581,288 |  31,911,368 |    −11,669,920  | −26.8 |
| test binaries              | 386 | 124,717,072 |  60,185,904 |    −64,531,168  | −51.7 |
| fuzzers                    |  48 |  33,138,056 |  13,864,952 |    −19,273,104  | −58.2 |
| **TOTAL**                  | 626 | 274,747,016 | 139,599,544 | **−135,147,472** | **−49.2** |

Biggest individual wins:

| Binary                   |   Before |    After |      Δ |
| ------------------------ | -------: | -------: | -----: |
| test-networkd-address    |  6.21 MB |  0.82 MB | −86.8% |
| test-network-tables      |  6.23 MB |  0.85 MB | −86.4% |
| test-networkd-conf       |  6.27 MB |  1.32 MB | −78.9% |
| libnss_myhostname.so.2   |  6.40 MB |  1.53 MB | −76.1% |
| fuzz-netdev-parser       |  6.22 MB |  1.51 MB | −75.7% |
| fuzz-network-parser      |  6.22 MB |  1.70 MB | −72.6% |
| libnss_systemd.so.2      |  6.90 MB |  2.04 MB | −70.4% |
| libnss_resolve.so.2      |  4.42 MB |  1.38 MB | −68.8% |
| pam_systemd_home.so      |  6.91 MB |  2.22 MB | −67.9% |
| libudev.so.1.7.13        |  4.18 MB |  1.37 MB | −67.1% |
| pam_systemd.so           |  7.02 MB |  2.55 MB | −63.6% |
| libsystemd-shared-261.so | 14.43 MB | 10.77 MB | −25.4% |

The big test wins come from the ~30 daemons (systemd-networkd,
systemd-resolved, systemd-journald, systemd-logind, systemd-homed,
systemd-importd, systemd-machined, …) whose compiled .o files are embedded
directly into their unit tests via meson's objects: extraction mechanism.
With per-function sections on the daemon sources, the test binary can GC
the bulk of code it never exercises; the remaining DWARF is then shared
zstd-compressed across every .o.

Build-speed cost is below noise on a 24-core build: across four clean
builds (with-flags / sections-only / baseline / with-flags rerun) the
range was 23.6–26.0 s real time and 7m39s–7m48s user time, with the
two with-flags runs faster than the baseline by a couple of seconds —
overhead from per-function-section bookkeeping and zstd compression
disappears into parallel-build noise.

9 days agorepart: canonicalize node in varlink Run method
Daan De Meyer [Wed, 13 May 2026 21:01:41 +0000 (23:01 +0200)] 
repart: canonicalize node in varlink Run method

Run acquire_root_devno() on the varlink-provided node so symlinks (e.g.
/dev/disk/by-id/...) resolve to their canonical /dev/ path before being
used. Without this, sym_fdisk_partname() produces a "-partN" symlink
that udev hasn't created yet when repart calls open() on it right after
BLKPG_ADD_PARTITION, failing with ENOENT.

This also brings the varlink path in line with the CLI path's
partition-to-whole-disk and dm-crypt-to-backing resolution.

9 days agoupdate TODO
Lennart Poettering [Wed, 20 May 2026 13:43:24 +0000 (15:43 +0200)] 
update TODO

9 days agopo: skip automated fuzzy translations when generating new po files
Luca Boccassi [Mon, 18 May 2026 11:56:39 +0000 (12:56 +0100)] 
po: skip automated fuzzy translations when generating new po files

The fuzzy translations are always wrong, but meson's integration does
not allow skipping them. Add a tiny wrapper for 'msgmerge' to
workaround the issue and skip them when running ninja systemd-update-po

9 days agovmspawn: use EPYC-v4 cpu for SNP 42193/head
Paul Meyer [Tue, 19 May 2026 11:56:46 +0000 (13:56 +0200)] 
vmspawn: use EPYC-v4 cpu for SNP

SNP requires a named, stable CPU model so the launch measurement is
reproducible across hosts. EPYC-v4 is the baseline that covers all
SNP-capable processors (Milan and later).

Signed-off-by: Paul Meyer <katexochen0@gmail.com>
9 days agovmspawn: initial support for SEV-SNP guests
Paul Meyer [Mon, 18 May 2026 05:50:34 +0000 (07:50 +0200)] 
vmspawn: initial support for SEV-SNP guests

Add --confidential-computing=sev-snp to run the guest as an AMD SEV-SNP
confidential VM. Loads a raw OVMF firmware blob via -bios (SNP doesn't
support the pflash + NVRAM split), attaches a sev-snp-guest object,
and hashes the kernel, initrd and cmdline into the launch measurement
when direct kernel boot is used. Incompatible features (Secure Boot,
CXL, virtio-balloon, SMBIOS credentials) are rejected or disabled; an
attached vTPM must be treated as untrusted by the guest.

The feature is marked experimental in the man page.

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
Signed-off-by: Paul Meyer <katexochen0@gmail.com>
9 days agoupdate TODO
Lennart Poettering [Wed, 20 May 2026 10:15:33 +0000 (12:15 +0200)] 
update TODO

9 days agoudev/net: document IRQAffinityPolicy=, IRQAffinity=, and 40304/head
Quentin Deslandes [Thu, 8 Jan 2026 00:25:56 +0000 (01:25 +0100)] 
udev/net: document IRQAffinityPolicy=, IRQAffinity=, and
IRQAffinityNUMA=

9 days agoudev/net: add IRQAffinityNUMA= option for NUMA-aware filtering
Quentin Deslandes [Mon, 16 Feb 2026 19:43:37 +0000 (20:43 +0100)] 
udev/net: add IRQAffinityNUMA= option for NUMA-aware filtering

Add support for filtering IRQ affinity to CPUs on a specific NUMA node
via the new IRQAffinityNUMA= option in .link files. The option accepts:
- "local": use the NUMA node local to the NIC's PCIe slot
- Explicit node number (0, 1, 2, ...): use CPUs on the specified node

When both IRQAffinity= and IRQAffinityNUMA= are specified, their
intersection is used. If the intersection is empty, an error is logged
and IRQ affinity configuration is skipped.

When "local" is specified but the device's NUMA node cannot be
determined (numa_node shows -1), a warning is logged and IRQ affinity
configuration is skipped.

9 days agoudev/net: add IRQAffinity= option to filter eligible CPUs
Quentin Deslandes [Mon, 16 Feb 2026 19:40:38 +0000 (20:40 +0100)] 
udev/net: add IRQAffinity= option to filter eligible CPUs

Add IRQAffinity= option to .link files that filters the set of CPUs
eligible for IRQ placement. This works in conjunction with
IRQAffinityPolicy= to constrain which CPUs receive network IRQs.

When specified with spread policy, only the listed CPUs are considered
for IRQ distribution. When specified with single policy, IRQs are
pinned to the first CPU in the allowed set instead of CPU 0.

9 days agoudev/net: implement IRQAffinityPolicy=spread with topology awareness
Quentin Deslandes [Mon, 16 Feb 2026 19:38:19 +0000 (20:38 +0100)] 
udev/net: implement IRQAffinityPolicy=spread with topology awareness

Implement the spread policy for IRQ affinity distribution using a
topology-aware algorithm. The algorithm:

1. Discovers CPU topology from sysfs (NUMA node, package, die/L3, core)
2. Groups CPUs by L3 cache domain (die) with equidistant ordering
3. Round-robins across dies, spreading IRQs across the system
4. Uses first hyperthread of each core before second hyperthreads
5. Applies IRQ affinity via /proc/irq/<n>/smp_affinity

When there are more IRQs than CPUs, queues wrap around using round-robin.

9 days agoudev/net: add IRQAffinityPolicy= option for .link files
Quentin Deslandes [Mon, 16 Feb 2026 18:39:04 +0000 (19:39 +0100)] 
udev/net: add IRQAffinityPolicy= option for .link files

Add support for configuring IRQ affinity for network interfaces via
systemd .link files. For now, the new IRQAffinityPolicy= option in the [Link]
section only accepts "single", which pins all MSI IRQs to CPU 0.

This allows declarative IRQ affinity configuration for network devices
during udev processing, which is useful for optimizing network
performance on multi-core systems.

Further commits will expand the options supported by IRQAffinityPolicy=.

9 days agodns-packet: bail out early if the packet is too short 42189/head
Frantisek Sumsal [Wed, 20 May 2026 08:47:22 +0000 (10:47 +0200)] 
dns-packet: bail out early if the packet is too short

Let's bail out early if the packet claims to contain some
questions or answer RRs, but the remaining packet data size is not
enough to hold a single such entry.

Follow-up for e7cd836dcffb5f85d66a156904fc68f8b654a290.

9 days agodns-packet: drop unnecessary indentation
Frantisek Sumsal [Wed, 20 May 2026 08:37:58 +0000 (10:37 +0200)] 
dns-packet: drop unnecessary indentation

Bail out early if QDCOUNT == 0, similarly to what we already do in
dns_packet_extract_answer() when RRCOUNT == 0.

9 days agotest: add test-link-abi to enforce link-time ABI invariants
Daan De Meyer [Thu, 14 May 2026 19:20:02 +0000 (19:20 +0000)] 
test: add test-link-abi to enforce link-time ABI invariants

For every built executable, internal shared library, and plugin module,
verify two link-time properties via readelf:

1. No imported GLIBC symbol's version is newer than 2.34.
2. The dynamic section's NEEDED entries reference only glibc, the
   runtime linker, our own libraries.

9 days agotree-wide: Replace exp10() with our own impl
Daan De Meyer [Fri, 15 May 2026 12:16:01 +0000 (12:16 +0000)] 
tree-wide: Replace exp10() with our own impl

exp10() has a symbol version > 2.34 on latest glibc. To allow
dropping our baseline required glibc runtime version to <= 2.34,
let's add our own version to prevent pulling in the newer symbol
from glibc.

9 days agocore: introduce varlink `io.systemd.Job` interface (#42104)
Yu Watanabe [Wed, 20 May 2026 08:22:18 +0000 (17:22 +0900)] 
core: introduce varlink `io.systemd.Job` interface (#42104)

Methods:

- `io.systemd.Job.List` — list all queued jobs or look up by `id`/`unit`
name, with streaming support. Uses context/runtime split: `JobContext`
(Unit, JobType) and `JobRuntime` (Id, State, Result,
ActivationDetails). Follows the same SELinux and parameter-conflict
patterns as `io.systemd.Unit.List`.
- `io.systemd.Job.Cancel` — cancel a specific job by ID, with SELinux
and polkit authorization.
- `io.systemd.Job.ClearAll` — cancel all pending jobs, with SELinux and
polkit authorization.

9 days agonetworkd: fix race condition in per-interface ICMPv6 processing
Patrick Rohr [Mon, 4 May 2026 20:31:10 +0000 (13:31 -0700)] 
networkd: fix race condition in per-interface ICMPv6 processing

There exists a small window of time in icmp6_bind() between creating the
ICMPv6 socket and binding it to an ifindex, where the link-scoped socket
can process an ICMPv6 packet received on any interface. The applies to
both sd-radv and sd-ndisc codepaths.

This change adds an explicit check for ifindex on the receive path and
ignores packets received on other interfaces.

Co-developed-by: OpenAI Codex <noreply@openai.com>
9 days agosd-bus: add depth limit to message_skip_fields() to prevent stack overflow (#42164)
Yu Watanabe [Wed, 20 May 2026 01:22:32 +0000 (10:22 +0900)] 
sd-bus: add depth limit to message_skip_fields() to prevent stack overflow (#42164)

`message_skip_fields()` recursively processes D-Bus variant types in
message header fields with no depth limit. A crafted message with deeply
nested variants can cause unbounded recursion and overflow the stack.

Add a `depth` parameter checked against `BUS_CONTAINER_DEPTH` (128),
matching the limit already enforced by the public
`sd_bus_message_skip()` API. All recursive call sites pass `depth + 1`,
and the top-level caller in `message_parse_fields()` passes `0`.

9 days agoCouple of test fixes (#42185)
Yu Watanabe [Wed, 20 May 2026 01:15:01 +0000 (10:15 +0900)] 
Couple of test fixes (#42185)

9 days agocore: improve errors from varlink io.systemd.Unit.StartTransient
Michael Vogt [Tue, 19 May 2026 18:32:41 +0000 (20:32 +0200)] 
core: improve errors from varlink io.systemd.Unit.StartTransient

The existing error reporting for the varlink `StartTransient` code
was converting all errors into `VARLINK_ERROR_UNIT_BAD_SETTING`.

This is not correct in some cases, we need to have a more targted
pattern here, i.e. only convert EINVAL to VARLINK_ERROR_UNIT_BAD_SETTING
and otherwise return the matching varlink error from the errno instead.

This commit fixes this issue. Thanks to Ivan Kruglov for raising
this.

9 days agotree-wide: move static dl handles into their dlopen_*() functions (#42168)
Yu Watanabe [Wed, 20 May 2026 01:08:11 +0000 (10:08 +0900)] 
tree-wide: move static dl handles into their dlopen_*() functions (#42168)

Each dlopen_*() wrapper kept its dl handle as a file-scope
'static void *xxx_dl = NULL;' even though only the wrapper itself
ever referenced it. Move each one inside the corresponding function
so its scope matches its actual use, leaving the rest of each
translation unit free of the unused file-scope name.

In pcre2-util.c the assert(pcre2_dl) in pattern_matches_and_log()
becomes assert(sym_pcre2_match), which carries the same invariant
(pattern_compile_and_log() ran dlopen_pcre2()).

9 days agotest: switch TEST-55-OOMD stress-ng --vm-method to lfsr32 42185/head
Luca Boccassi [Tue, 19 May 2026 21:42:25 +0000 (22:42 +0100)] 
test: switch TEST-55-OOMD stress-ng --vm-method to lfsr32

Commit 881e4717c7 ("test: pin stress-ng --vm-method to a portable
scalar method in TEST-55-OOMD") pinned --vm-method=zero-one with the
rationale that it is "a long-standing scalar method". That rationale is
wrong: stress_vm_zero_one() in stress-ng's stress-vm.c is declared

    static size_t TARGET_CLONES stress_vm_zero_one(...)

i.e. it carries the exact same TARGET_CLONES attribute as 33 of the 35
other vm methods. On x86_64 with GCC >=5, TARGET_CLONES expands (see
core-target-clones.h in stress-ng) to a target_clones attribute
including "arch=skylake-avx512", "arch=cooperlake", "arch=tigerlake",
"arch=sapphirerapids", and several other AVX-512-bearing arch variants,
plus "default". GCC generates AVX-512 clones of stress_vm_zero_one() and
the IFUNC resolver picks them on any CPU that advertises AVX-512.

The only vm methods in stress-ng's registry whose function definitions
omit TARGET_CLONES entirely (and are therefore guaranteed not to
dispatch to an AVX-512 clone) are lfsr32 (portable, always registered)
and write64ds (x86_64-only, gated on HAVE_ASM_X86_MOVDIRI, i.e. Intel
Tremont / Tiger Lake+ MOVDIRI instruction).

Switch the four stress-ng --vm invocations in TEST-55-OOMD to
--vm-method=lfsr32 so the AVX-512 SIGILL on CPUs without AVX-512 (e.g.
AMD Zen 1-3) can no longer occur regardless of compiler version,
optimization level, or stress-ng package build.

Follow-up for 881e4717c7981b274853309e68b39153e3b292f4

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
9 days agotest: fix race in TEST-07-PID1.socket-on-failure.sh
Luca Boccassi [Tue, 19 May 2026 21:00:58 +0000 (22:00 +0100)] 
test: fix race in TEST-07-PID1.socket-on-failure.sh

The test waited for the OnFailure= service's filesystem side effect
(`rmdir` of the directory) and then immediately invoked
`systemctl is-active`. Between `rmdir(2)` returning (which causes the
shell loop to exit) and PID1 reaping the child and transitioning the
oneshot service from `activating` to `active`, there is a small window
where `is-active` can observe `activating` and fail the test.

Wait directly on the unit state instead, matching the pattern used a
few lines above for the `is-failed` case.

  [ 1880.326704] TEST-07-PID1.sh[21489]: + timeout --foreground 60 bash -c 'while [[ -d '\''/tmp/TEST-07-PID1-socket-8467/test'\'' ]]; do sleep .5; done'
  [ 1880.330482] TEST-07-PID1.sh[21489]: + [[ ! -e /tmp/TEST-07-PID1-socket-8467/test ]]
  [ 1880.330482] TEST-07-PID1.sh[21489]: + systemctl is-active TEST-07-PID1-socket-OnFailure.service
  [ 1880.347470] TEST-07-PID1.sh[21520]: activating
  [ 1880.349508] TEST-07-PID1.sh[21489]: + at_exit
  [ 1880.349508] TEST-07-PID1.sh[21489]: + systemctl stop TEST-07-PID1-socket-8467.socket
  [ 1880.367331] TEST-07-PID1.sh[107]: Subtest /usr/lib/systemd/tests/testdata/units/TEST-07-PID1.socket-on-failure.sh failed
  [ 1880.367331] TEST-07-PID1.sh[107]: + return 1

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
9 days agotest: add test for variant recursion depth limit in message_skip_fields() 42164/head
TristanInSec [Tue, 19 May 2026 21:33:11 +0000 (17:33 -0400)] 
test: add test for variant recursion depth limit in message_skip_fields()

Craft a raw D-Bus message with an unknown header field containing
BUS_CONTAINER_DEPTH+1 nested variants and verify that message parsing
rejects it with -EBADMSG rather than recursing until stack overflow.

9 days agosd-bus: add depth limit to message_skip_fields() to prevent stack overflow
TristanInSec [Tue, 19 May 2026 21:33:06 +0000 (17:33 -0400)] 
sd-bus: add depth limit to message_skip_fields() to prevent stack overflow

message_skip_fields() recurses for each nested variant ('v') type in
D-Bus message header fields. A crafted message with deeply nested
variants (e.g., a variant containing a variant containing a variant...)
causes unbounded stack growth, leading to stack overflow and crash.

Add a depth parameter that increments on each recursive call and
rejects messages exceeding BUS_CONTAINER_DEPTH with -EBADMSG. This
matches the existing depth limits enforced elsewhere in the sd-bus
message processing (e.g., bus_message_enter_container).

10 days agotools: add a test wrapper that replays crashing tests under gdb
Daan De Meyer [Sat, 16 May 2026 19:09:12 +0000 (19:09 +0000)] 
tools: add a test wrapper that replays crashing tests under gdb

meson test --wrapper hook to print a gdb backtrace inline in the test
log when a test exits with an actual crash signal (SIGSEGV, SIGABRT,
SIGBUS, SIGFPE, SIGILL). Wired into the default add_test_setup() so it
runs automatically on every `meson test`.

Environmental terminations (SIGTERM/SIGKILL/SIGPIPE/SIGALRM) are passed
through without replay, and the original signal is re-raised so the
parent's wait() observes WIFSIGNALED rather than a plain exit code.

10 days agosocket-proxy: implement PROXY protocol v1
Дамјан Георгиевски [Mon, 18 May 2026 21:07:37 +0000 (23:07 +0200)] 
socket-proxy: implement PROXY protocol v1

as specified by the haproxy documentation:
https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt

only protocol v1 is implemented for now, protocol v2 is binary,
and will be implemented in the future.

the proxy protocol allows the destination/target to know the
address/port of the client connectiing.

in nginx it's supported by enabling the `proxy_protocol` parameter to
the `listen` directive.

10 days agotree-wide: move static dl handles into their dlopen_*() functions 42168/head
Daan De Meyer [Sat, 16 May 2026 15:50:31 +0000 (15:50 +0000)] 
tree-wide: move static dl handles into their dlopen_*() functions

Each dlopen_*() wrapper kept its dl handle as a file-scope
'static void *xxx_dl = NULL;' even though only the wrapper itself
ever referenced it. Move each one inside the corresponding function
so its scope matches its actual use, leaving the rest of each
translation unit free of the unused file-scope name.

In pcre2-util.c the assert(pcre2_dl) in pattern_matches_and_log()
becomes assert(sym_pcre2_match), which carries the same invariant
(pattern_compile_and_log() ran dlopen_pcre2()).

10 days agolibcrypt-util: Clean up dlopen_libcrypt()
Daan De Meyer [Tue, 19 May 2026 08:37:56 +0000 (08:37 +0000)] 
libcrypt-util: Clean up dlopen_libcrypt()

10 days agobpf-util; Add back caching on error/success
Daan De Meyer [Tue, 19 May 2026 08:32:26 +0000 (08:32 +0000)] 
bpf-util; Add back caching on error/success

Follow up for 7d822ca8

10 days agoudev: predictable names for auxiliary sub-function (SF) devices (#42154)
Yu Watanabe [Tue, 19 May 2026 18:33:15 +0000 (03:33 +0900)] 
udev: predictable names for auxiliary sub-function (SF) devices (#42154)

Some drivers (currently mlx5_core) expose sub-functions (SFs) of a PCI
Physical or Virtual Function as auxiliary devices that carry a stable
`sfnum` sysfs attribute (the user-defined SF number passed to `devlink
port add ... sfnum N`). Their leaf devices (net, infiniband, ...)
currently inherit the parent PF/VF's `ID_PATH` and the SF netdev falls
through to the kernel-assigned `eth<N>` name.

Two patches:

1. `udev-builtin-path_id`: prepend an `sf-<N>` token when the walk
crosses an aux device with `sfnum`, so SF leaf devices get an `ID_PATH`
distinct from the parent PF/VF (e.g. `pci-0000:c1:00.0-sf-88`). Aux
devices without `sfnum` keep the pre-patch behaviour, so existing
`ID_PATH` values are unchanged and the patch needs no naming-scheme gate
(path_id is unversioned).

2. `udev-builtin-net_id`: name SF host netdevs analogously to SR-IOV VF
host netdevs — walk to the parent PCI function and append a
single-character `S<sfnum>` suffix. SFs hosted on SR-IOV VFs (VF-SF) get
both suffixes chained on the PF's base name (`enp193s0f0v0S88`). Gated
behind `NAMING_SUBFUNC` / `NAMING_V261`. Man page
(`systemd.net-naming-scheme(7)`) updated.

The patches apply to any driver that exposes its SF leaf devices below
an aux device exposing `sfnum`.

Validated on mlx5 hardware: PF, VF, SF-on-PF (`enp8s0f0S88`,
`pci-0000:08:00.0-sf-88`). VF-SF case verified with a fake-sysfs setup
since this is not supported by any real device and is more a theoretical
use case.

10 days agomkosi: update mkosi ref to 77fce77807a9a92bc37edc8f1c967102e6236d94
Daan De Meyer [Tue, 19 May 2026 13:52:14 +0000 (13:52 +0000)] 
mkosi: update mkosi ref to 77fce77807a9a92bc37edc8f1c967102e6236d94

77fce77807 apk: Implement repository_key_fetch for the postmarketOS distribution
7068ed49ab postmarketos: Add ruff to tools tree
dea4b6bfc8 Add newline when writing machine id into /etc/machine-id
944b775d40 tools: add libtss2-tcti-device0 to opensuse tools tree
d856d65d3b mkosi-initrd: Also add cryptsetup-libs explicitly to the initrd
1cc967c5b3 mkosi-initrd: Trim orphaned GPU/audio modules, add ACPI platform attrs
a3e95a7c29 mkosi-tools: Add fish to misc profile
76b02d1f84 mkosi-tools: Add jujutsu to misc profile
0afe4cd254 mkosi-tools: Move gh to misc profile
9077634bad mkosi-tools: Add cryptsetup-libs to centos/fedora/opensuse
82846347af box: Drop background tinting
3e50b97101 mkosi-tools: Add libfido2
78c2784827 vmspawn: Use --ephemeral rather than copy_ephemeral()
dc801b00a3 Added second call to update kerneltype after kernel is defined
0c5cc04a8b vmspawn: Forward journal-remote settings to vmspawn
2518468c65 nspawn: Use --forward-journal instead of running journal-remote ourselves
d2b798d00c apk: skip removal of packages that aren't installed

10 days agoresolve: cap pre-allocation for questions/RRs
Frantisek Sumsal [Tue, 19 May 2026 12:51:56 +0000 (14:51 +0200)] 
resolve: cap pre-allocation for questions/RRs

Since [0] and [1] questions & answer RRs from the incoming packets are
parsed into a hashmap to speed things up. The hashmaps are even
pre-allocated to speed things up even more, but there's one caveat - the
size for the pre-allocation comes from one or more fields from the
incoming packets that are under sender's control.

This can be abused by a malicious DNS server which can send a packet
with a spoofed QDCOUNT (for question packets) or ANCOUNT/NSCOUNT/ARCOUNT
(for answer packets). The limit of the final value in both cases is 64K.
This value is then used to pre-allocate the hashmap (via
set_reserve()/ordered_set_reserve(), where the caller also multiplies
the input value by 2 in both cases), which in turns calls
resize_buckets() that memzero()s the pre-allocated area, so all the
pages are faulted in, showing in process' RSS. Each such spoofed packet
then can translate into a ~4 MiB allocation in the systemd-resolved
process, which doesn't sound that bad.

However, this can be further amplified if the spoofed packet ends up in
resolved's cache. So, if the spoofed packet contains one valid A record
and then an OPT record with a spoofed ARCOUNT, the whole packet ends up
in the cache that can hold 4K of entries, which can eventually cause
resolved to keep up to 16 GiB of memory just for the cache (and thanks
to the memzero() above it's all RSS). Note that all this requires
someone with enough privileges to configure resolved to actually point
to such malicious DNS server or it could come from a malicious DHCP
server on the network. This could also get exploited via LLMNR, but in
thas case an attacker would have to match an ID of a valid transaction
for the packet to end up in resolved's cache.

For example, with a malicious DNS already in resolved configuration:

$ resolvectl dns eth0
Link 2 (eth0): 192.168.99.1:5354

Filling resolved's cache:

$ for i in {0..4200}; do resolvectl query test-$i.example.com; done
...
test-4200.example.com: 192.0.2.1               -- link: dummy0

-- Information acquired via protocol DNS in 1.6ms.
-- Data is authenticated: no; Data was acquired via local or encrypted transport: no
-- Data from: network

Yields following memory increase:

$ while :; do grep VmRSS /proc/$(pidof systemd-resolved)/status; sleep 1; done
VmRSS:     14280 kB
VmRSS:     14280 kB
...
VmRSS:    403352 kB
VmRSS:   1017976 kB
VmRSS:   1603876 kB
VmRSS:   2202028 kB
...
VmRSS:  16795724 kB
VmRSS:  16795724 kB

In my testing I also noticed one annoyance - after certain threshold the
RSS increase persisted even after the malicious entries were evicted
from the cache (or flushed via `resolvectl flush-caches`). This was most
likely due to mmap_threshold getting bumped to > 4 MiB and neither cache
eviction nor flush-caches call malloc_trim(0) (via
sd_event_trim_memory() or similar).

To mitigate this, let's cap the pre-allocation to a maximum number of
records the given packet body can realistically contain. If the minimum
size would be, for whatever unlikely reason, not enough, nothing serious
would happen - the hashmap would still get resized automatically by
resize_buckets(), it'd be just slightly slower.

[0] ae45e1a3832fbb6c96707687e42f0b4aaab52c9b
[1] 2d34cf0c16dd8fa71fb593e65ce4734cb61d9170

10 days agosystemd-coredump: add COREDUMP_CODE (#42019)
Yu Watanabe [Tue, 19 May 2026 18:10:40 +0000 (03:10 +0900)] 
systemd-coredump: add COREDUMP_CODE (#42019)

Add COREDUMP_CODE to the fields captured by systemd-coredump. This makes
it possible for system administrators to filter coredumps based on si_code,
which describes the reason why a given signal was sent.

For example, to find processes killed due to invalid permissions
(SEGV_ACCERR):

$ journalctl COREDUMP_SIGNAL=11 COREDUMP_CODE=2

I've decided to add the value of si_code to the 'Signal: ' line of
coredumpctl info:
    Signal: 11 (SEGV) si_code: SEGV_ACCERR

10 days agonetworkd: add RouteTable= to [DHCPv6] section
Nandakumar Raghavan [Tue, 28 Apr 2026 11:14:48 +0000 (11:14 +0000)] 
networkd: add RouteTable= to [DHCPv6] section

Allow users to allow DHCPv6 unreachable/blackhole routes (installed
for delegated prefixes) into a specific routing table, analogous to
the existing RouteTable= in [DHCPv4] and [IPv6AcceptRA].

The config parser config_parse_dhcp_or_ra_route_table() is extended
with an AF_UNSPEC ltype discriminator for DHCPv6 (AF_INET6 is already
taken by NDISC/RA). link_get_dhcp6_route_table() follows the same
pattern as link_get_dhcp4_route_table() and link_get_ndisc_route_table(),
falling back to the VRF table when not explicitly set.

In dhcp_request_unreachable_route(), the table is applied only for
NETWORK_CONFIG_SOURCE_DHCP6 routes (the uplink unreachable aggregates),
not DHCP_PD routes (per-subnet routes on downstream interfaces), matching
the intent of the feature. The !route->table_set guard avoids overriding
a table already set by the route code.

10 days agobuild(deps): bump the actions group with 2 updates
dependabot[bot] [Tue, 19 May 2026 15:08:45 +0000 (15:08 +0000)] 
build(deps): bump the actions group with 2 updates

Bumps the actions group with 2 updates: [github/codeql-action](https://github.com/github/codeql-action) and [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials).

Updates `github/codeql-action` from 4.35.2 to 4.35.4
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/95e58e9a2cdfd71adc6e0353d5c52f41a045d225...68bde559dea0fdcac2102bfdf6230c5f70eb485e)

Updates `aws-actions/configure-aws-credentials` from 6.1.0 to 6.1.1
- [Release notes](https://github.com/aws-actions/configure-aws-credentials/releases)
- [Changelog](https://github.com/aws-actions/configure-aws-credentials/blob/main/CHANGELOG.md)
- [Commits](https://github.com/aws-actions/configure-aws-credentials/compare/ec61189d14ec14c8efccab744f656cffd0e33f37...d979d5b3a71173a29b74b5b88418bfda9437d885)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.35.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: aws-actions/configure-aws-credentials
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
10 days agoTranslations update from Fedora Weblate (#42181)
Luca Boccassi [Tue, 19 May 2026 16:53:11 +0000 (17:53 +0100)] 
Translations update from Fedora Weblate (#42181)

Translations update from [Fedora
Weblate](https://translate.fedoraproject.org) for
[systemd/main](https://translate.fedoraproject.org/projects/systemd/main/).

Current translation status:

![Weblate translation
status](https://translate.fedoraproject.org/widget/systemd/main/horizontal-auto.svg)

10 days agopo: Translated using Weblate (Georgian) 42181/head
Temuri Doghonadze [Tue, 19 May 2026 16:01:24 +0000 (16:01 +0000)] 
po: Translated using Weblate (Georgian)

Currently translated at 100.0% (270 of 270 strings)

Co-authored-by: Temuri Doghonadze <temuri.doghonadze@gmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/ka/
Translation: systemd/main

10 days agopo: Translated using Weblate (Polish)
Marek Adamski [Tue, 19 May 2026 16:01:23 +0000 (16:01 +0000)] 
po: Translated using Weblate (Polish)

Currently translated at 100.0% (270 of 270 strings)

Co-authored-by: Marek Adamski <maradam@users.noreply.translate.fedoraproject.org>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/pl/
Translation: systemd/main

10 days agopo: Translated using Weblate (Ukrainian)
Yuri Chornoivan [Tue, 19 May 2026 16:01:22 +0000 (16:01 +0000)] 
po: Translated using Weblate (Ukrainian)

Currently translated at 100.0% (270 of 270 strings)

Co-authored-by: Yuri Chornoivan <yurchor@ukr.net>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/uk/
Translation: systemd/main

10 days agopo: Translated using Weblate (Swedish)
Luna Jernberg [Tue, 19 May 2026 16:01:22 +0000 (16:01 +0000)] 
po: Translated using Weblate (Swedish)

Currently translated at 100.0% (270 of 270 strings)

Co-authored-by: Luna Jernberg <droidbittin@gmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/sv/
Translation: systemd/main

10 days agopo: Translated using Weblate (Portuguese)
Américo Monteiro [Tue, 19 May 2026 16:01:21 +0000 (16:01 +0000)] 
po: Translated using Weblate (Portuguese)

Currently translated at 100.0% (270 of 270 strings)

Co-authored-by: Américo Monteiro <a_monteiro@gmx.com>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/pt/
Translation: systemd/main

10 days agopo: Translated using Weblate (Turkish)
Oğuz Ersen [Tue, 19 May 2026 16:01:21 +0000 (16:01 +0000)] 
po: Translated using Weblate (Turkish)

Currently translated at 100.0% (270 of 270 strings)

Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/tr/
Translation: systemd/main

10 days agodependabot: Ignore mkosi
Daan De Meyer [Tue, 19 May 2026 13:56:57 +0000 (13:56 +0000)] 
dependabot: Ignore mkosi

It doesn't update MinimumVersion= in mkosi.conf which breaks
tools/fetch-mkosi.py.

10 days agotest: pin stress-ng --vm-method to a portable scalar method in TEST-55-OOMD
Luca Boccassi [Tue, 19 May 2026 10:29:58 +0000 (11:29 +0100)] 
test: pin stress-ng --vm-method to a portable scalar method in TEST-55-OOMD

The stress-ng "vm" stressor's default --vm-method=all cycles through every
VM stress method, including newer ones that use AVX-512 instructions. On
CPUs without AVX-512 support (e.g. AMD Zen 1 to 3) those methods crash with
SIGILL. In testcase_oom_rulesets_lasting_sec all 10 stress-ng workers die
within ~2.34 seconds, so by the time the 6 second sleep elapses the unit
is already in failed/exit-code state and the assert_eq for
ActiveState=active trips.

Pin --vm-method=zero-one, a long-standing scalar method, on all four
stress-ng --vm invocations in this test (the two transient services in
testcase_oom_rulesets and testcase_oom_rulesets_lasting_sec, plus
TEST-55-OOMD-testbloat.service and TEST-55-OOMD-testmunch.service) so the
workers do not crash on AVX-512-less CPUs. testbloat, testmunch and
testcase_oom_rulesets have not been observed failing because they get
OOM-killed by systemd-oomd within ~1 to 2 seconds, before stress-ng cycles
into an AVX-512 method, but they share the same latent flake.

Journal excerpts from the failing run, TEST-55-OOMD-slowrule.service in
testcase_oom_rulesets_lasting_sec (journalctl -o short-monotonic):

[   58.018676] stress-ng[1015]: invoked with '/usr/bin/stress-ng --timeout 15s --vm 10 --vm-bytes 50M --vm-keep' by user 0 'root'
[   59.866072] stress-ng[1030]: stress-ng: debug: [1030] caught SIGILL, address 0x000055bd8d609140 (ILL_ILLOPN)
[   59.921050] stress-ng[1030]: stress-ng: debug: [1030] stress-ng: info: 0x000055bd8d609140:<62>71 fd 48 6f 2d 36 14 1c 00 c5 d1 ef ed 49 29
[   59.929310] stress-ng[1015]: stress-ng: error: [1015] vm: [1021] terminated with an error, exit status=2 (stressor failed)
[   60.364111] stress-ng[1015]: stress-ng: info:  [1015] failed: 10: vm (10)
[   60.364493] stress-ng[1015]: stress-ng: info:  [1015] unsuccessful run completed in 2.34 secs
[   60.371290] systemd[1]: TEST-55-OOMD-slowrule.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
[   60.371396] systemd[1]: TEST-55-OOMD-slowrule.service: Failed with result 'exit-code'.
[   64.017061] TEST-55-OOMD.sh[1010]: + assert_eq failed active
[   64.018167] TEST-55-OOMD.sh[1039]: FAIL: expected: 'active' actual: 'failed'

The faulting bytes marked by stress-ng with <62> (the byte at the
instruction pointer) decode unambiguously to an AVX-512 VMOVDQA64 using
the 512-bit zmm13 register, confirmed independently by two disassemblers:

  $ printf '\x62\x71\xfd\x48\x6f\x2d\x36\x14\x1c\x00' | ndisasm -b 64 -
  00000000  6271FD486F2D3614  vmovdqa64 zmm13,zword [rel 0x1c1440]
           -1C00

  $ echo '0x62, 0x71, 0xfd, 0x48, 0x6f, 0x2d, 0x36, 0x14, 0x1c, 0x00' | \
        llvm-mc -disassemble -triple=x86_64 -mattr=+avx512f
          .text
          vmovdqa64       1840182(%rip), %zmm13

The leading 0x62 is the EVEX prefix (exclusive to AVX-512 on this target),
zmm13 is a 512-bit register that only exists when AVX-512 is implemented,
and VMOVDQA64 requires the AVX512F (Foundation) CPUID feature (Intel SDM
Vol 2C). Executing this on a CPU without AVX-512 raises #UD, delivered by
the kernel as SIGILL/ILL_ILLOPN, matching the journal entry above. The
same journal shows the kernel reporting "kvm_amd: TSC scaling supported",
i.e. the guest is on AMD KVM, and AMD did not ship AVX-512 before Zen 4.

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
10 days agovmspawn: port help() to help-util.h APIs
Lennart Poettering [Tue, 19 May 2026 12:42:04 +0000 (14:42 +0200)] 
vmspawn: port help() to help-util.h APIs

10 days agoUpdate NEWS
Luca Boccassi [Tue, 19 May 2026 13:11:13 +0000 (14:11 +0100)] 
Update NEWS