]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
Use __put_user_goto in __put_user_size() and unsafe_put_user()
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 22 May 2016 04:55:19 +0000 (21:55 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 5 Jan 2019 02:15:25 +0000 (18:15 -0800)
commita959dc88f9c8900296ccf13e2f3e1cbc555a8917
tree8a8d5219ad5b7430107c92fe1ec3082611a5ce05
parent4a789213c9a54c8b618924d3421e56e98df8a447
Use __put_user_goto in __put_user_size() and unsafe_put_user()

This actually enables the __put_user_goto() functionality in
unsafe_put_user().

For an example of the effect of this, this is the code generated for the

        unsafe_put_user(signo, &infop->si_signo, Efault);

in the waitid() system call:

movl %ecx,(%rbx)        # signo, MEM[(struct __large_struct *)_2]

It's just one single store instruction, along with generating an
exception table entry pointing to the Efault label case in case that
instruction faults.

Before, we would generate this:

xorl    %edx, %edx
movl %ecx,(%rbx)        # signo, MEM[(struct __large_struct *)_3]
        testl   %edx, %edx
        jne     .L309

with the exception table generated for that 'mov' instruction causing us
to jump to a stub that set %edx to -EFAULT and then jumped back to the
'testl' instruction.

So not only do we now get rid of the extra code in the normal sequence,
we also avoid unnecessarily keeping that extra error register live
across it all.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/x86/include/asm/uaccess.h