[PATCH v2 00/17] Wire up getrandom() vDSO implementation on powerpc

Christophe Leroy posted 17 patches 1 year, 3 months ago
There is a newer version of this series
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
[PATCH v2 00/17] Wire up getrandom() vDSO implementation on powerpc
Posted by Christophe Leroy 1 year, 3 months ago
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

-- 
2.44.0
Re: [PATCH v2 00/17] Wire up getrandom() vDSO implementation on powerpc
Posted by Jason A. Donenfeld 1 year, 3 months ago
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
Re: [PATCH v2 00/17] Wire up getrandom() vDSO implementation on powerpc
Posted by Jason A. Donenfeld 1 year, 3 months ago
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
getrandom() vDSO archs (arm64, ppc, loongarch) for 6.12 [Was: Re: [PATCH v2 00/17] Wire up getrandom() vDSO implementation on powerpc]
Posted by Jason A. Donenfeld 1 year, 3 months ago
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