In uvm_pdaemon.c 1.121, 1.122, and 1.123, two things happened:
1. The shortage target inside uvmpd_scan() / uvmpd_scan_inactive() which
used to be computed using the realtime uvmexp.free value, was replaced with a
(historic prediction) using the pre-existing pagedaemon "shortage" variable.
This means the scanner will continue work even if the system recovers
memory asyncronously and has resolved the scarcity which caused the pagedaemon
to be summoned. That's a bad idea. The code should revert to observing
realtime system conditions. We don't have a diff for that yet, but the
other concern is immediate:
2. The pre-existing calculation of the "shortage" variable was changed
significally, without verifying correct behaviour.
size += shortage;
...
shortage -= bufbackoff(&constraint, size * 2);
since bufbackoff() returns how much it did, and generally succeeds at
satisfying the full request size * 2, that is effectively "shortage =
-shortage". The scan function changes still expect a positive target
[5 lines not shown]
The pagedaemon inspects the top-most sleeping pmemrange allocation for
for size and constraint, and passes this information to the inactive
scanner. The idea is that an extremely high-size and
strict-constraint allocation that fails repeatedly would percolate to
the top of the list. To ensure the scanner can inspect this
allocation's constraint via the pointer, it gets locked. Then we
release tons of memory from the buffer cache, and run the scanner to
recover free memory. At the same time, other running operations free
and allocate memory and wakeup all the sleeping pmemrange allocations,
but no, not this one, because it is locked so that the pointer won't
become invalid. When the scan is done, we may once again have meager
memory resources because all the good stuff was allocated by
asyncronous allocators, potentially creating substantial fragmentation
not compatible with the constraint. Now, the sleeping request gets
unlocked and woken to re-check it's requirements and guess what, the
constraint fails it goes back to sleep, and we need to go around
again... In practice this is a hard uvm deadlock.
Instead, copy the constraint from the request, do not lock the
allocation request and ignore the pointer.
[4 lines not shown]
ls(1): use correct buffer size for ngroup.
In numeric long format, ngroup is formatted using sizeof nuser. That's a
copy-paste bug. It's harmless only because the arrays are the same size
today; it would become a real truncation/overflow risk if they ever
diverge.
From Michal Mazurek (akfaew@), thanks!
OK kn@, tb@
Build vmm-firmware (seabios) using devel/x86_64-elf/gcc
Using a toolchain dedicated to standalone x86 executables should be more
reliable than adding workarounds each time an llvm update breaks this
port. The patch to keep the .fixedaddr.* sections doesn't seem needed
any more.
General agreement/ok from sthen@ dv@ mlarkin@ and kn@, thanks kn@ for
the tests.
p5-Image-ExifTool: remove ${HOMEPAGE} from ${SITES} and point to SourceForge.
To reduce load on the exiftool.org server, upstream moved distfiles there.
This allows fetching distfile again. Pointed out by tb@, thanks!
set CPPFLAGS/LDFLAGS to consistently pick up headers and libraries on
gcc and clang archs. add dep on fftw.
fixes a build problem on ports-gcc archs where the default library path
includes /usr/local/lib/gcc/ARCH-unknown-openbsd/15.2.0/../../.., a.k.a.
/usr/local/lib, but the default include search path for system headers
just has /usr/local/lib/gcc/x86_64-unknown-openbsd/15.2.0/include{,-fixed}
and /usr/include (so the library is picked up, but headers are not).
ok claudio@
rpki-client: explain why we do what we do in ta_check_pubkey()
The base64-encoded SPKI blob in the TAL should really be matched against
the corresponding part of the cert's DER. Unfortunately, libcrypto only
stores internal representations in the X509's cert_info field, so what it
hands back via the X509_* and X509_PUBKEY_* API is at best re-encoded and
therefore unsuitable for this purpose. Document this so when I will have
forgotten this the day after tomorrow, I still have a chance of not wasting
as much time for a third or fourth time next time I revisit this.
ok claudio
rpki-client: rename ta_parse() to ta_validate() and document it
ta_parse() only parses the TAL's SPKI, so it is misnamed. What it really
does is it compares the TA's SPKI to the TAL's SPKI and checks that it is
a curently valid, self-signed cert.
ok claudio