Commit Graph
312693 Commits
Author SHA1 Message Date
Konstantin Belousov 76f5fccc5f amd64 rtld: implement support for TLSDESC relocation
Discussed with:	jrtc27
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D59269
2026-09-06 01:00:10 +03:00
Konstantin Belousov d45d7aea61 i386 rtld: implement support for TLSDESC relocation
Discussed with:	jrtc27
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D59269
2026-09-06 01:00:10 +03:00
Konstantin Belousov fb63a60d6e rtld i386: use macro for the 'GNU ABI' calling convention of TLS resolver
Discussed with:	jrtc27
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D59269
2026-09-06 01:00:09 +03:00
Konstantin Belousov 5d9e5f4964 rtld: explain the use of rtld_bind_lock in rtld_get_addr_slow()
Discussed with:	jrtc27
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D59269
2026-09-06 01:00:09 +03:00
Konstantin Belousov 6a69d28ee0 rtld: allow arches to initialize/finalize objects
Discussed with:	jrtc27
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D59269
2026-09-06 01:00:09 +03:00
Abdelkader Boudih 7c73fdb618 video: bump __FreeBSD_version for V4L2 camera class renumbering
The camera control IDs in videoio.h changed numeric values; ports
consuming V4L2 camera controls need to be rebuilt.

Reviewed by:	thierry
Differential Revision:	https://reviews.freebsd.org/D59460
2026-09-05 22:18:39 +01:00
Abdelkader Boudih ea7c31ba9d video(4): fix camera control class ABI and add missing V4L2 constants
Renumbered the camera class to match the reference ABI and added the
constants ported applications expect:

Reviewed by:	thierry
Differential Revision:	https://reviews.freebsd.org/D59459
2026-09-05 22:18:13 +01:00
Gleb Smirnoff f1fa2f7db1 amd64: initialize IPI scoreboard earlier
The initializer just needs working malloc(9) and two constants that
are set at hammer_time().

Fixes:	648fa3558c

Reviewed by:		avg, markj
Differential Revision:	https://reviews.freebsd.org/D58714
2026-09-05 11:11:00 -07:00
Gleb Smirnoff d13ee10b77 random: don't collect entropy when scheduling software interrupt handlers
The entropy will be collected in intr_event_schedule_thread() for event
handlers that are marked as entropy sources.  The quality of entropy
provided by SWI wasn't great anyway.

Reviewed by:		cem, ngie
Differential Revision:	https://reviews.freebsd.org/D58829
2026-09-05 11:03:40 -07:00
Dag-Erling Smørgrav ff4b81eea8 syscalls: Avoid C++ reserved words
Both kern_renameat() and kern_dup() had arguments named `new`.  Rename
their arguments to match their respecitve manual pages.

Sponsored by:	Klara, Inc.
Sponsored by:	NetApp, Inc.
Reviewed by:	kib
Differential Revision:	https://reviews.freebsd.org/D59386
2026-09-05 17:44:35 +02:00
Dag-Erling Smørgrav 4ec3ca55f9 hastd: Add rudimentary tests
Test that we can start and stop hastd with an empty configuration.

Reviewed by:	kevans
Differential Revision:	https://reviews.freebsd.org/D59345
2026-09-05 17:44:35 +02:00
Dag-Erling Smørgrav 7dfadd78ba hastd: Add a stop control message
Add a stop control message which causes hastd to clean up and terminate.

Reviewed by:	kevans
Differential Revision:	https://reviews.freebsd.org/D59344
2026-09-05 17:44:35 +02:00
Dag-Erling Smørgrav 911bda7cff hastd: Ensure nvpair padding is initialized
The proto-libnv implementation embedded in hastd pads names and values
out to the nearest multiple of eight bytes, but leaves the padding
uninitialized, leaking up to 14 bytes of recycled heap per pair in a
message.

While here, switch from bcopy() to memcpy().

MFC after:	3 days
Reviewed by:	kevans, emaste
Differential Revision:	https://reviews.freebsd.org/D59343
2026-09-05 17:44:34 +02:00
Siva Mahadevan a73bb621ca contrib/kyua: fix -Wshadow error
This fixes the build with gcc 14:

