* + arm64-avoid-memcpy-for-syscall_get_arguments.patch added to mm-nonmm-unstable branch
@ 2025-12-16 23:46 Andrew Morton
0 siblings, 0 replies; only message in thread
From: Andrew Morton @ 2025-12-16 23:46 UTC (permalink / raw)
To: mm-commits, will, tglx, rostedt, rmk+kernel, mark.rutland, macro,
ldv, jcmvbkbc, deller, chris, charlie, catalin.marinas,
ruanjinjie, akpm
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 5024 bytes --]
The patch titled
Subject: arm64: avoid memcpy() for syscall_get_arguments()
has been added to the -mm mm-nonmm-unstable branch. Its filename is
arm64-avoid-memcpy-for-syscall_get_arguments.patch
This patch will shortly appear at
https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/arm64-avoid-memcpy-for-syscall_get_arguments.patch
This patch will later appear in the mm-nonmm-unstable branch at
git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
Before you just go and hit "reply", please:
a) Consider who else should be cc'ed
b) Prefer to cc a suitable mailing list as well
c) Ideally: find the original patch on the mailing list and do a
reply-to-all to that, adding suitable additional cc's
*** Remember to use Documentation/process/submit-checklist.rst when testing your code ***
The -mm tree is included into linux-next via various
branches at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
and is updated there most days
------------------------------------------------------
From: Jinjie Ruan <ruanjinjie@huawei.com>
Subject: arm64: avoid memcpy() for syscall_get_arguments()
Date: Mon, 1 Dec 2025 20:06:33 +0800
Do not use memcpy() to extract syscall arguments from struct pt_regs but
rather just perform direct assignments.
Update syscall_set_arguments() too to keep syscall_get_arguments() and
syscall_set_arguments() in sync.
With Generic Entry patch[1] and turn on audit, the performance benchmarks
from perf bench basic syscall on kunpeng920 gives roughly a 1% performance
uplift.
| Metric | W/O this patch | With this patch | Change |
| ---------- | -------------- | --------------- | --------- |
| Total time | 2.241 [sec] | 2.211 [sec] | ↓1.36% |
| usecs/op | 0.224157 | 0.221146 | ↓1.36% |
| ops/sec | 4,461,157 | 4,501,409 | ↑0.9% |
Disassembly shows that using direct assignment causes
syscall_set_arguments() to be inlined and cuts the instruction count by
five or six compared to memcpy(). Because __audit_syscall_entry() only
uses four syscall arguments, the compiler has also elided the copy of
regs->regs[4] and regs->regs[5].
Before:
<syscall_get_arguments.constprop.0>:
aa0103e2 mov x2, x1
91002003 add x3, x0, #0x8
f9408804 ldr x4, [x0, #272]
f8008444 str x4, [x2], #8
a9409404 ldp x4, x5, [x0, #8]
a9009424 stp x4, x5, [x1, #8]
a9418400 ldp x0, x1, [x0, #24]
a9010440 stp x0, x1, [x2, #16]
f9401060 ldr x0, [x3, #32]
f9001040 str x0, [x2, #32]
d65f03c0 ret
d503201f nop
After:
a9408e82 ldp x2, x3, [x20, #8]
2a1603e0 mov w0, w22
f9400e84 ldr x4, [x20, #24]
f9408a81 ldr x1, [x20, #272]
9401c4ba bl ffff800080215ca8 <__audit_syscall_entry>
This also aligns the implementation with x86 and RISC-V.
Link: https://lkml.kernel.org/r/20251201120633.1193122-3-ruanjinjie@huawei.com
Link: https://lore.kernel.org/all/20251126071446.3234218-1-ruanjinjie@huawei.com/ [1]
Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Charlie Jenkins <charlie@rivosinc.com>
Cc: Christian Zankel <chris@zankel.net>
Cc: "Dmitry V. Levin" <ldv@strace.io>
Cc: Helge Deller <deller@gmx.de>
Cc: Maciej W. Rozycki <macro@orcam.me.uk>
Cc: Marc Rutland <mark.rutland@arm.com>
Cc: Max Filippov <jcmvbkbc@gmail.com>
Cc: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleinxer <tglx@linutronix.de>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
arch/arm64/include/asm/syscall.h | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
--- a/arch/arm64/include/asm/syscall.h~arm64-avoid-memcpy-for-syscall_get_arguments
+++ a/arch/arm64/include/asm/syscall.h
@@ -82,16 +82,24 @@ static inline void syscall_get_arguments
unsigned long *args)
{
args[0] = regs->orig_x0;
- args++;
-
- memcpy(args, ®s->regs[1], 5 * sizeof(args[0]));
+ args[1] = regs->regs[1];
+ args[2] = regs->regs[2];
+ args[3] = regs->regs[3];
+ args[4] = regs->regs[4];
+ args[5] = regs->regs[5];
}
static inline void syscall_set_arguments(struct task_struct *task,
struct pt_regs *regs,
const unsigned long *args)
{
- memcpy(®s->regs[0], args, 6 * sizeof(args[0]));
+ regs->regs[0] = args[0];
+ regs->regs[1] = args[1];
+ regs->regs[2] = args[2];
+ regs->regs[3] = args[3];
+ regs->regs[4] = args[4];
+ regs->regs[5] = args[5];
+
/*
* Also copy the first argument into orig_x0
* so that syscall_get_arguments() would return it
_
Patches currently in -mm which might be from ruanjinjie@huawei.com are
syscallh-remove-unused-syscall_max_args.patch
arm64-avoid-memcpy-for-syscall_get_arguments.patch
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-12-16 23:46 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-16 23:46 + arm64-avoid-memcpy-for-syscall_get_arguments.patch added to mm-nonmm-unstable branch Andrew Morton
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.