]> Cypherpunks repositories - gostls13.git/commit
runtime: use vDSO for getrandom() on linux
authorJason A. Donenfeld <Jason@zx2c4.com>
Sun, 22 Sep 2024 01:45:29 +0000 (03:45 +0200)
committerGopher Robot <gobot@golang.org>
Sat, 28 Sep 2024 01:07:09 +0000 (01:07 +0000)
commiteb6f2c24cd17c0ca1df7e343f8d9187eef7d6e13
treed76c58100622eb5d33e3ffc451dd726a3dd898bd
parent677b6cc17544e5e667d4bb67d063f5d775c69e32
runtime: use vDSO for getrandom() on linux

Linux 6.11 supports calling getrandom() from the vDSO. It operates on a
thread-local opaque state allocated with mmap using flags specified by
the vDSO.

Opaque states are allocated in chunks, ideally ncpu at a time as a hint,
rounding up to as many fit in a complete page. On first use, a state is
assigned to an m, which owns that state, until the m exits, at which
point it is given back to the pool.

Performance appears to be quite good:

           │    sec/op    │   sec/op       vs base                 │
Read/4-16    222.45n ± 3%   27.13n   ± 6%  -87.80% (p=0.000 n=10)
           │     B/s      │      B/s       vs base                 │
Read/4-16    17.15Mi ± 3%   140.61Mi ± 6%  +719.82% (p=0.000 n=10)

Fixes #69577.

Change-Id: Ib6f44e8f2f3940c94d970eaada0eb566ec297dc7
Reviewed-on: https://go-review.googlesource.com/c/go/+/614835
Reviewed-by: Filippo Valsorda <filippo@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Auto-Submit: Jason Donenfeld <Jason@zx2c4.com>
Reviewed-by: Paul Murphy <murp@ibm.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
15 files changed:
src/crypto/rand/rand_test.go
src/internal/syscall/unix/getrandom.go
src/runtime/os_linux.go
src/runtime/sys_linux_amd64.s
src/runtime/sys_linux_arm64.s
src/runtime/sys_linux_loong64.s
src/runtime/sys_linux_ppc64x.s
src/runtime/sys_linux_s390x.s
src/runtime/vdso_linux_amd64.go
src/runtime/vdso_linux_arm64.go
src/runtime/vdso_linux_loong64.go
src/runtime/vdso_linux_ppc64x.go
src/runtime/vdso_linux_s390x.go
src/runtime/vgetrandom_linux.go [new file with mode: 0644]
src/runtime/vgetrandom_unsupported.go [new file with mode: 0644]