/usr/src/contrib/kyua/engine/prepare/prepare_all.cpp:56:16: error: declaration of 'handler' shadows a member of 'engine::prepare::prepare_all' [-Werror=shadow]
   56 |     for (auto& handler : prepare::handlers()) {
      |                ^~~~~~~
In file included from /usr/src/contrib/kyua/engine/prepare/prepare_all.hpp:35,
                 from /usr/src/contrib/kyua/engine/prepare/prepare_all.cpp:29:
/usr/src/contrib/kyua/engine/prepare/prepare.hpp:51:15: note: shadowed declaration is here
   51 | class handler {
      |               ^

Fixes:	edb230c4af

Reviewed by:	igoro, rlibby, ngie
MFC after:	3 days
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D59346
2026-09-05 10:12:11 -04:00
Siva Mahadevan d7ed56b0fc lib/msun/tests: remove nearbyint test xfail on riscv
PR:		290099
MFC after:	3 days
Sponsored by:	The FreeBSD Foundation
2026-09-05 09:53:54 -04:00
Alexander Ziaee 555972c6c9 tun.4: Canonicalize SYNOPSIS and AUTHORS
While here, s/PR#2411/NetBSD PR#2411/ in the comments for clarity.
I had to go to netbsd sources to get this information.

MFC after:	3 days
Event:		Berlin Hackathon 202609
2026-09-05 09:49:14 -04:00
Alexander Ziaee ef3239cd4a tws.4: Canonicalize SYNOPSIS + nits
+ wrap some long lines
+ escape some ? wildcards
+ no macros in width specifiers
+ mention the speed in HARDWARE (bumps date)
+ use the hyperlink macro for... the defunct LSI website...
+ write out a symbol heavy error message format string in mdoc

MFC after:	3 days
Event:		Berlin Hackathon 202609
2026-09-05 09:47:44 -04:00
Faraz Vahedi 72ed6f9c9d libc: Add WCHAR_WIDTH in <wchar.h> as well
Define __WCHAR_WIDTH in sys/_types.h and derive WCHAR_WIDTH from
that, the same way as WCHAR_MIN and WCHAR_MAX, in both <wchar.h>
and <stdint.h> as per C23 §7.31.1 and §7.22.3.4, respectively.

Reviewed by:	fuz
Approved by:	fuz (mentor)
MFC after:	1 month
Differential Revision:	https://reviews.freebsd.org/D59385
2026-09-05 14:11:22 +03:30
Faraz Vahedi 733ea4ee58 libc: Add <inttypes.h> C23 feature test macro
Define __STDC_VERSION_INTTYPES_H__ now that the header fully
conforms to C23.

Reviewed by:	fuz
Approved by:	fuz (mentor)
MFC after:	1 month
Differential Revision:	https://reviews.freebsd.org/D59382
2026-09-05 12:00:29 +03:30
Justin Hibbits 5aeedaf720 powerpc/ddb: Dump more state in show pcpu
Add a new CPU-family `show pcpu` handler, cpu_db_show_mdpcpu() to dump
CPU-specific PCPU data.  Only Book-E is populated for now, but AIM may
be populated later.

These new field prints: save areas, TLB miss nesting, the new critical
stack pointer.  All of them have been very useful for debugging very
esoteric bugs, so make them easier to see from DDB, instead of having to
rummage through hex dumps.
2026-09-05 00:11:57 -04:00
Justin Hibbits d8f9d3388f powerpc/pmap(booke): Allocate 64-bit roots from DMAP
When a TLB miss exception occurs the exception handler must walk the
page table from the root.  When the root is allocated from KVA the TLB
miss exception may take another exception if the root page(s) aren't in
the TLB.

The 64-bit page table is modeled after the AIM radix page table, with a
64kB root "page", so 16 pages.  This makes regular use of UMA
allocations unable to refer back to the DMAP, which itself is mapped in
TLB1.  Now we take another page from the radix pmap driver and grab
contiguous pages from the VM system, so that we can simply refer
directly to DMAP and avoid more nested TLB misses.  We can still take a
nested miss, though, because the pmap itself may be in KVA, but this
reduces the nesting.
2026-09-05 00:11:53 -04:00
Justin Hibbits eef2607526 powerpc/pmap(booke): Rework TID reuse
If a pmap is freed and its memory is reused before its TID reference is
taken, then arbitrary memory will be clobbered.  Avoid this by never
dereferencing the pmap pointer in the tidbusy array, and instead using
it as a compare sentinel.
2026-09-05 00:11:34 -04:00
Justin Hibbits 68ecb918a5 powerpc/booke: Reorganize FRAME_LEAVE
There's a small window between when the SRR* registers are restore and
the exception returns, in which a TLB miss exception may be triggered.
Since there are not special SRR* registers for TLB miss exceptions, the
registers from the frame will be ovwritten, and the FRAME_LEAVE block
will effectively be re-entered on exit, leading to a very hard to
diagnose panic or wedge.

Minimize this chance by pushing the SRR* restore to the last possible
moments, caching them in a PCPU save area instead until the end.  This
matches what the AIM side already does.
2026-09-05 00:09:45 -04:00
Justin Hibbits 564fe16c97 powerpc/booke: Use a dedicated critical exception stack
A critical exception, such as a watchdog, can trigger at any time,
including the middle of a standard exception prologue or epilogue, so
GPRs, including %r1 (the stack pointer) cannot be trusted at all.
Instead, use a private stack pointer for critical interrupts.  Each CPU
now has its own critical exception stack, with the boot stack in the
bss.
2026-09-05 00:09:22 -04:00
Justin Hibbits 42f9049ab8 powerpc/watchdog: Make e500 watchdog action tunable
There are 4 options for e500 watchdog timeout, which may be core- or
even SoC- specific.  Add support to tune the behavior via a tunable
(machdep.watchdog_mode).  The tunable value is an integer 0-3.
2026-09-05 00:09:07 -04:00
Zishun Yi 6e1436d748 LinuxKPI: Fix DMA_BIDIRECTIONAL and other mappings
In dma_sync_single_for_cpu(), the DMA_BIDIRECTIONAL direction currently
performs BUS_DMASYNC_POSTREAD followed by BUS_DMASYNC_PREREAD. This
patch corrects the mapping to use BUS_DMASYNC_POSTREAD |
BUS_DMASYNC_POSTWRITE.

When ownership of the DMA area is transferred to the CPU, we must assume
the previous device access was bidirectional. Both POST operations are
necessary to ensure the CPU sees a consistent view of memory after
potential device reads and writes. A PREREAD is unnecessary here because
the device will no longer access the memory since ownership has been
transferred to the CPU.

Conversely, for dma_sync_single_for_device(), ownership is being
transferred back to the hardware. The buffer must be prepared for
potential bidirectional access by the device, requiring
BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE.

PR:		293381, 297155
Reported by:    Zishun Yi <[email protected]>
Reported by:	Kim Shrier (fbsdbugs westryn.net)
Fixes:		95edb10b47 ("LinuxKPI: implement dma_sync_single_for_*, apply to (un)map single/sg")
Signed-off-by:  Zishun Yi <[email protected]>
Reviewed by:	aokblast, bz
Differential Revision: https://reviews.freebsd.org/D55497
2026-09-04 22:52:24 +00:00
Alan Somers b551cb063c During shutdown, announce each file system as it's unmounted.
But only if debug.bootverbose=1.

MFC after:	2 weeks
Sponsored by:	ConnectWise
2026-09-04 15:12:46 -06:00
Robert Clausecker 9aff62dee2 freebsd-tips: documentation inside the bugs
Reviewed by:	ziaee
Event:		Berlin Hackathon 202609
2026-09-04 22:47:15 +02:00
Robert Clausecker d1c07141dc manpages: Fix author e-mail address formatting
- consistently use Mt request within Aq.  This makes author
   e-mail addresses clickable in many frontends.
 - @freebsd.org -> @FreeBSD.org
 - ([email protected]) -> Aq Mt [email protected]

Event:		Berlin Hackathon 202609
MFC after:	3 days
Reviewed by:	ziaee
Differential Revision:	https://reviews.freebsd.org/D59410
2026-09-04 21:46:20 +02:00
Enji Cooper 5b10c3c3e3 tty_pts: reduce/correct libatf-c linkage
ATF_TESTS_C automatically adds the appropriate library to LDADD --
there's no need to manually append the same library.

MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D59411
2026-09-04 11:18:55 -07:00
Baptiste Daroussin 885b0483fe pw: simplify group lookup in usermod
MFC After:	1 week
2026-09-04 19:54:39 +02:00
Olivier Cochard 61c27edf3e mkimg: Restore offset support for the SIZE partition form
Commit 50c1240ebf moved the offset parsing into the PART_KIND_FILE case of
the switch, leaving PART_KIND_SIZE with no offset handling.
The offset was then silently ignored, so "-p efi::$size:$start" as used by
release/${ARCH}/mkisoimages.sh packed the ESP immediately after the preceding
partition.

Parse the offset outside the switch so both forms honour it.

Add tests covering absolute and relative offsets in both forms.

Reviewed by:	jrtc27, bsdimp, jlduran
Approved by:	jlduran, bsdimp
Sponsored by:	Netflix
Assisted-by:	Claude Code (Opus 5)
2026-09-04 17:32:08 +02:00
Kyle Evans 619d092177 iuserboot: bump the interface to v6, add an accept_interpreter callback
If an explicit loader wasn't requested, then bhyveload(8) maintains a
/boot handle that it can use for swapping to a different flavor.  This
means that we expose all of the host /boot to the sandbox for the
duration of script execution.

Add a callback to ack that we're OK with the interpreter so that
bhyveload(8) can release the bootfd.  This is worth doing because it's
prior to guest script execution, so we're still running a reasonably
untainted process.

Reviewed by:	imp, jhb
Differential Revision:	https://reviews.freebsd.org/D58771
2026-09-04 10:26:35 -05:00
Konstantin Belousov c0c7b56d30 ntsync(4): do not double-free the alert event when a dup was detected for WAIT_ALL
Reported by:	Andrew Griffiths <[email protected]>
Reported by:	Chris Jarrett-Davies <[email protected]>
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
2026-09-04 17:44:07 +03:00
Baptiste Daroussin cd575d557b pw: fix error message in grp_set_passwd to use correct fd
MFC After:	1 week
2026-09-04 16:28:47 +02:00
Baptiste Daroussin 1ccf8075ea pw: remove mail file with unlinkat instead of building a path
This is consistent with how at jobs and crontabs are removed.

MFC After:	1 week
2026-09-04 16:28:47 +02:00
Baptiste Daroussin ba391775e8 pw: remove crontab with unlinkat instead of spawning crontab
crontab -r only unlinks the crontab file, so spawn it directly with
unlinkat() relative to conf.rootfd.  This also makes the crontab
removal work with pw -R.

MFC After:	1 week
2026-09-04 16:28:47 +02:00
Baptiste Daroussin 6b6aa45f9a pw: fix at job removal when deleting a user
rmat() used stat() with a path relative to the current working
directory, so it never found the job files in /var/at/jobs and the
at(1) jobs of a deleted user were never removed.

ef7d0eb948 also broke it by introducing a typo: /usr/sbin/atrm instead
of /usr/bin/artm.

Use fstatat() with the directory fd to stat the job files relative to
the at jobs directory, and unlinkat() them directly instead of spawning
atrm.

Those changes allow us to make it works with pw -R.

MFC After:	1 week
2026-09-04 16:28:47 +02:00
Baptiste Daroussin 5f5a1657a9 pw: cleanup
No functional change intended.

MFC After:	1 week
2026-09-04 16:28:46 +02:00
Pouria Mousavizadeh Tehrani cc7901791c nd6: Fix a typo on MAX_NEIGHBOR_ADVERTISEMENT comment
Fixes:	7f3b46fe54 ("ndp: Add support for Gratuitous Neighbor...")
2026-09-04 16:42:42 +03:30
Mark Johnston e1d903bbfa buf: Avoid calling bufdomain() on newly initialized bufs
bufinit() inserts newly initialized bufs into the QUEUE_EMPTY queue, at
which point they haven't yet been assigned a domain.  Thus, bufdomain()
returns &bdomain[-1], which trips the array-bounds sanitizer.

This is harmless since we don't use the result in that case, but let's
avoid the invalid access to begin with.  This is sufficient to let an
amd64 kernel boot to a login prompt with -fsanitize=array-bounds
configured.

Reported by:	Andrew Griffiths <[email protected]>
Reviewed by:	rlibby, kib
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D59381
2026-09-04 12:46:44 +00:00
Baptiste Daroussin 2350f75acb pw: check -M, -V and -R input to avoid dereferencing argv[2]
MFC After: 1 week
2026-09-04 12:42:30 +02:00
Baptiste Daroussin 92e8a76b87 pw: use _PWDASH pseudo-fd for "-" in pw_checkfd
pw_checkfd() returned the character "-" (45) for the "-" argument,
which was ambiguous with a real file descriptor.

MFC After:	1 week
2026-09-04 12:42:29 +02:00
Kajetan Staszkiewicz e3767e149b pf: Fix uninitialised action when dropping bad TTL ND packets
Approved by:	kp
Sponsored by:	InnoGames GmbH
Differential Revision:	https://reviews.freebsd.org/D58755
2026-09-04 12:02:26 +02:00
Piotr Kubaj c5d9485e7d umtx: do not sleep on an unowned mutex after a spurious CAS failure
On ll/sc architectures casueword32() may report a spurious
store-conditional failure (reservation lost to an interrupt, preemption,
or another CPU touching the same reservation granule), and this is
indistinguishable from a genuine comparison mismatch: both return 1.
That is intentional since D20772 and documented in casueword(9) ("The
store can fail on load-linked/store-conditional architectures."), so
callers must cope.

do_lock_normal() does not fully cope.  When the initial
UMUTEX_UNOWNED -> id acquire CAS fails spuriously, the observed owner is
still UMUTEX_UNOWNED, so neither the UMUTEX_CONTESTED branch nor the
real-owner case applies, and execution falls through past the "rv == 1
but not contested, likely store failure" comment into the sleep path.
There, the contested-bit CAS (expecting the observed owner, i.e.
UMUTEX_UNOWNED) succeeds because the mutex really is unowned, stamping
m_owner = UMUTEX_CONTESTED with no owner tid, and the thread sleeps on
"umtxn" forever: nobody owns the mutex, so no unlock and no wakeup ever
arrive.  In _UMUTEX_TRY mode the same situation returns a false EBUSY
for a free mutex.

Treat an observed owner of UMUTEX_UNOWNED like UMUTEX_CONTESTED: try to
acquire the mutex, setting the contested bit, instead of falling through
to the sleep path.  rv == 1 with the observed value equal to the
expected value can only mean a spurious store failure, so the mutex is
free.  If the acquire CAS fails again, the outer loop restarts and
re-evaluates ownership.  The contested bit set with no waiters present
only costs the matching unlock one trip through the kernel.

This was hit in practice on powerpc64le (POWER9): the Swift runtime's
Synchronization.Mutex issues _umtx_op(UMTX_OP_MUTEX_LOCK) directly with
no userspace fast path, so an uncontended lock of an unowned mutex runs
the kernel CAS exactly where a spurious failure deadlocks
(single-threaded process parked on "umtxn" with m_owner == 0x80000000,
observed as Foundation.Process.run() hanging).  libthr mostly masks the
bug because pthread_mutex_lock() enters the kernel only when there is a
real owner that will eventually issue a wakeup.

The mechanism was confirmed with an experimental powerpc kernel that
instead retried the ll/sc sequence inside casueword32()/casueword();
that also eliminated the hang, but is not proposed here since the
single-attempt semantics of casueword(9) are intentional.

Reviewed by:	kib
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D59338
2026-09-04 11:27:49 +02:00
Michael Tuexen 74d330943b tcp md5: improve consistency
All other usages of SCF_SIGNATURE are protected by IPSEC_SUPPORT
or TCP_SIGNATURE.
No functional change intended.

Reported by:	Hannes Elfert
MFC after:	1 week
MFC to:		stable/14
MFC to:		stable/15
2026-09-04 09:37:45 +02:00
Michael Tuexen 2fb53436cd tcp md5: fix accounting of ACK with bad signatures
When processing the ACK of the initial TCP handshake using the
SYN cookie, don't increment the counter for unexpected
signatures (tcps_sig_err_sigopt). The correct
counter (tcps_sig_rcvbadsig) for bad signatures is already
incremented in TCPMD5_INPUT().

Reported by:		Hannes Elfert
Reviewed by:		rscheff
MFC after:		1 week
MFC to:			stable/14
MFC to:			stable/15
Differential Revision:	https://reviews.freebsd.org/D59302
2026-09-04 09:28:35 +02:00
Kevin Bowling c004384343 ixgbe: Correct Wake-on-LAN configuration
Wake-on-LAN capability was inferred from NVM bits on every MAC even
though 82599 support is board and sometimes port specific.  Private
sysctls formed a second policy interface, and the driver neither
coordinated the controller wake source with PCI PME nor reliably
rebuilt address filters erased by the stop-time reset.

Use the standard ifconfig wake capabilities.  Derive support from the
82599 board and port matrix or the X540-and-newer NVM capability.
Require D3hot PME support, and use the NVM APME bit only to select the
initial magic-packet policy after initializing the LAN function number.

Snapshot requested filters before the terminal stop so shared reset and
PHY code sees the active wake policy.  After reset, restore RAR0, the
multicast table, receive filtering, and the optical laser before arming
WUFC, WUC, and PCI PME.  Remove device wake sources before clearing PCI
PME on detach, resume, and when wake is disabled.  Clear autonomous APM
so ifconfig remains authoritative.

Treat X550EM low-power-link-up failure as best effort and allow shutdown
to continue after a wake-programming error.

The 82599, X540, X550, and E610 datasheets document the standard ACPI
wake filters used here; the E610 ACPI path includes magic-packet wake.

Validated on a dual-port E610.  Both ports completed three direct-D3
cycles covering wake disabled and magic-packet wake armed.  A system S3
cycle woke through ix0 with WUS 0x00000002 (magic packet).  Link and
traffic recovered after each transition.

Note that many add-in cards in this family do not support WoL; LOM and
OCP cards are more likely.  The E610 as tested does.

MFC after:	2 weeks
Sponsored by:	Dirk-Willem van Gulik from Web Weaving (E610 hardware)
Sponsored by:	BBOX.io
2026-09-04 00:27:14 -07:00
Michael Tuexen 5d3e31df7c tcp md5: fix accounting for SYN segments with unexpected signature
When receiving a SYN segment with an MD5 option on a listening socket,
which has not enabled TCP MD5 support, increment the counter for
unexpected signatures (tcps_sig_err_sigopt).

Reviewed by:		rscheff
MFC after:		1 week
MFC to:			stable/14
MFC to:			stable/15
Differential Revision:	https://reviews.freebsd.org/D59303
2026-09-04 09:18:10 +02:00
Alan Cox 57407179be arm64 pmap: correct the condition for flushing the icache
Whenever we create a user-space mapping, we always set ATTR_S1_PXN in
the PTE, which blocks execution of user-space code while running in
kernel mode.  However, when seeking to determine whether we need to
perform an icache flush before installing the new PTE, we test whether
sometimes the old PTE or other times the new PTE has ATTR_S1_XN set.
The trouble is that ATTR_S1_XN is defined as the bitwise OR of
ATTR_S1_PXN and ATTR_S1_UXN, and so the test for whether ATTR_S1_XN is
set is satisfied if either of its constituent bits is set, i.e., we
write (l3e & ATTR_S1_XN) != 0.  Consequently, the test is always true.

In practice, I believe that the ill effects of this bug are limited:
In pmap_enter(), in rare circumstances, e.g., wiring a code page, an
unnecessary icache flush will be performed.  In pmap_enter_l2() and
pmap_enter_l3c(), no icache flush will be performed.  However,
typically an icache flush would have already been performed on each of
the constituent base pages.

Reviewed by:	kib, markj
MFC after:	3 weeks
Differential Revision:	https://reviews.freebsd.org/D59265
2026-09-04 00:19:13 -05:00