From: "Li Zhe" <lizhe.67@bytedance.com>
To: <bp@alien8.de>
Cc: <akpm@linux-foundation.org>, <apopple@nvidia.com>,
<arnd@arndb.de>, <dave.hansen@linux.intel.com>,
<david@kernel.org>, <kees@kernel.org>,
<linux-arch@vger.kernel.org>, <linux-hardening@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-mm@kvack.org>,
<lizhe.67@bytedance.com>, <mingo@redhat.com>, <rppt@kernel.org>,
<tglx@kernel.org>, <x86@kernel.org>
Subject: Re: [PATCH v5 7/8] x86/string: extend memcpy_flushcache() fixed-size fastpaths
Date: Tue, 7 Jul 2026 19:34:09 +0800 [thread overview]
Message-ID: <20260707113409.71996-1-lizhe.67@bytedance.com> (raw)
In-Reply-To: <20260706171902.GCakvjhl5U89iJdaNP@fat_crate.local>
On Mon, 6 Jul 2026 10:19:02 -0700, bp@alien8.de wrote:
> On Mon, Jul 06, 2026 at 03:43:46PM +0800, Li Zhe wrote:
> > The extra IS_ALIGNED() check is meant as a conservative performance
> > choice, not because MOVNTI itself would be invalid on a misaligned
> > destination.
>
> Dude, you can't just wait for me to pull every unobvious decision in the code
> out of you - you need to write it down in your commit messages! I'm not a mind
> reader, you know.
>
> > As the Intel optimization reference manual notes, higher-throughput
> > data movement usually comes with alignment considerations, and can
> > be more efficient when the destination is naturally aligned.
>
> This can't get any more vague.
>
> > So for these larger fixed-size cases, I kept the inline path limited
> > to the aligned case. For misaligned destinations, falling back to
> > __memcpy_flushcache() is expected to be the better choice, since it
> > already handles the unaligned head first and only then enters its
> > MOVNTI loops.
> >
> > I will make that rationale explicit in the code comment and commit
> > message in v6.
>
> No, you need to show whether the alignment brigns anything and then add it or
> remove it. We don't do things based on hearsay in the kernel - only on hard
> performance numbers.
Thanks. I measured the exact tradeoff on the physical x86_64 host with
an out-of-tree microbenchmark.
The question for this patch is whether misaligned 32/48/64/80/96-byte
copies should still stay in the fixed-size switch, or whether an extra
alignment check should redirect them to the generic
__memcpy_flushcache() path.
To isolate that choice, I benchmarked two memcpy_flushcache()-style
helpers which shared the same generic body. The only difference was
whether those fixed-size cases always stayed in the fixed-size MOVNTI
switch, or whether misaligned destinations were redirected to the
generic path:
variant A:
switch (len) {
case 32 ... 96:
do fixed-size MOVNTI stores;
return;
default:
generic __memcpy_flushcache()-style body;
}
variant B:
switch (len) {
case 32 ... 96:
if (!IS_ALIGNED(dst, 8))
goto generic_path;
do fixed-size MOVNTI stores;
return;
default:
generic_path:
generic __memcpy_flushcache()-style body;
}
On the same CPU, with the same source buffer, destination layout,
stride, and iteration count, I measured the median time per memcpy.
The wmb() was used only to separate rounds and was not included in the
timed interval.
For offset 0, the two variants were essentially the same. For
misaligned destinations (offsets 1..7 averaged), keeping those sizes in
the fixed-size switch took about:
32-byte memcpy: 0.410 us
48-byte memcpy: 0.411 us
64-byte memcpy: 0.426 us
80-byte memcpy: 0.426 us
96-byte memcpy: 0.428 us
Redirecting the same misaligned cases to the generic
__memcpy_flushcache() path took about:
32-byte memcpy: 0.962 us
48-byte memcpy: 0.956 us
64-byte memcpy: 0.923 us
80-byte memcpy: 0.998 us
96-byte memcpy: 1.001 us
So based on these measurements, the extra alignment check is not buying
us anything here. It consistently makes the misaligned 32/48/64/80/96
cases slower by redirecting them to the generic path.
I will drop the separate alignment check and fold 32/48/64/80/96 into
the main fixed-size switch in the next version.
Thanks,
Zhe
next prev parent reply other threads:[~2026-07-07 11:34 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-01 9:05 [PATCH v5 0/8] mm: optimize zone-device memmap initialization Li Zhe
2026-07-01 9:05 ` [PATCH v5 1/8] mm: fix stale ZONE_DEVICE refcount comment Li Zhe
2026-07-06 9:11 ` David Hildenbrand (Arm)
2026-07-07 2:28 ` Alistair Popple
2026-07-01 9:05 ` [PATCH v5 2/8] mm: factor zone-device page init helpers out of __init_zone_device_page Li Zhe
2026-07-06 9:13 ` David Hildenbrand (Arm)
2026-07-06 11:50 ` Li Zhe
2026-07-06 13:47 ` David Hildenbrand (Arm)
2026-07-07 3:25 ` Li Zhe
2026-07-01 9:05 ` [PATCH v5 3/8] mm: add a set_page_section_from_pfn() helper Li Zhe
2026-07-06 9:15 ` David Hildenbrand (Arm)
2026-07-06 11:52 ` Li Zhe
2026-07-06 13:48 ` David Hildenbrand (Arm)
2026-07-07 3:26 ` Li Zhe
2026-07-01 9:05 ` [PATCH v5 4/8] mm: add a template-based fast path for zone-device page init Li Zhe
2026-07-03 14:06 ` Mike Rapoport
2026-07-06 7:45 ` Li Zhe
2026-07-07 3:06 ` Alistair Popple
2026-07-07 6:36 ` Li Zhe
2026-07-07 3:02 ` Alistair Popple
2026-07-07 6:33 ` Li Zhe
2026-07-01 9:05 ` [PATCH v5 5/8] mm: extend the template fast path to zone-device compound tails Li Zhe
2026-07-07 3:09 ` Alistair Popple
2026-07-07 6:38 ` Li Zhe
2026-07-01 9:05 ` [PATCH v5 6/8] string: introduce memcpy_nt() helpers Li Zhe
2026-07-02 2:16 ` Borislav Petkov
2026-07-02 7:36 ` Li Zhe
2026-07-06 9:18 ` David Hildenbrand (Arm)
2026-07-06 11:53 ` Li Zhe
2026-07-06 13:49 ` David Hildenbrand (Arm)
2026-07-07 3:28 ` Li Zhe
2026-07-01 9:05 ` [PATCH v5 7/8] x86/string: extend memcpy_flushcache() fixed-size fastpaths Li Zhe
2026-07-02 2:23 ` Borislav Petkov
2026-07-02 7:37 ` Li Zhe
2026-07-03 19:56 ` Borislav Petkov
2026-07-06 7:43 ` Li Zhe
2026-07-06 17:19 ` Borislav Petkov
2026-07-07 11:34 ` Li Zhe [this message]
2026-07-01 9:05 ` [PATCH v5 8/8] mm: use memcpy_nt() in zone-device template copies Li Zhe
2026-07-01 23:28 ` [PATCH v5 0/8] mm: optimize zone-device memmap initialization Andrew Morton
2026-07-02 2:24 ` Borislav Petkov
2026-07-02 7:39 ` Li Zhe
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=20260707113409.71996-1-lizhe.67@bytedance.com \
--to=lizhe.67@bytedance.com \
--cc=akpm@linux-foundation.org \
--cc=apopple@nvidia.com \
--cc=arnd@arndb.de \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=david@kernel.org \
--cc=kees@kernel.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mingo@redhat.com \
--cc=rppt@kernel.org \
--cc=tglx@kernel.org \
--cc=x86@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox