tools arch: Update arch/x86/lib/memcpy_64.S copy used in 'perf bench mem memcpy'
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: 1f27a050fc679d16e68a40e0bb575364a89fad66 Gitweb: https://git.kernel.org/tip/1f27a050fc679d16e68a40e0bb575364a89fad66 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Mon, 30 Jul 2018 12:26:54 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 30 Jul 2018 12:36:51 -0300
tools arch: Update arch/x86/lib/memcpy_64.S copy used in 'perf bench mem memcpy'
To cope with the changes in:
12c89130a56a ("x86/asm/memcpy_mcsafe: Add write-protection-fault handling") 60622d68227d ("x86/asm/memcpy_mcsafe: Return bytes remaining")
bd131544aa7e ("x86/asm/memcpy_mcsafe: Add labels for __memcpy_mcsafe() write fault handling") da7bc9c57eb0 ("x86/asm/memcpy_mcsafe: Remove loop unrolling")
This needed introducing a file with a copy of the mcsafe_handle_tail() function, that is used in the new memcpy_64.S file, as well as a dummy mcsafe_test.h header.
Testing it:
$ nm ~/bin/perf | grep mcsafe 0000000000484130 T mcsafe_handle_tail 0000000000484300 T __memcpy_mcsafe $ $ perf bench mem memcpy # Running 'mem/memcpy' benchmark: # function 'default' (Default memcpy() provided by glibc) # Copying 1MB bytes ...
44.389205 GB/sec # function 'x86-64-unrolled' (unrolled memcpy() in arch/x86/lib/memcpy_64.S) # Copying 1MB bytes ...
22.710756 GB/sec # function 'x86-64-movsq' (movsq-based memcpy() in arch/x86/lib/memcpy_64.S) # Copying 1MB bytes ...
42.459239 GB/sec # function 'x86-64-movsb' (movsb-based memcpy() in arch/x86/lib/memcpy_64.S) # Copying 1MB bytes ...
42.459239 GB/sec
$
This silences this perf tools build warning:
Warning: Kernel ABI header at 'tools/arch/x86/lib/memcpy_64.S' differs from latest version at 'arch/x86/lib/memcpy_64.S'
--- tools/arch/x86/include/asm/mcsafe_test.h | 13 ++++ tools/arch/x86/lib/memcpy_64.S | 112 +++++++++++++++---------------- tools/perf/bench/Build | 1 + tools/perf/bench/mem-memcpy-x86-64-asm.S | 1 + tools/perf/bench/mem-memcpy-x86-64-lib.c | 24 +++++++ 5 files changed, 93 insertions(+), 58 deletions(-)
tools/arch/x86/include/asm/mcsafe_test.h new file +13 -0
@@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _MCSAFE_TEST_H_ +#define _MCSAFE_TEST_H_ + +.macro MCSAFE_TEST_CTL +.endm + +.macro MCSAFE_TEST_SRC reg count target +.endm + +.macro MCSAFE_TEST_DST reg count target +.endm +#endif /* _MCSAFE_TEST_H_ */
tools/arch/x86/lib/memcpy_64.S +54 -58
168 lines not on this page · raw message
tools/perf/bench/Build +1 -0
@@ -7,6 +7,7 @@ perf-y += futex-wake-parallel.o perf-y += futex-requeue.o perf-y += futex-lock-pi.o +perf-$(CONFIG_X86_64) += mem-memcpy-x86-64-lib.o perf-$(CONFIG_X86_64) += mem-memcpy-x86-64-asm.o perf-$(CONFIG_X86_64) += mem-memset-x86-64-asm.o
tools/perf/bench/mem-memcpy-x86-64-asm.S +1 -0
@@ -6,6 +6,7 @@ #define altinstr_replacement text #define globl p2align 4; .globl #define _ASM_EXTABLE_FAULT(x, y) +#define _ASM_EXTABLE(x, y) #include "../../arch/x86/lib/memcpy_64.S" /*
tools/perf/bench/mem-memcpy-x86-64-lib.c new file +24 -0
@@ -0,0 +1,24 @@ +/* +* From code in arch/x86/lib/usercopy_64.c, copied to keep tools/ copy +* of the kernel's arch/x86/lib/memcpy_64.s used in 'perf bench mem memcpy' +* happy. +*/ +#include <linux/types.h> + +unsigned long __memcpy_mcsafe (void *dst,const void *src,size_t cnt); +unsigned long mcsafe_handle_tail (char *to,char *from,unsigned len); + +unsigned long mcsafe_handle_tail (char *to,char *from,unsigned len) +{ +for (; len; --len, to++, from++) { +/* +* Call the assembly routine back directly since +* memcpy_mcsafe() may silently fallback to memcpy. +*/ +unsigned long rem =__memcpy_mcsafe (to, from,1 ); + +if (rem) +break ; + } +return len; +}