linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 00/23] Add generic vdso_base tracking
@ 2021-06-11 18:02 Dmitry Safonov
  2021-06-11 18:02 ` [PATCH v3 01/23] x86/elf: Check in_x32_syscall() in compat_arch_setup_additional_pages() Dmitry Safonov
                   ` (25 more replies)
  0 siblings, 26 replies; 45+ messages in thread
From: Dmitry Safonov @ 2021-06-11 18:02 UTC (permalink / raw)
  To: linux-kernel
  Cc: Dmitry Safonov, Dmitry Safonov, Alexander Viro, Andrew Morton,
	Andy Lutomirski, Arnd Bergmann, Borislav Petkov, Catalin Marinas,
	Christophe Leroy, Guo Ren, H. Peter Anvin, Ingo Molnar,
	Oleg Nesterov, Russell King, Thomas Bogendoerfer,
	Thomas Gleixner, Vincenzo Frascino, Will Deacon, x86

v3 Changes:
- Migrated arch/powerpc to vdso_base
- Added x86/selftest for unmapped vdso & no landing on fast syscall
- Review comments from Andy & Christophe (thanks!)
- Amended s/born process/execed process/ everywhere I noticed
- Build robot warning on cast from __user pointer

I've tested it on x86, I would appreciate any help with
Tested-by on arm/arm64/mips/powerpc/s390/... platforms.

One thing I've noticed while cooking this and haven't found a clean
way to solve is zero-terminated .pages[] array in vdso mappings, which
is not always zero-terminated but works by the reason of
VM_DONTEXPAND on mappings.

v2 Changes:
- Rename user_landing to vdso_base as it tracks vDSO VMA start address,
  rather than the explicit address to land (Andy)
- Reword and don't use "new-execed" and "new-born" task (Andy)
- Fix failures reported by build robot

Started from discussion [1], where was noted that currently a couple of
architectures support mremap() for vdso/sigpage, but not munmap().
If an application maps something on the ex-place of vdso/sigpage,
later after processing signal it will land there (good luck!)

Patches set is based on linux-next (next-20201123) and it depends on
changes in x86/cleanups (those reclaim TIF_IA32/TIF_X32) and also
on my changes in akpm (fixing several mremap() issues).

Logically, the patches set divides on:
- patch       1: a cleanup for patches in x86/cleanups
- patches  2-13: cleanups for arch_setup_additional_pages()
- patches 13-14: x86 signal changes for unmapped vdso
- patches 15-22: provide generic vdso_base in mm_struct
- patch      23: selftest for unmapped vDSO & fast syscalls

In the end, besides cleanups, it's now more predictable what happens for
applications with unmapped vdso on architectures those support .mremap()
for vdso/sigpage.

