On Tue, Jun 19, 2018 at 03:32:45PM +0100, Catalin Marinas wrote: > On Mon, Jun 18, 2018 at 01:03:00PM +0100, Mark Rutland wrote: > > +asmlinkage void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr, > > + syscall_fn_t syscall_table[]) > > +{ > > + unsigned long flags = current_thread_info()->flags; > > + > > + regs->orig_x0 = regs->regs[0]; > > + regs->syscallno = scno; > > + > > + local_daif_restore(DAIF_PROCCTX); > > + user_exit(); > > + > > + if (has_syscall_work(flags)) { > > + /* set default errno for user-issued syscall(-1) */ > > + if (scno == NO_SYSCALL) > > + regs->regs[0] = -ENOSYS; > > + scno = syscall_trace_enter(regs); > > + if (scno == NO_SYSCALL) > > + goto trace_exit; > > + } > > + > > + invoke_syscall(regs, scno, sc_nr, syscall_table); > > + > > + /* > > + * The tracing status may have changed under our feet, so we have to > > + * check again. However, if we were tracing entry, then we always trace > > + * exit regardless, as the old entry assembly did. > > + */ > > + if (!has_syscall_work(flags)) { > > + local_daif_mask(); > > + flags = current_thread_info()->flags; > > + if (!has_syscall_work(flags)) > > + return; > > + local_daif_restore(DAIF_PROCCTX); > > + } > > IIUC the above 'if' block replaces ret_fast_syscall in entry.S with the > work_pending handled via ret_to_user (we used to check _TIF_WORK_MASK in > two places). Yes. This replaces the _TIF_SYSCALL_WORK check from ret_fast_syscall, leaving the _TIF_WORK_MASK check to the usual ret_to_user path. > Reviewed-by: Catalin Marinas <catalin.marinas@xxxxxxx> Thanks! Mark.