This series converts arm64 to the generic entry infrastructure.

Currently, architectures such as x86, RISC-V, LoongArch, PowerPC
and s390 use generic entry, which significantly reduces maintenance
burden and improves code elegance.  arm64 already adopted generic IRQ
entry in commit b3cf07851b6c ("arm64: entry: Switch to generic IRQ entry"),
making it the right time to complete the conversion.

This work brings arm64 in line with other major architectures,
reducing duplicated code and enabling future improvements like
Syscall User Dispatch and rseq time slice extension optimizations.

The series is rebased on v7.3-rc4 and has been tested with stress-ng,
hackbench, kselftests (ptrace, breakpoints, arm64/abi, arm64/fp, vDSO),
ptrace stress test, Pseudo-NMI load test, and the rr test suite [1].

A new kselftest ("selftests/arm64: Add ptrace SYSEMU/single-step tests")
is included at the end of the series, covering the syscall-exit
pseudo-step and single-step behaviour touched by this work.

Observable (non-ABI) changes worth calling out:

- The traceable functions on the syscall path change: syscall_trace_enter,
  syscall_trace_exit and el0_svc_common.constprop.0 are replaced by
  trace_syscall_enter, trace_syscall_exit and syscall_enter_audit, the
  same names x86, RISC-V, LoongArch and s390 already expose.

- CONFIG_DEBUG_RSEQ becomes unselectable on arm64 once GENERIC_ENTRY is
  set (rseq_syscall() becomes a no-op stub), so the earlier rseq_syscall()
  reordering is only temporary and the equivalent is handled by
  __rseq_debug_syscall_return().

On gVisor with systrap mode, the Syscall User Dispatch (SUD) feature
yields a slightly lower performance gain on arm64 (3% ~ 5%), similar to
that on x86 [2].

Result: the average over 1M getpid calls, ns/op

        | KVM VM Configuration | SUD    | no-SUD | Savings % |
        | -------------------  | -----  | -------| --------- |
        | 2 vCPU, pinned       | 4269.8 | 4509.5 | 5.3%      |
        | 4 vCPU, pinned       | 4175.4 | 4369.1 | 4.4%      |
        | 8 vCPU, pinned       | 4352.6 | 4485.4 | 3.0%      |

Note that this series does not yet enable SUD or the rseq time slice
extension on arm64: SUD additionally needs
ARCH_SUPPORTS_SYSCALL_USER_DISPATCH [3] and the rseq slice extension needs
HAVE_GENERIC_TIF_BITS [4], neither of which arm64 selects today.  The
numbers above are the motivation for enabling them in a follow-up.

Testing follow-up that still requires real hardware:

- MTE: run the MTE selftests on real hardware; part of them do not run
  under QEMU.

[1]: https://github.com/rr-debugger/rr/wiki/Building-And-Installing#tests
[2]: 
https://github.com/google/gvisor/commit/a45d6227b521012109cde9a942d644d778eb773b
[3]: 
https://lore.kernel.org/all/[email protected]/
[4]: https://lore.kernel.org/all/[email protected]/

Changes in v20:
- Add a kselftest covering the syscall-exit pseudo-step
  and single-step behaviour.
- Reword the first patch: it skips the pseudo-step for the emulated
  syscall rather than "fixing a redundant exit stop", and drop the
  Fixes: tag and Reviewed-by.
- Add Tested-by.
- Cover letter: document the observable changes and the testing
  follow-ups.
- Link to v19: 
https://lore.kernel.org/all/[email protected]/

Changes in v19:
- Rebased on v7.3-rc4.
- Fix build problem as Karl pointed out.
- Remove has_syscall_work() later to make it more clear.
- Add gvisor test data.
- Link to v18: 
https://lore.kernel.org/all/[email protected]/

