From: Andrew Morton <akpm@linux-foundation.org>
To: mm-commits@vger.kernel.org,lizhe.67@bytedance.com,akpm@linux-foundation.org
Subject: [to-be-updated] x86-string-extend-memcpy_flushcache-fixed-size-fastpaths.patch removed from -mm tree
Date: Thu, 02 Jul 2026 09:03:55 -0700 [thread overview]
Message-ID: <20260702160355.A498F1F00A3E@smtp.kernel.org> (raw)
The quilt patch titled
Subject: x86/string: extend memcpy_flushcache() fixed-size fastpaths
has been removed from the -mm tree. Its filename was
x86-string-extend-memcpy_flushcache-fixed-size-fastpaths.patch
This patch was dropped because an updated version will be issued
------------------------------------------------------
From: "Li Zhe" <lizhe.67@bytedance.com>
Subject: x86/string: extend memcpy_flushcache() fixed-size fastpaths
Date: Wed, 1 Jul 2026 17:05:52 +0800
The new x86 memcpy_nt() helper in this series maps to memcpy_flushcache(),
and the ZONE_DEVICE fast path uses that primitive for constant-sized
struct page template copies.
memcpy_flushcache() currently inlines only the 4, 8, and 16-byte cases.
Larger constant-sized copies fall back to __memcpy_flushcache() even when
the destination is naturally aligned. Extend the inline movnti coverage
to 32, 48, 64, 80, and 96 bytes so the struct page-sized copies used by
that path can stay on the inline non-temporal store path instead of
dropping into the out-of-line helper.
Factor the store sequences into 8/16/32/64-byte helpers, keep the existing
4/8/16-byte cases handled directly in memcpy_flushcache(), issue the
stores in ascending address order, and leave all other sizes on
__memcpy_flushcache().
Link: https://lore.kernel.org/20260701090553.62691-8-lizhe.67@bytedance.com
Signed-off-by: Li Zhe <lizhe.67@bytedance.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Balbir Singh <balbirs@nvidia.com>
Cc: "Borislav Petkov (AMD)" <bp@alien8.de>
Cc: David Hildenbrand <david@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Kees Cook <kees@kernel.org>
Cc: Mike Rapoport (Microsoft) <rppt@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
arch/x86/include/asm/string_64.h | 80 ++++++++++++++++++++++++++++-
1 file changed, 79 insertions(+), 1 deletion(-)
--- a/arch/x86/include/asm/string_64.h~x86-string-extend-memcpy_flushcache-fixed-size-fastpaths
+++ a/arch/x86/include/asm/string_64.h
@@ -4,6 +4,7 @@
#ifdef __KERNEL__
#include <linux/jump_label.h>
+#include <linux/align.h>
/* Written 2002 by Andi Kleen */
@@ -82,8 +83,81 @@ int strcmp(const char *cs, const char *c
#ifdef CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE
#define __HAVE_ARCH_MEMCPY_FLUSHCACHE 1
void __memcpy_flushcache(void *dst, const void *src, size_t cnt);
-static __always_inline void memcpy_flushcache(void *dst, const void *src, size_t cnt)
+
+static __always_inline void memcpy_flushcache_8(void *dst, const void *src)
+{
+ asm volatile("movntiq %1, %0"
+ : "=m"(*(u64 *)dst)
+ : "r"(*(const u64 *)src)
+ : "memory");
+}
+
+static __always_inline void memcpy_flushcache_16(void *dst,
+ const void *src)
+{
+ memcpy_flushcache_8(dst, src);
+ memcpy_flushcache_8(dst + 8, src + 8);
+}
+
+static __always_inline void memcpy_flushcache_32(void *dst,
+ const void *src)
{
+ memcpy_flushcache_16(dst, src);
+ memcpy_flushcache_16(dst + 16, src + 16);
+}
+
+static __always_inline void memcpy_flushcache_64(void *dst,
+ const void *src)
+{
+ memcpy_flushcache_32(dst, src);
+ memcpy_flushcache_32(dst + 32, src + 32);
+}
+
+/*
+ * Keep the additional aligned fixed-size cases on the inline movnti path.
+ * Leave the existing 4/8/16-byte cases handled directly in
+ * memcpy_flushcache() so their code generation stays unchanged.
+ */
+static __always_inline int memcpy_flushcache_large(void *dst,
+ const void *src,
+ size_t cnt)
+{
+ char *dptr = dst;
+ const char *sptr = src;
+
+ if (!IS_ALIGNED((unsigned long)dst, 8))
+ return 0;
+
+ switch (cnt) {
+ case 32:
+ memcpy_flushcache_32(dptr, sptr);
+ return 1;
+ case 48:
+ memcpy_flushcache_32(dptr, sptr);
+ memcpy_flushcache_16(dptr + 32, sptr + 32);
+ return 1;
+ case 64:
+ memcpy_flushcache_64(dptr, sptr);
+ return 1;
+ case 80:
+ memcpy_flushcache_64(dptr, sptr);
+ memcpy_flushcache_16(dptr + 64, sptr + 64);
+ return 1;
+ case 96:
+ memcpy_flushcache_64(dptr, sptr);
+ memcpy_flushcache_32(dptr + 64, sptr + 64);
+ return 1;
+ }
+
+ return 0;
+}
+
+static __always_inline void memcpy_flushcache(void *dst, const void *src,
+ size_t cnt)
+{
+ if (!cnt)
+ return;
+
if (__builtin_constant_p(cnt)) {
switch (cnt) {
case 4:
@@ -97,7 +171,11 @@ static __always_inline void memcpy_flush
asm ("movntiq %1, %0" : "=m"(*(u64 *)(dst + 8)) : "r"(*(u64 *)(src + 8)));
return;
}
+
+ if (memcpy_flushcache_large(dst, src, cnt))
+ return;
}
+
__memcpy_flushcache(dst, src, cnt);
}
_
Patches currently in -mm which might be from lizhe.67@bytedance.com are
mm-use-memcpy_nt-in-zone-device-template-copies.patch
reply other threads:[~2026-07-02 16:03 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260702160355.A498F1F00A3E@smtp.kernel.org \
--to=akpm@linux-foundation.org \
--cc=lizhe.67@bytedance.com \
--cc=mm-commits@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.