I'm aware of only one user that unmaps vdso - Valgrind [2].
(there possibly are more, but this one is "special", it unmaps vdso, but
 not vvar, which confuses CRIU [Checkpoint Restore In Userspace], that's
 why I'm aware of it)

Patches as a .git branch:
https://github.com/0x7f454c46/linux/tree/vdso_base-v3

v2 Link:
https://lore.kernel.org/lkml/20201124002932.1220517-1-dima@arista.com/
v1 Link:
https://lore.kernel.org/lkml/20201108051730.2042693-1-dima@arista.com/

[1]: https://lore.kernel.org/linux-arch/CAJwJo6ZANqYkSHbQ+3b+Fi_VT80MtrzEV5yreQAWx-L8j8x2zA@mail.gmail.com/
[2]: https://github.com/checkpoint-restore/criu/issues/488

Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
Cc: Guo Ren <guoren@kernel.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: x86@kernel.org

Dmitry Safonov (23):
  x86/elf: Check in_x32_syscall() in
    compat_arch_setup_additional_pages()
  elf: Move arch_setup_additional_pages() to generic elf.h
  arm/elf: Remove needless ifdef CONFIG_MMU
  arm64: Use in_compat_task() in arch_setup_additional_pages()
  x86: Remove compat_arch_setup_additional_pages()
  elf: Remove compat_arch_setup_additional_pages()
  vdso: Set mm->context.vdso only on success of
    _install_special_mapping()
  elf/vdso: Modify arch_setup_additional_pages() parameters
  elf: Use sysinfo_ehdr in ARCH_DLINFO()
  arm/vdso: Remove vdso pointer from mm->context
  s390/vdso: Remove vdso_base pointer from mm->context
  sparc/vdso: Remove vdso pointer from mm->context
  mm/mmap: Make vm_special_mapping::mremap return void
  x86/signal: Land on &frame->retcode when vdso isn't mapped
  x86/signal: Check if vdso_image_32 is mapped before trying to land on it
  mm: Add vdso_base in mm_struct
  x86/vdso: Migrate to generic vdso_base
  arm/vdso: Migrate to generic vdso_base
  arm64/vdso: Migrate compat signals to generic vdso_base
  arm64/vdso: Migrate native signals to generic vdso_base
  mips/vdso: Migrate to generic vdso_base
  powerpc/vdso: Migrate native signals to generic vdso_base
  x86/vdso/selftest: Add a test for unmapping vDSO

 arch/Kconfig                                  |   3 +
 arch/alpha/include/asm/elf.h                  |   2 +-
 arch/arm/Kconfig                              |   2 +
 arch/arm/include/asm/elf.h                    |  10 +-
 arch/arm/include/asm/mmu.h                    |   3 -
 arch/arm/include/asm/vdso.h                   |   6 +-
 arch/arm/kernel/process.c                     |  14 +-
 arch/arm/kernel/signal.c                      |   6 +-
 arch/arm/kernel/vdso.c                        |  20 +--
 arch/arm64/Kconfig                            |   2 +
 arch/arm64/include/asm/elf.h                  |  27 +---
 arch/arm64/include/asm/mmu.h                  |   4 -
 arch/arm64/kernel/signal.c                    |  10 +-
 arch/arm64/kernel/signal32.c                  |  17 +-
 arch/arm64/kernel/vdso.c                      |  72 +++------
 arch/csky/Kconfig                             |   1 +
 arch/csky/include/asm/elf.h                   |   4 -
 arch/csky/kernel/vdso.c                       |  11 +-
 arch/hexagon/Kconfig                          |   1 +
 arch/hexagon/include/asm/elf.h                |   6 -
 arch/hexagon/kernel/vdso.c                    |   3 +-
 arch/ia64/include/asm/elf.h                   |   2 +-
 arch/mips/Kconfig                             |   2 +
 arch/mips/include/asm/elf.h                   |  10 +-
 arch/mips/include/asm/mmu.h                   |   2 -
 arch/mips/kernel/signal.c                     |  11 +-
 arch/mips/kernel/vdso.c                       |   5 +-
 arch/mips/vdso/genvdso.c                      |   9 --
 arch/nds32/Kconfig                            |   1 +
 arch/nds32/include/asm/elf.h                  |   8 +-
 arch/nds32/kernel/vdso.c                      |   8 +-
 arch/nios2/Kconfig                            |   1 +
 arch/nios2/include/asm/elf.h                  |   4 -
 arch/nios2/mm/init.c                          |   2 +-
 arch/powerpc/Kconfig                          |   2 +
 arch/powerpc/include/asm/book3s/32/mmu-hash.h |   1 -
 arch/powerpc/include/asm/book3s/64/mmu.h      |   1 -
 arch/powerpc/include/asm/elf.h                |   9 +-
 arch/powerpc/include/asm/mmu_context.h        |   9 --
 arch/powerpc/include/asm/nohash/32/mmu-40x.h  |   1 -
 arch/powerpc/include/asm/nohash/32/mmu-44x.h  |   1 -
 arch/powerpc/include/asm/nohash/32/mmu-8xx.h  |   1 -
 arch/powerpc/include/asm/nohash/mmu-book3e.h  |   1 -
 arch/powerpc/kernel/signal_32.c               |   8 +-
 arch/powerpc/kernel/signal_64.c               |   4 +-
 arch/powerpc/kernel/vdso.c                    |  48 +-----
 arch/powerpc/perf/callchain_32.c              |   8 +-
 arch/powerpc/perf/callchain_64.c              |   4 +-
 arch/riscv/Kconfig                            |   1 +
 arch/riscv/include/asm/elf.h                  |   9 +-
 arch/riscv/kernel/vdso.c                      |  11 +-
 arch/s390/Kconfig                             |   1 +
 arch/s390/include/asm/elf.h                   |  10 +-
 arch/s390/include/asm/mmu.h                   |   1 -
 arch/s390/kernel/vdso.c                       |  12 +-
 arch/sh/Kconfig                               |   1 +
 arch/sh/include/asm/elf.h                     |  16 +-
 arch/sh/kernel/vsyscall/vsyscall.c            |   3 +-
 arch/sparc/Kconfig                            |   1 +
 arch/sparc/include/asm/elf_64.h               |  11 +-
 arch/sparc/include/asm/mmu_64.h               |   1 -
 arch/sparc/vdso/vma.c                         |  20 +--
 arch/x86/Kconfig                              |   2 +
 arch/x86/entry/common.c                       |  10 +-
 arch/x86/entry/vdso/extable.c                 |   4 +-
 arch/x86/entry/vdso/vma.c                     |  79 ++++-----
 arch/x86/ia32/ia32_signal.c                   |  18 ++-
 arch/x86/include/asm/compat.h                 |   6 +
 arch/x86/include/asm/elf.h                    |  44 ++---
 arch/x86/include/asm/mmu.h                    |   1 -
 arch/x86/include/asm/mmu_context.h            |   5 -
 arch/x86/include/asm/vdso.h                   |   4 +
 arch/x86/kernel/cpu/resctrl/pseudo_lock.c     |   3 +-
 arch/x86/kernel/signal.c                      |  25 ++-
 arch/x86/um/asm/elf.h                         |   9 +-
 arch/x86/um/vdso/vma.c                        |   2 +-
 fs/Kconfig.binfmt                             |   3 +
 fs/aio.c                                      |   3 +-
 fs/binfmt_elf.c                               |  19 ++-
 fs/binfmt_elf_fdpic.c                         |  17 +-
 fs/compat_binfmt_elf.c                        |  12 --
 include/asm-generic/mm_hooks.h                |   9 +-
 include/linux/elf.h                           |  24 ++-
 include/linux/mm.h                            |   3 +-
 include/linux/mm_types.h                      |  21 ++-
 kernel/fork.c                                 |   1 +
 mm/mmap.c                                     |  28 ++--
 mm/mremap.c                                   |   2 +-
 tools/testing/selftests/x86/.gitignore        |   1 +
 tools/testing/selftests/x86/Makefile          |  11 +-
 .../testing/selftests/x86/test_munmap_vdso.c  | 151 ++++++++++++++++++
 91 files changed, 511 insertions(+), 491 deletions(-)
 create mode 100644 tools/testing/selftests/x86/test_munmap_vdso.c


base-commit: 614124bea77e452aa6df7a8714e8bc820b489922
-- 
2.31.1


^ permalink raw reply	[flat|nested] 45+ messages in thread

end of thread, other threads:[~2023-10-11 23:21 UTC | newest]

Thread overview: 45+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-11 18:02 [PATCH v3 00/23] Add generic vdso_base tracking Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 01/23] x86/elf: Check in_x32_syscall() in compat_arch_setup_additional_pages() Dmitry Safonov
2021-06-19 20:41   ` Thomas Gleixner
2021-06-21 20:59     ` Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 02/23] elf: Move arch_setup_additional_pages() to generic elf.h Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 03/23] arm/elf: Remove needless ifdef CONFIG_MMU Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 04/23] arm64: Use in_compat_task() in arch_setup_additional_pages() Dmitry Safonov
2021-06-15 10:21   ` Will Deacon
2021-06-11 18:02 ` [PATCH v3 05/23] x86: Remove compat_arch_setup_additional_pages() Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 06/23] elf: " Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 07/23] vdso: Set mm->context.vdso only on success of _install_special_mapping() Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 08/23] elf/vdso: Modify arch_setup_additional_pages() parameters Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 09/23] elf: Use sysinfo_ehdr in ARCH_DLINFO() Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 10/23] arm/vdso: Remove vdso pointer from mm->context Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 11/23] s390/vdso: Remove vdso_base " Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 12/23] sparc/vdso: Remove vdso " Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 13/23] mm/mmap: Make vm_special_mapping::mremap return void Dmitry Safonov
2021-06-17  7:20   ` Christophe Leroy
2021-06-21 21:12     ` Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 14/23] x86/signal: Land on &frame->retcode when vdso isn't mapped Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 15/23] x86/signal: Check if vdso_image_32 is mapped before trying to land on it Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 16/23] mm: Add vdso_base in mm_struct Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 17/23] x86/vdso: Migrate to generic vdso_base Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 18/23] arm/vdso: " Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 19/23] arm64/vdso: Migrate compat signals " Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 20/23] arm64/vdso: Migrate native " Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 21/23] mips/vdso: Migrate " Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 22/23] powerpc/vdso: Migrate native signals " Dmitry Safonov
2021-06-15 12:52   ` Michael Ellerman
2021-06-17  6:30   ` Christophe Leroy
2021-06-17  6:36   ` Christophe Leroy
2021-06-17  7:34     ` Christophe Leroy
2021-06-21 21:22       ` Dmitry Safonov
2021-06-11 18:02 ` [PATCH v3 23/23] x86/vdso/selftest: Add a test for unmapping vDSO Dmitry Safonov
2021-06-11 18:21   ` Shuah Khan
2021-06-11 18:37     ` Dmitry Safonov
2021-06-11 18:43       ` Shuah Khan
2021-06-17  9:13 ` [PATCH v3 00/23] Add generic vdso_base tracking Christophe Leroy
2021-06-21 21:57   ` Dmitry Safonov
2022-03-09 15:41 ` Christophe Leroy
2022-03-10 21:17   ` Dmitry Safonov
2022-08-19  9:17     ` Christophe Leroy
2022-08-23 19:13       ` Dmitry Safonov
2023-10-11 10:28         ` Christophe Leroy
2023-10-11 23:20 ` H. Peter Anvin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).