rseq_syscall_enter_work() is invoked before the syscall number can be
modified. So there is no point in rereading it from pt_regs.

Signed-off-by: Thomas Gleixner <[email protected]>
---
 include/linux/entry-common.h |    9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

--- a/include/linux/entry-common.h
+++ b/include/linux/entry-common.h
@@ -70,9 +70,10 @@ static inline void syscall_enter_audit(s
        }
 }
 
-static __always_inline long syscall_trace_enter(struct pt_regs *regs, unsigned 
long work)
+static __always_inline long syscall_trace_enter(struct pt_regs *regs, unsigned 
long work,
+                                               long syscall)
 {
-       long syscall, ret = 0;
+       long ret = 0;
 
        /*
         * Handle Syscall User Dispatch.  This must comes first, since
@@ -90,7 +91,7 @@ static __always_inline long syscall_trac
         * through hrtimer_interrupt().
         */
        if (work & SYSCALL_WORK_SYSCALL_RSEQ_SLICE)
-               rseq_syscall_enter_work(syscall_get_nr(current, regs));
+               rseq_syscall_enter_work(syscall);
 
        /* Handle ptrace */
        if (work & (SYSCALL_WORK_SYSCALL_TRACE | SYSCALL_WORK_SYSCALL_EMU)) {
@@ -145,7 +146,7 @@ static __always_inline long syscall_ente
        unsigned long work = READ_ONCE(current_thread_info()->syscall_work);
 
        if (work & SYSCALL_WORK_ENTER)
-               syscall = syscall_trace_enter(regs, work);
+               syscall = syscall_trace_enter(regs, work, syscall);
 
        return syscall;
 }


Reply via email to