
Add percpu __cpu_xcall_entry to cache the process syscall table, which can save one task->xinfo load insruction in xcall/entry.S. Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com> --- arch/arm64/include/asm/xcall.h | 5 ++++- arch/arm64/kernel/xcall/entry.S | 5 +---- arch/arm64/kernel/xcall/xcall.c | 5 +++++ 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/arch/arm64/include/asm/xcall.h b/arch/arm64/include/asm/xcall.h index 71f27bad8185..28c2fda9aaa0 100644 --- a/arch/arm64/include/asm/xcall.h +++ b/arch/arm64/include/asm/xcall.h @@ -32,6 +32,7 @@ struct hw_xcall_info { #define TASK_HW_XINFO(p) ((struct hw_xcall_info *)p->xinfo) #define XCALL_ENTRY_SIZE (sizeof(unsigned long) * __NR_syscalls) +DECLARE_PER_CPU(void **, __cpu_xcall_entry); extern void xcall_entry(void); extern void no_xcall_entry(void); @@ -84,8 +85,10 @@ static inline void cpu_switch_xcall_entry(struct task_struct *tsk) if (!is_hw_xcall_support || !tsk->xinfo) return; - if (TASK_HW_XINFO(tsk)->xcall_scno_enabled) + if (TASK_HW_XINFO(tsk)->xcall_scno_enabled) { + __this_cpu_write(__cpu_xcall_entry, TASK_HW_XINFO(tsk)->xcall_entry); cpu_enable_arch_xcall(); + } } #endif /* CONFIG_ACTLR_XCALL_XINT */ diff --git a/arch/arm64/kernel/xcall/entry.S b/arch/arm64/kernel/xcall/entry.S index 4a3948aef8b2..4b7dc4d2ff9d 100644 --- a/arch/arm64/kernel/xcall/entry.S +++ b/arch/arm64/kernel/xcall/entry.S @@ -173,10 +173,7 @@ SYM_CODE_END(xcall_entry) bhs .Lskip_xcall\@ stp x20, x21, [sp, #0] - /* x21 = task_struct->xinfo->xcall_entry */ - ldr_this_cpu x20, __entry_task, x21 - ldr x21, [x20, #TSK_XCALL] - /* x21 = task_struct->xinfo->xcall_entry[x8] */ + ldr_this_cpu x21, __cpu_xcall_entry, x20 ldr x21, [x21, x8, lsl #3] br x21 .Lskip_xcall\@: diff --git a/arch/arm64/kernel/xcall/xcall.c b/arch/arm64/kernel/xcall/xcall.c index 0651f37c297a..580eb29b9cc0 100644 --- a/arch/arm64/kernel/xcall/xcall.c +++ b/arch/arm64/kernel/xcall/xcall.c @@ -26,6 +26,11 @@ static inline int sw_xcall_init_task(struct task_struct *p, struct task_struct * } #ifdef CONFIG_ACTLR_XCALL_XINT +static void *default_syscall_table[__NR_syscalls] = { + [0 ... __NR_syscalls - 1] = no_xcall_entry, +}; + +asmlinkage DEFINE_PER_CPU(void **, __cpu_xcall_entry) = default_syscall_table; static inline int hw_xcall_init_task(struct task_struct *p, struct task_struct *orig) { int i; -- 2.34.1