• Dan Williams's avatar
    x86, powerpc: Rename memcpy_mcsafe() to copy_mc_to_{user, kernel}() · ec6347bb
    Dan Williams authored
    In reaction to a proposal to introduce a memcpy_mcsafe_fast()
    implementation Linus points out that memcpy_mcsafe() is poorly named
    relative to communicating the scope of the interface. Specifically what
    addresses are valid to pass as source, destination, and what faults /
    exceptions are handled.
    
    Of particular concern is that even though x86 might be able to handle
    the semantics of copy_mc_to_user() with its common copy_user_generic()
    implementation other archs likely need / want an explicit path for this
    case:
    
      On Fri, May 1, 2020 at 11:28 AM Linus Torvalds <torvalds@linux-foundation.org> wrote:
      >
      > On Thu, Apr 30, 2020 at 6:21 PM Dan Williams <dan.j.williams@intel.com> wrote:
      > >
      > > However now I see that copy_user_generic() works for the wrong reason.
      > > It works because the exception on the source address due to poison
      > > looks no different than a write fault on the user address to the
      > > caller, it's still just a short copy. So it makes copy_to_user() work
      > > for the wrong reason relative to the name.
      >
      > Right.
      >
      > And it won't work that way on other architectures. On x86, we have a
      > generic function that can take faults on either side, and we use it
      > for both cases (and for the "in_user" case too), but that's an
      > artifact of the architecture oddity.
      >
      > In fact, it's probably wrong even on x86 - because it can hide bugs -
      > but writing those things is painful enough that everybody prefers
      > having just one function.
    
    Replace a single top-level memcpy_mcsafe() with either
    copy_mc_to_user(), or copy_mc_to_kernel().
    
    Introduce an x86 copy_mc_fragile() name as the rename for the
    low-level x86 implementation formerly named memcpy_mcsafe(). It is used
    as the slow / careful backend that is supplanted by a fast
    copy_mc_generic() in a follow-on patch.
    
    One side-effect of this reorganization is that separating copy_mc_64.S
    to its own file means that perf no longer needs to track dependencies
    for its memcpy_64.S benchmarks.
    
     [ bp: Massage a bit. ]
    Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Reviewed-by: default avatarTony Luck <tony.luck@intel.com>
    Acked-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Cc: <stable@vger.kernel.org>
    Link: http://lore.kernel.org/r/CAHk-=wjSqtXAqfUJxFtWNwmguFASTgB0dz1dT3V-78Quiezqbg@mail.gmail.com
    Link: https://lkml.kernel.org/r/160195561680.2163339.11574962055305783722.stgit@dwillia2-desk3.amr.corp.intel.com
    ec6347bb
uaccess.h 16.5 KB