Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755161AbcJZPwW (ORCPT ); Wed, 26 Oct 2016 11:52:22 -0400 Received: from g9t1613g.houston.hpe.com ([15.241.32.99]:48717 "EHLO g9t1613g.houston.hpe.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752194AbcJZPwS (ORCPT ); Wed, 26 Oct 2016 11:52:18 -0400 From: Brian Boylston To: linux-nvdimm@ml01.01.org Cc: linux-kernel@vger.kernel.org, toshi.kani@hpe.com, oliver.moreno@hpe.com, Brian Boylston , Ross Zwisler , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , x86@kernel.org, Al Viro , Dan Williams Subject: [PATCH v2 1/3] introduce memcpy_nocache() Date: Wed, 26 Oct 2016 10:50:19 -0500 Message-Id: <20161026155021.20892-2-brian.boylston@hpe.com> X-Mailer: git-send-email 2.8.3 In-Reply-To: <20161026155021.20892-1-brian.boylston@hpe.com> References: <20161026155021.20892-1-brian.boylston@hpe.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3257 Lines: 101 Introduce memcpy_nocache() as a memcpy() that avoids the processor cache if possible. Without arch-specific support, this defaults to just memcpy(). For now, include arch-specific support for x86. Cc: Ross Zwisler Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: Cc: Al Viro Cc: Dan Williams Signed-off-by: Brian Boylston Reviewed-by: Toshi Kani Reported-by: Oliver Moreno --- arch/x86/include/asm/string_32.h | 3 +++ arch/x86/include/asm/string_64.h | 3 +++ arch/x86/lib/misc.c | 12 ++++++++++++ include/linux/string.h | 15 +++++++++++++++ 4 files changed, 33 insertions(+) diff --git a/arch/x86/include/asm/string_32.h b/arch/x86/include/asm/string_32.h index 3d3e835..64f80c0 100644 --- a/arch/x86/include/asm/string_32.h +++ b/arch/x86/include/asm/string_32.h @@ -196,6 +196,9 @@ static inline void *__memcpy3d(void *to, const void *from, size_t len) #endif +#define __HAVE_ARCH_MEMCPY_NOCACHE +extern void *memcpy_nocache(void *dest, const void *src, size_t count); + #define __HAVE_ARCH_MEMMOVE void *memmove(void *dest, const void *src, size_t n); diff --git a/arch/x86/include/asm/string_64.h b/arch/x86/include/asm/string_64.h index 90dbbd9..a8fdd55 100644 --- a/arch/x86/include/asm/string_64.h +++ b/arch/x86/include/asm/string_64.h @@ -51,6 +51,9 @@ extern void *__memcpy(void *to, const void *from, size_t len); #define memcpy(dst, src, len) __inline_memcpy((dst), (src), (len)) #endif +#define __HAVE_ARCH_MEMCPY_NOCACHE +extern void *memcpy_nocache(void *dest, const void *src, size_t count); + #define __HAVE_ARCH_MEMSET void *memset(void *s, int c, size_t n); void *__memset(void *s, int c, size_t n); diff --git a/arch/x86/lib/misc.c b/arch/x86/lib/misc.c index 76b373a..c993ab3 100644 --- a/arch/x86/lib/misc.c +++ b/arch/x86/lib/misc.c @@ -1,3 +1,6 @@ +#include +#include + /* * Count the digits of @val including a possible sign. * @@ -19,3 +22,12 @@ int num_digits(int val) } return d; } + +#ifdef __HAVE_ARCH_MEMCPY_NOCACHE +void *memcpy_nocache(void *dest, const void *src, size_t count) +{ + __copy_from_user_inatomic_nocache(dest, src, count); + return dest; +} +EXPORT_SYMBOL(memcpy_nocache); +#endif diff --git a/include/linux/string.h b/include/linux/string.h index 26b6f6a..7f40c41 100644 --- a/include/linux/string.h +++ b/include/linux/string.h @@ -102,6 +102,21 @@ extern void * memset(void *,int,__kernel_size_t); #ifndef __HAVE_ARCH_MEMCPY extern void * memcpy(void *,const void *,__kernel_size_t); #endif + +#ifndef __HAVE_ARCH_MEMCPY_NOCACHE +/** + * memcpy_nocache - Copy one area of memory to another, avoiding the + * processor cache if possible + * @dest: Where to copy to + * @src: Where to copy from + * @count: The size of the area. + */ +static inline void *memcpy_nocache(void *dest, const void *src, size_t count) +{ + return memcpy(dest, src, count); +} +#endif + #ifndef __HAVE_ARCH_MEMMOVE extern void * memmove(void *,const void *,__kernel_size_t); #endif -- 2.8.3