Re: [PATCH v5 6/8] string: introduce memcpy_nt() helpers

"David Hildenbrand (Arm)" <[email protected]>
Newsgroups org.kernel.vger.linux-arch,org.kernel.vger.linux-hardening,org.kernel.vger.linux-kernel,org.kvack.linux-mm
Message-ID <[email protected]>
On 7/1/26 11:05, Li Zhe wrote:
> Introduce memcpy_nt() and memcpy_nt_drain() for write-once copy sites
> that want a named non-temporal copy primitive plus an explicit ordering
> point. On x86, place the arch-visible wrapper in
> arch/x86/include/asm/string_64.h and map it to the existing
> memcpy_flushcache() backend plus sfence. Architectures that do not
> override the helper fall back to memcpy() and a no-op drain in
> include/linux/string.h.
> 
> The immediate user is the ZONE_DEVICE template-copy path. That path
> populates struct page descriptors in a write-once pattern, so most
> destination cachelines are not expected to be reused immediately after
> the copy. A regular cached memcpy() can therefore incur avoidable
> write-allocate traffic and pollute the cache with data that has little
> near-term reuse.
> 
> This interface lets callers request that non-temporal-copy semantics
> directly, while x86 simply reuses the existing memcpy_flushcache()
> backend instead of adding another generic memcpy-like wrapper with
> extra selection policy above it.
> 
> Signed-off-by: Li Zhe <[email protected]>
> ---
>  arch/x86/include/asm/string_64.h | 16 ++++++++++++++++
>  include/linux/string.h           | 18 ++++++++++++++++++
>  2 files changed, 34 insertions(+)
> 
> diff --git a/arch/x86/include/asm/string_64.h b/arch/x86/include/asm/string_64.h
> index 4635616863f5..6f36abedc56a 100644
> --- a/arch/x86/include/asm/string_64.h
> +++ b/arch/x86/include/asm/string_64.h
> @@ -100,6 +100,22 @@ static __always_inline void memcpy_flushcache(void *dst, const void *src, size_t
>  	}
>  	__memcpy_flushcache(dst, src, cnt);
>  }
> +
> +#define __HAVE_ARCH_MEMCPY_NT 1
> +/*
> + * Reuse the existing x86 flushcache backend as the nt copy primitive.
> + * Callers pair it with memcpy_nt_drain() when later stores must be
> + * ordered after the copy.
> + */
> +static __always_inline void memcpy_nt(void *dst, const void *src, size_t cnt)
> +{
> +	memcpy_flushcache(dst, src, cnt);
> +}

In particular if you end up with a single function (that jsut requires a write
memory barrier afterwards), please make this

#define memcpy_nt memcpy_nt

instead.

-- 
Cheers,

David
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.