• Linus Torvalds's avatar
    x86: remove 'zerorest' argument from __copy_user_nocache() · e1f2750e
    Linus Torvalds authored
    Every caller passes in zero, meaning they don't want any partial copy to
    zero the remainder of the destination buffer.
    
    Which is just as well, because the implementation of that function
    didn't actually even look at that argument, and wasn't even aware it
    existed, although some misleading comments did mention it still.
    
    The 'zerorest' thing is a historical artifact of how "copy_from_user()"
    worked, in that it would zero the rest of the kernel buffer that it
    copied into.
    
    That zeroing still exists, but it's long since been moved to generic
    code, and the raw architecture-specific code doesn't do it.  See
    _copy_from_user() in lib/usercopy.c for this all.
    
    However, while __copy_user_nocache() shares some history and superficial
    other similarities with copy_from_user(), it is in many ways also very
    different.
    
    In particular, while the code makes it *look* similar to the generic
    user copy functions that can copy both to and from user space, and take
    faults on both reads and writes as a result, __copy_user_nocache() does
    no such thing at all.
    
    __copy_user_nocache() always copies to kernel space, and will never take
    a page fault on the destination.  What *can* happen, though, is that the
    non-temporal stores take a machine check because one of the use cases is
    for writing to stable memory, and any memory errors would then take
    synchronous faults.
    
    So __copy_user_nocache() does look a lot like copy_from_user(), but has
    faulting behavior that is more akin to our old copy_in_user() (which no
    longer exists, but copied from user space to user space and could fault
    on both source and destination).
    
    And it very much does not have the "zero the end of the destination
    buffer", since a problem with the destination buffer is very possibly
    the very source of the partial copy.
    
    So this whole thing was just a confusing historical artifact from having
    shared some code with a completely different function with completely
    different use cases.
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e1f2750e
usercopy_64.c 3.63 KB