From: Nikolay Borisov <nborisov@suse.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Nick Desaulniers <ndesaulniers@google.com>,
linux-fsdevel <linux-fsdevel@vger.kernel.org>,
Dave Chinner <david@fromorbit.com>
Subject: Re: [PATCH] lib/string: Bring optimized memcmp from glibc
Date: Wed, 21 Jul 2021 21:17:27 +0300 [thread overview]
Message-ID: <b24b5a9d-69a0-43b9-2ceb-8e4ee3bf2f17@suse.com> (raw)
In-Reply-To: <CAHk-=whqJKKc9wUacLEkvTzXYfYOUDt=kHKX6Fa8Kb4kQftbbQ@mail.gmail.com>
On 21.07.21 г. 21:00, Linus Torvalds wrote:
> On Wed, Jul 21, 2021 at 6:59 AM Nikolay Borisov <nborisov@suse.com> wrote:
>>
>> This is glibc's memcmp version. The upside is that for architectures
>> which don't have an optimized version the kernel can provide some
>> solace in the form of a generic, word-sized optimized memcmp. I tested
>> this with a heavy IOCTL_FIDEDUPERANGE(2) workload and here are the
>> results I got:
>
> Hmm. I suspect the usual kernel use of memcmp() is _very_ skewed to
> very small memcmp calls, and I don't think I've ever seen that
> (horribly bad) byte-wise default memcmp in most profiles.
>
> I suspect that FIDEDUPERANGE thing is most likely a very special case.
>
> So I don't think you're wrong to look at this, but I think you've gone
> from our old "spend no effort at all" to "look at one special case".
>
> And I think the glibc implementation is horrible and doesn't know
> about machines where unaligned loads are cheap - which is all
> reasonable ones.
>
> That MERGE() macro is disgusting, and memcmp_not_common_alignment()
> should not exist on any sane architecture. It's literally doing extra
> work to make for slower accesses, when the hardware does it better
> natively.
>
> So honestly, I'd much rather see a much saner and simpler
> implementation that works well on the architectures that matter, and
> that don't want that "align things by hand".
>
> Aligning one of the sources by hand is fine and makes sense - so that
> _if_ the two strings end up being mutually aligned, all subsequent
> accesses are aligned.
I find it somewhat arbitrary that we choose to align the 2nd pointer and
not the first. Obviously it'll be easy to detect which one of the 2 is
unaligned and align it so that from thereon memcmp can continue doing
aligned accesses. However, this means a check like that would be done
for *every* (well, barring some threshold value) access to memcmp.
>
> But then trying to do shift-and-masking for the possibly remaining
> unaligned source is crazy and garbage. Don't do it.
>
> And you never saw that, because your special FIDEDUPERANGE testcase
> will never have anything but mutually aligned cases.
>
> Which just shows that going from "don't care at all' to "care about
> one special case" is not the way to go.
>
> So I'd much rather see a simple default function that works well for
> the sane architectures, than go with the default code from glibc - and
> bad for the common modern architectures.
So you are saying that the current memcmp could indeed use improvement
but you don't want it to be based on the glibc's code due to the ugly
misalignment handling?
>
> Then architectures could choose that one with some
So you are suggesting keeping the current byte comparison one aka
'naive' and having another, more optimized generic implementation that
should be selected by GENERIC_MEMCMP or have I misunderstood you ?
>
> select GENERIC_MEMCMP
>
> the same way we have
>
> select GENERIC_STRNCPY_FROM_USER
>
> for the (sane, for normal architectures) common optimized case for a
> special string instruction that matters a lot for the kernel.
>
> Linus
>
next prev parent reply other threads:[~2021-07-21 18:17 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-21 13:59 Nikolay Borisov
2021-07-21 14:32 ` Christoph Hellwig
2021-07-21 14:35 ` Nikolay Borisov
2021-07-21 14:42 ` Christoph Hellwig
2021-07-21 14:51 ` Matthew Wilcox
2021-07-21 15:17 ` Peter.Enderborg
2021-07-21 15:34 ` Matthew Wilcox
2021-07-21 15:39 ` Peter.Enderborg
2021-07-21 18:00 ` Linus Torvalds
2021-07-21 18:17 ` Nikolay Borisov [this message]
2021-07-21 18:45 ` Linus Torvalds
2021-07-21 18:55 ` Linus Torvalds
2021-07-21 19:26 ` Linus Torvalds
2021-07-22 11:28 ` Nikolay Borisov
2021-07-22 16:40 ` Linus Torvalds
2021-07-22 17:03 ` Nikolay Borisov
2021-08-26 9:03 ` Nikolay Borisov
2021-07-22 8:28 ` Nikolay Borisov
2021-07-23 14:02 ` David Laight
2021-07-21 20:10 ` David Sterba
2021-07-21 20:27 ` Linus Torvalds
2021-07-22 5:54 ` Nikolay Borisov
2021-07-28 20:12 ` Florian Weimer
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=b24b5a9d-69a0-43b9-2ceb-8e4ee3bf2f17@suse.com \
--to=nborisov@suse.com \
--cc=david@fromorbit.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ndesaulniers@google.com \
--cc=torvalds@linux-foundation.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
all inboxes | Powered by JetHome®