[PATCH v7] linux: Add support for getrandom vDSO
Jason A. Donenfeld
Jason@zx2c4.com
Fri Sep 20 22:21:14 GMT 2024
On Thu, Sep 19, 2024 at 01:30:38PM +0200, Stefan Liebler wrote:
> On 18.09.24 21:22, Xi Ruoyao wrote:
> > On Wed, 2024-09-18 at 16:01 +0200, Jason A. Donenfeld wrote:
> >> Linux 6.11 has getrandom() in vDSO. It operates on a thread-local opaque
> >> state allocated with mmap using flags specified by the vDSO.
> >>
> >> Multiple states are allocated at once, as many as fit into a page, and
> >> these are held in an array of available states to be doled out to each
> >> thread upon first use, and recycled when a thread terminates. As these
> >> states run low, more are allocated.
> >>
> >> To make this procedure async-signal-safe, a simple guard is used in the
> >> LSB of the opaque state address, falling back to the syscall if there's
> >> reentrancy contention.
> >>
> >> Also, _Fork() is handled by blocking signals on opaque state allocation
> >> (so _Fork() always sees a consistent state even if it interrupts a
> >> getrandom() call) and by iterating over the thread stack cache on
> >> reclaim_stack. Each opaque state will be in the free states list
> >> (grnd_alloc.states) or allocated to a running thread.
> >>
> >> The cancellation is handled by always using GRND_NONBLOCK flags while
> >> calling the vDSO, and falling back to the cancellable syscall if the
> >> kernel returns EAGAIN (would block). Since getrandom is not defined by
> >> POSIX and cancellation is supported as an extension, the cancellation is
> >> handled as 'may occur' instead of 'shall occur' [1], meaning that if
> >> vDSO does not block (the expected behavior) getrandom will not act as a
> >> cancellation entrypoint. It avoids a pthread_testcancel call on the fast
> >> path (different than 'shall occur' functions, like sem_wait()).
> >>
> >> It is currently enabled for x86_64, which is available in Linux 6.11,
> >> and aarch64, powerpc32, powerpc64, loongarch64, and s390x, which are
> >> available in Linux 6.12.
> >>
> >> Link: https://pubs.opengroup.org/onlinepubs/9799919799/nframe.html [1]
> >> Co-developed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> >> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
> >
> > Tested on x86_64, aarch64, and loongarch64. Glibc test suite passes and
> > gdb shows vdso is really used.
> Same on s390x.
I'll extract your 'Tested-by', then, if that's okay.
More information about the Libc-alpha
mailing list