-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
x86, powerpc: Rename memcpy_mcsafe() to copy_mc_to_{user, kernel}()
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: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Tony Luck <tony.luck@intel.com> Acked-by: Michael 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
- Loading branch information
Dan Williams
authored and
Borislav Petkov
committed
Oct 6, 2020
1 parent
ed9705e
commit ec6347b
Showing
38 changed files
with
433 additions
and
531 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
#ifndef _COPY_MC_TEST_H_ | ||
#define _COPY_MC_TEST_H_ | ||
|
||
#ifndef __ASSEMBLY__ | ||
#ifdef CONFIG_COPY_MC_TEST | ||
extern unsigned long copy_mc_test_src; | ||
extern unsigned long copy_mc_test_dst; | ||
|
||
static inline void copy_mc_inject_src(void *addr) | ||
{ | ||
if (addr) | ||
copy_mc_test_src = (unsigned long) addr; | ||
else | ||
copy_mc_test_src = ~0UL; | ||
} | ||
|
||
static inline void copy_mc_inject_dst(void *addr) | ||
{ | ||
if (addr) | ||
copy_mc_test_dst = (unsigned long) addr; | ||
else | ||
copy_mc_test_dst = ~0UL; | ||
} | ||
#else /* CONFIG_COPY_MC_TEST */ | ||
static inline void copy_mc_inject_src(void *addr) | ||
{ | ||
} | ||
|
||
static inline void copy_mc_inject_dst(void *addr) | ||
{ | ||
} | ||
#endif /* CONFIG_COPY_MC_TEST */ | ||
|
||
#else /* __ASSEMBLY__ */ | ||
#include <asm/export.h> | ||
|
||
#ifdef CONFIG_COPY_MC_TEST | ||
.macro COPY_MC_TEST_CTL | ||
.pushsection .data | ||
.align 8 | ||
.globl copy_mc_test_src | ||
copy_mc_test_src: | ||
.quad 0 | ||
EXPORT_SYMBOL_GPL(copy_mc_test_src) | ||
.globl copy_mc_test_dst | ||
copy_mc_test_dst: | ||
.quad 0 | ||
EXPORT_SYMBOL_GPL(copy_mc_test_dst) | ||
.popsection | ||
.endm | ||
|
||
.macro COPY_MC_TEST_SRC reg count target | ||
leaq \count(\reg), %r9 | ||
cmp copy_mc_test_src, %r9 | ||
ja \target | ||
.endm | ||
|
||
.macro COPY_MC_TEST_DST reg count target | ||
leaq \count(\reg), %r9 | ||
cmp copy_mc_test_dst, %r9 | ||
ja \target | ||
.endm | ||
#else | ||
.macro COPY_MC_TEST_CTL | ||
.endm | ||
|
||
.macro COPY_MC_TEST_SRC reg count target | ||
.endm | ||
|
||
.macro COPY_MC_TEST_DST reg count target | ||
.endm | ||
#endif /* CONFIG_COPY_MC_TEST */ | ||
#endif /* __ASSEMBLY__ */ | ||
#endif /* _COPY_MC_TEST_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.