[PATCH v7] linux: Add support for getrandom vDSO
Stefan Liebler
stli@linux.ibm.com
Thu Sep 19 11:30:38 GMT 2024
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.
>
> Tested-by: Xi Ruoyao <xry111@xry111.site>
>
More information about the Libc-alpha
mailing list