| Message ID | cover.1724309198.git.christophe.leroy@csgroup.eu (mailing list archive) |
|---|---|
| Headers | show |
| Series | Wire up getrandom() vDSO implementation on powerpc | expand |
Hi Christophe, Thanks for this series. There are quite a few preliminary patches in it, before you get to the PPC part, which fix up general build system or test harness correctness issues. Since some of those affect all architectures that are adding vDSO getrandom() support for 6.12, I'm going to take those into my random.git tree as a fix for 6.11 now, in hopes that the new archs can mostly go into arch trees without too many tree interdependencies. So I'll reply to individual patches for that, mentioning which ones I extract. Jason
On Mon, Aug 26, 2024 at 09:19:22AM +0200, Jason A. Donenfeld wrote: > Hi Christophe, > > Thanks for this series. There are quite a few preliminary patches in it, > before you get to the PPC part, which fix up general build system or test > harness correctness issues. Since some of those affect all architectures > that are adding vDSO getrandom() support for 6.12, I'm going to take > those into my random.git tree as a fix for 6.11 now, in hopes that the > new archs can mostly go into arch trees without too many tree > interdependencies. > > So I'll reply to individual patches for that, mentioning which ones I > extract. I've committed a bunch of these to: https://git.kernel.org/pub/scm/linux/kernel/git/crng/random.git/log/ For a v3, if you rebase on there, that'd make things easier for me to keep picking patches that I intend to send out for 6.11-rc6 later this week. And then hopefully your 6.12 ppc implementation can just go in via the ppc tree with my eventual ack on the crypto part, without needing these interdependencies. Jason
Hey again, On Mon, Aug 26, 2024 at 09:19:22AM +0200, Jason A. Donenfeld wrote: > Thanks for this series. There are quite a few preliminary patches in it, > before you get to the PPC part, which fix up general build system or test > harness correctness issues. Since some of those affect all architectures > that are adding vDSO getrandom() support for 6.12, I'm going to take > those into my random.git tree as a fix for 6.11 now, in hopes that the > new archs can mostly go into arch trees without too many tree > interdependencies. > > So I'll reply to individual patches for that, mentioning which ones I > extract. Seeing the volume of these and the amount of ground they touch, I'm now having second thoughts about rushing this into 6.11. Particularly with the header changes, I think it might be smart to let it cook in linux-next for a bit before sending it to Linus. $ git --no-pager diff --name-only linus/master arch/x86/entry/vdso/vma.c arch/x86/include/asm/pvclock.h arch/x86/include/asm/vdso/vsyscall.h drivers/char/random.c include/asm-generic/unaligned.h include/vdso/helpers.h include/vdso/unaligned.h lib/vdso/Makefile lib/vdso/getrandom.c tools/arch/x86/vdso tools/include/linux/linkage.h tools/testing/selftests/vDSO/Makefile tools/testing/selftests/vDSO/vdso_config.h tools/testing/selftests/vDSO/vdso_test_getrandom.c So I think what I'll do is, for 6.11-rc6, send in the real bug fixes, which right now amount to: - random: vDSO: reject unknown getrandom() flags - random: vDSO: don't use 64-bit atomics on 32-bit architectures $ git --no-pager diff --name-only linus/master..a90592ab7cad drivers/char/random.c lib/vdso/getrandom.c And then for the pending aarm64, ppc64(/32?), and loongarch enablement patches for 6.12, I'll just take those through my random.git tree, which have all of these build-system preliminaries. And then we'll obviously require acks from the maintainers of the archs for each of those arch enablement patches. If that sounds like an acceptable plan, you might want to mention in the cover letter that you're basing your arch-specific patches on https://git.kernel.org/pub/scm/linux/kernel/git/crng/random.git/ and want an ack from the arch maintainer, etc. Jason
This series wires up getrandom() vDSO implementation on powerpc. Tested on PPC32. Performance on powerpc 885 (using kernel selftest): ~# ./vdso_test_getrandom bench-single vdso: 2500000 times in 7.897495392 seconds libc: 2500000 times in 56.091632232 seconds syscall: 2500000 times in 55.704851989 seconds Performance on powerpc 8321 (using kernel selftest): ~# ./vdso_test_getrandom bench-single vdso: 2500000 times in 2.017183250 seconds libc: 2500000 times in 13.088533630 seconds syscall: 2500000 times in 12.952458068 seconds Only build tested on PPC64. There is a problem with vdso_test_getrandom selftest, it doesn't find vDSO symbol __kernel_getrandom. There is the same problem with vdso_test_gettimeofday so it is not related to getrandom. On strange things to be clarified, there is the format of the key passed to __arch_chacha20_blocks_nostack(). In struct vgetrandom_state it is declared as a table of u32, but in reality it seems it is a flat storage that needs to be loaded in reversed byte order, so it should either be defined as a table of bytes, or as a table of __le32 but not a table of u32. But this has no impact and can be clarified later and fixed in a follow-up patch. Changes in v2: - Define VM_DROPPABLE for powerpc/32 - Fixes generic vDSO getrandom headers to enable CONFIG_COMPAT build. - Fixed size of generation counter - Fixed selftests to work on non x86 architectures Christophe Leroy (17): asm-generic/unaligned.h: Extract common header for vDSO vdso: Clean header inclusion in getrandom vdso: Add __arch_get_k_vdso_rng_data() vdso: Add missing c-getrandom-y in Makefile vdso: Avoid call to memset() by getrandom vdso: Change getrandom's generation to unsigned long mm: Define VM_DROPPABLE for powerpc/32 powerpc: Add little endian variants of LWZX_BE and STWX_BE powerpc/vdso32: Add crtsavres powerpc/vdso: Refactor CFLAGS for CVDSO build powerpc/vdso: Wire up getrandom() vDSO implementation selftests: vdso: Fix powerpc64 vdso_config selftests: vdso: Don't hard-code location of vDSO sources selftests: vdso: Make test_vdso_getrandom look for the right vDSO function selftests: vdso: Fix build of test_vdso_chacha selftests: vdso: Make VDSO function call more generic selftests: vdso: Add support for vdso_test_random for powerpc arch/powerpc/Kconfig | 1 + arch/powerpc/include/asm/asm-compat.h | 8 + arch/powerpc/include/asm/mman.h | 2 +- arch/powerpc/include/asm/vdso/getrandom.h | 67 ++++ arch/powerpc/include/asm/vdso/vsyscall.h | 6 + arch/powerpc/include/asm/vdso_datapage.h | 2 + arch/powerpc/kernel/asm-offsets.c | 1 + arch/powerpc/kernel/vdso/Makefile | 45 ++- arch/powerpc/kernel/vdso/getrandom.S | 58 ++++ arch/powerpc/kernel/vdso/gettimeofday.S | 13 - arch/powerpc/kernel/vdso/vdso32.lds.S | 1 + arch/powerpc/kernel/vdso/vdso64.lds.S | 1 + arch/powerpc/kernel/vdso/vgetrandom-chacha.S | 297 ++++++++++++++++++ arch/powerpc/kernel/vdso/vgetrandom.c | 14 + arch/x86/entry/vdso/vma.c | 3 + arch/x86/include/asm/pvclock.h | 1 + arch/x86/include/asm/vdso/vsyscall.h | 10 +- drivers/char/random.c | 5 +- fs/proc/task_mmu.c | 4 +- include/asm-generic/unaligned.h | 11 +- include/linux/mm.h | 4 +- include/trace/events/mmflags.h | 4 +- include/vdso/datapage.h | 2 +- include/vdso/getrandom.h | 2 +- include/vdso/helpers.h | 1 + include/vdso/unaligned.h | 15 + lib/vdso/Makefile | 1 + lib/vdso/getrandom.c | 30 +- tools/arch/powerpc/vdso | 1 + tools/arch/x86/vdso | 1 + tools/include/linux/linkage.h | 4 + tools/testing/selftests/vDSO/Makefile | 12 +- tools/testing/selftests/vDSO/vdso_call.h | 52 +++ tools/testing/selftests/vDSO/vdso_config.h | 14 +- .../selftests/vDSO/vdso_test_getrandom.c | 11 +- 35 files changed, 628 insertions(+), 76 deletions(-) create mode 100644 arch/powerpc/include/asm/vdso/getrandom.h create mode 100644 arch/powerpc/kernel/vdso/getrandom.S create mode 100644 arch/powerpc/kernel/vdso/vgetrandom-chacha.S create mode 100644 arch/powerpc/kernel/vdso/vgetrandom.c create mode 100644 include/vdso/unaligned.h create mode 120000 tools/arch/powerpc/vdso create mode 120000 tools/arch/x86/vdso create mode 100644 tools/testing/selftests/vDSO/vdso_call.h