• Linus Torvalds's avatar
    Use __put_user_goto in __put_user_size() and unsafe_put_user() · a959dc88
    Linus Torvalds authored
    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: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    a959dc88
uaccess.h 21.2 KB