Changes in v18:
- Rebased on v7.3-rc1.
- Drop the SUD patch as Mark suggeted.
- Update the commit message.
- Add Reviewed-by.
- Link to v17: 
https://lore.kernel.org/all/[email protected]/

For changes in v7 to v16, please refer to the individual patch threads:
- v16: 
https://lore.kernel.org/all/[email protected]/
- v15: 
https://lore.kernel.org/all/[email protected]/
- v14: 
https://lore.kernel.org/all/[email protected]/
- v13: 
https://lore.kernel.org/all/[email protected]/
- v12: 
https://lore.kernel.org/all/[email protected]/
- v11: 
https://lore.kernel.org/all/[email protected]/
- v10: 
https://lore.kernel.org/all/[email protected]/
- v9: 
https://lore.kernel.org/all/[email protected]/
- v8: 
https://lore.kernel.org/all/[email protected]/
- v7: https://lore.kernel.org/all/[email protected]/



Jinjie Ruan (15):
  arm64: ptrace: Drop redundant pseudo-single-step for SYSEMU_SINGLESTEP
  arm64: ptrace: Rework audit_syscall_entry()
  arm64: ptrace: Open-code seccomp check in syscall_trace_enter()
  arm64: ptrace: Rename and clean up syscall_trace_enter()
  arm64: ptrace: Protect rseq_syscall() from tracer PC modifications
  arm64: syscall: Rework the syscall exit path in el0_svc_common()
  arm64: ptrace: Pass thread flags to trace enter/exit
  arm64: ptrace: Extract arm64_syscall_exit_to_user_mode_work() helper
  arm64: ptrace: Align syscall exit work semantics with generic entry
  arm64: syscall: Use exit-specific flags check in el0_svc_common()
  arm64: syscall: Simplify el0_svc_common() syscall exit path
  arm64: ptrace: Make return type of arm64_syscall_trace_enter() bool
  arm64: entry: Convert to generic entry
  arm64: Inline el0_svc_common()
  selftests/arm64: Add ptrace SYSEMU/single-step tests

 arch/arm64/Kconfig                            |   2 +-
 arch/arm64/include/asm/entry-common.h         |  77 ++++++++++
 arch/arm64/include/asm/syscall.h              |   5 +-
 arch/arm64/include/asm/thread_info.h          |  16 +--
 arch/arm64/kernel/debug-monitors.c            |   8 ++
 arch/arm64/kernel/entry-common.c              |   2 +-
 arch/arm64/kernel/ptrace.c                    | 115 ---------------
 arch/arm64/kernel/signal.c                    |   2 +-
 arch/arm64/kernel/syscall.c                   |  34 ++---
 tools/testing/selftests/arm64/Makefile        |   2 +-
 tools/testing/selftests/arm64/ptrace/Makefile |   9 ++
 .../selftests/arm64/ptrace/ptrace_common.h    |  84 +++++++++++
 .../arm64/ptrace/single_step_signal_handler.c | 131 ++++++++++++++++++
 .../arm64/ptrace/single_step_syscall_stop.c   | 130 +++++++++++++++++
 .../ptrace/sysemu_singlestep_intercept.c      |  93 +++++++++++++
 .../ptrace/sysemu_singlestep_no_exit_stop.c   |  81 +++++++++++
 16 files changed, 631 insertions(+), 160 deletions(-)
 create mode 100644 tools/testing/selftests/arm64/ptrace/Makefile
 create mode 100644 tools/testing/selftests/arm64/ptrace/ptrace_common.h
 create mode 100644 
tools/testing/selftests/arm64/ptrace/single_step_signal_handler.c
 create mode 100644 
tools/testing/selftests/arm64/ptrace/single_step_syscall_stop.c
 create mode 100644 
tools/testing/selftests/arm64/ptrace/sysemu_singlestep_intercept.c
 create mode 100644 
tools/testing/selftests/arm64/ptrace/sysemu_singlestep_no_exit_stop.c

-- 
2.34.1


Reply via email to