On 03/29, Linus Torvalds wrote: > > On Wed, Mar 29, 2017 at 9:33 AM, Oleg Nesterov <o...@redhat.com> wrote: > > > > Firstly, why do we need the IS_ERR_VALUE() check? This is only used by > > do_signal/handle_signal, we do not care if it returns non-zero as long > > as the value can't be confused with -ERESTART.* codes. > > There are system calls that can return "negative" values that aren't errors. > > Notably mmap() can return a valid pointer with the high bit set. > > So syscall_get_error() should return 0 for not just positive return > values, but for those kinds of negative non-error values.
Once again, it is only used in arch/x86/kernel/signal.c by do_signal() and handle_signal(). We do not care if mmap() returns a valid pointer with the high bit set, regs-ax can't be confused with -ERESTART code. > > And why do we need the TS_ checks? > > Those may be bogus. > > > So why we can't simply change putreg32() to always sign-extend regs->ax > > regs->orig_ax and just do > > > > static inline long syscall_get_error(struct task_struct *task, > > struct pt_regs *regs) > > { > > return regs-ax; > > } > > That would be *complete* garbage. Lots of system calls return positive > values that sure as hell aren't errors. See above. And please note that I actually suggest to kill this helper and just use syscall_get_return_value() in arch/x86/kernel/signal.c. Oleg.