mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-13 09:34:23 -05:00
After switching ARM64 to the generic entry code, a syscall_exit_work()
appeared as a profiling hotspot because it is not inlined.
Inlining both syscall_trace_enter() and syscall_exit_work() provides a
performance gain when any of the work items is enabled. With audit enabled
this results in a ~4% performance gain for perf bench basic syscall on
a kunpeng920 system:
| Metric | Baseline | Inlined | Change |
| ---------- | ----------- | ----------- | ------ |
| Total time | 2.353 [sec] | 2.264 [sec] | ↓3.8% |
| usecs/op | 0.235374 | 0.226472 | ↓3.8% |
| ops/sec | 4,248,588 | 4,415,554 | ↑3.9% |
Small gains can be observed on x86 as well, though the generated code
optimizes for the work case, which is counterproductive for high
performance scenarios where such entry/exit work is usually avoided.
Avoid this by marking the work check in syscall_enter_from_user_mode_work()
unlikely, which is what the corresponding check in the exit path does
already.
[ tglx: Massage changelog and add the unlikely() ]
Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com>
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Link: https://patch.msgid.link/20260128031934.3906955-14-ruanjinjie@huawei.com
24 lines
525 B
C
24 lines
525 B
C
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
#include <linux/entry-common.h>
|
|
|
|
#define CREATE_TRACE_POINTS
|
|
#include <trace/events/syscalls.h>
|
|
|
|
/* Out of line to prevent tracepoint code duplication */
|
|
|
|
long trace_syscall_enter(struct pt_regs *regs, long syscall)
|
|
{
|
|
trace_sys_enter(regs, syscall);
|
|
/*
|
|
* Probes or BPF hooks in the tracepoint may have changed the
|
|
* system call number. Reread it.
|
|
*/
|
|
return syscall_get_nr(current, regs);
|
|
}
|
|
|
|
void trace_syscall_exit(struct pt_regs *regs, long ret)
|
|
{
|
|
trace_sys_exit(regs, ret);
|
|
}
|