Re: [patch 16/18] x86/entry: Get rid of the sys_ni_syscall() indirection
Jinjie Ruan <[email protected]> Thu, 9 Jul 2026 10:03:49 +0800
| Newsgroups | org.kernel.vger.linux-hexagon,dev.linux.lists.loongarch,org.infradead.lists.linux-riscv,org.infradead.lists.linux-snps-arc,org.infradead.lists.linux-um,org.kernel.vger.linux-alpha,org.kernel.vger.linux-arch,org.kernel.vger.linux-csky,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel,org.kernel.vger.linux-m68k,org.kernel.vger.linux-mips,org.kernel.vger.linux-openrisc,org.kernel.vger.linux-parisc,org.kernel.vger.linux-s390,org.kernel.vger.linux-sh,org.kernel.vger.sparclinux,org.ozlabs.lists.linuxppc-dev |
|---|---|
| Message-ID | <[email protected]> |
On 7/8/2026 3:07 AM, Thomas Gleixner wrote: > Invoking sys_ni_syscall() from a code path, which already knows that the > syscall number is invalid just to assign -ENOSYS to regs->ax is a pointless > exercise. It's even redundant as the low level entry code already has set > regs->ax to -ENOSYS on entry. Makes sense, the all reltaed entry has already initialized regs->ax to -ENOSYS. This makes the code very concise. LGTM Reviewed-by: Jinjie Ruan <[email protected]> > > Remove the extra conditionals and the function calls. > > Signed-off-by: Thomas Gleixner <[email protected]> > --- > arch/x86/entry/syscall_32.c | 2 -- > arch/x86/entry/syscall_64.c | 10 +++------- > 2 files changed, 3 insertions(+), 9 deletions(-) > > --- a/arch/x86/entry/syscall_32.c > +++ b/arch/x86/entry/syscall_32.c > @@ -81,8 +81,6 @@ static __always_inline void do_syscall_3 > if (likely(unr < IA32_NR_syscalls)) { > unr = array_index_nospec(unr, IA32_NR_syscalls); > regs->ax = ia32_sys_call(regs, unr); > - } else if (nr != -1) { > - regs->ax = __ia32_sys_ni_syscall(regs); > } > } > > --- a/arch/x86/entry/syscall_64.c > +++ b/arch/x86/entry/syscall_64.c > @@ -68,7 +68,7 @@ static __always_inline bool do_syscall_x > return false; > } > > -static __always_inline bool do_syscall_x32(struct pt_regs *regs, int nr) > +static __always_inline void do_syscall_x32(struct pt_regs *regs, int nr) > { > /* > * Adjust the starting offset of the table, and convert numbers > @@ -80,9 +80,7 @@ static __always_inline bool do_syscall_x > if (IS_ENABLED(CONFIG_X86_X32_ABI) && likely(xnr < X32_NR_syscalls)) { > xnr = array_index_nospec(xnr, X32_NR_syscalls); > regs->ax = x32_sys_call(regs, xnr); > - return true; > } > - return false; > } > > /* Returns true to return using SYSRET, or false to use IRET */ > @@ -92,10 +90,8 @@ static __always_inline bool do_syscall_x > > instrumentation_begin(); > > - if (!do_syscall_x64(regs, nr) && !do_syscall_x32(regs, nr) && nr != -1) { > - /* Invalid system call, but still a system call. */ > - regs->ax = __x64_sys_ni_syscall(regs); > - } > + if (!do_syscall_x64(regs, nr)) > + do_syscall_x32(regs, nr); > > instrumentation_end(); > syscall_exit_to_user_mode(regs); >