From: Kent Overstreet <kent.overstreet@gmail.com>
To: David Laight <David.Laight@ACULAB.COM>,
'Linus Torvalds' <torvalds@linux-foundation.org>,
Joe Perches <joe@perches.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Petr Mladek <pmladek@suse.com>,
Steven Rostedt <rostedt@goodmis.org>,
Sergey Senozhatsky <senozhatsky@chromium.org>,
Rasmus Villemoes <linux@rasmusvillemoes.dk>,
Matthew Wilcox <willy@infradead.org>,
Miguel Ojeda <ojeda@kernel.org>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
LKML <linux-kernel@vger.kernel.org>,
linux-mm <linux-mm@kvack.org>
Subject: Re: [RFC[ Alloc in vsprintf
Date: Mon, 27 Jun 2022 22:56:58 -0400 [thread overview]
Message-ID: <ff21e07a-a30f-7516-69fb-c6c559e3c1b4@gmail.com> (raw)
In-Reply-To: <a723f5dda62a4c448dd292a3b917fe6d@AcuMS.aculab.com>
On 6/27/22 04:25, David Laight wrote:
> From: Linus Torvalds
>> Sent: 26 June 2022 21:19
> ..
>> That does require teaching the sprint_symbol() functions that they
>> need to take a "length of buffer" and return how much they used, but
>> that would seem to be a sensible thing anyway, and what the code
>> should always have done?
>
> It needs to return the 'length it would have used'.
> While occasionally useful I'm pretty sure this is actually
> a side effect of the was that libc snprintf() was originally
> implemented (sprintf() had an on-stack FILE).
>
> In any case it might be simplest to pass all these functions
> the write pointer and buffer limit and have them return the
> new write pointer.
> It is likely to generate much better code that passing
> a structure by reference.
I've said it before, and now I'm going to say it again more forcefully:
This obsession with perfect machine code in every situation, regardless
of whether it's shown up in benchmarks or profiles, regardless of what
it does to the readability of the C code that we humans work with, has
to stop.
Has. To. Stop. Full stop.
We have to be thinking about the people who come after us and have to
read and maintain this stuff. Linux should still be in use 50, 100 years
from now, and if it's not it's because we _fucked up_, and in software
the way you fuck up is by writing code no one can understand - by
writing code that people become afraid to touch without breaking it.
This happens, routinely, and it's _painful_ when it does.
A big learning experience for me when I was a much younger engineer,
freshly starting at Google, was working next to a bunch of guys who were
all chasing and fixing bugs in ext4 - and they weren't exactly enjoying
it. bcache uncovered one or two of them too, and I got to debug that and
then had to argue that it wasn't a bug in bcache (we were calling
bio->bi_endio in process context, which uncovered a locking bug in
ext4). The codebase had become a mess that they were too scared to
refactor, in part because there were too many options that were
impossible to test - my big lesson from that is that the code you're
scared to refactor, that's the code that needs it the most.
And I could name some very senior kernel people who write code that's
too brittle in the name of chasing performance - in fact I will name
one, because I know he won't take it personally: the writeback
throttling code that Jens wrote was buggy for _ages_ and at least one of
my users was regularly tripping over it and I couldn't make out what the
hell that code was trying to do, and not for lack of trying.
Other code nightmares:
- The old O_DIRECT code, which was a huge performance sink but no one
could touch it without breaking something (I spent months on a beautiful
refactoring that cut it in half by LOC and improved performance
drastically, but I couldn't get it to completely pass xfstests. That
sucked).
- The old generic_file_buffered_read(), which was a 250 line monster
filled with gotos - all in the name of performance, mind you - that
people barely touched, and when people absolutely had to they'd do so in
the most minimal way possible that ended up just adding to the mess
(e.g. the IOCB_NOWAIT changes) - up until I finally cut it apart, then
curiously right after that a ton more patches landed. It's almost like
cleaning stuff up and prioritizing readability makes it easier for
people to work on.
- merge_bvec_fn was also quite the tale - also done in the name of
performance, noticing a theme here?
I like to write fast code too. Of course I do, I'm a kernel engineer, I
wouldn't be a real one if I didn't.
But that means writing code that is _optimizable_, which means writing
code that's easy to go back and modify and change when profiling
discovers something. Which means keeping things as simple as is
reasonably possible, and prioritizing good data types and abstractions
and structure.
When I'm first writing code and thinking about performance, here's what
I think about:
- algorithmic complexity
- good data structures (vectors instead of lists, where it matters -
it often doesn't)
- memory layout: keep pointer indirection at an absolute minimum
memory layout matters
- locking
And honestly, not much else. Because on modern machines, with the type
of code we feed our CPUs running in the kernel, memory layout and
locking are what matter and not much else. Not shaving every cycle.
I already demonstrated this with actual numbers in the printbuf
discussion, to Rasmus - yes, the compiler constantly reloading is a
shame and it shows up in the text size, and perhaps we'll want to
revisit the -fno-strict-aliasing thing someday (I'm fully in agreement
with Linus on why he hates strict aliasing, it was something the
compiler people sprung on everyone else without discussion or a clear
escape hatch or _tooling to deal with existing codebases_ but the
tooling has improved since thing, it might not be complete insanity anymore)
...but if you look at the actual microbenchmarks I showed Rasmus? It
turns out to not affect performance pretty much at all, it's in the
noise. Waiting on loads from memory is what matters to us, and not much
else.
next prev parent reply other threads:[~2022-06-28 2:57 UTC|newest]
Thread overview: 85+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-20 0:41 [PATCH v4 00/34] Printbufs - new data structure for building strings Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 01/34] lib/printbuf: New data structure for printing strings Kent Overstreet
2022-06-20 4:44 ` David Laight
2022-06-20 15:30 ` Kent Overstreet
2022-06-20 15:53 ` David Laight
2022-06-20 16:14 ` Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 02/34] lib/string_helpers: Convert string_escape_mem() to printbuf Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 03/34] vsprintf: Convert " Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 04/34] lib/hexdump: " Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 05/34] vsprintf: %pf(%p) Kent Overstreet
2022-06-21 7:04 ` Rasmus Villemoes
2022-06-21 7:51 ` Kent Overstreet
2022-06-21 8:47 ` Rasmus Villemoes
2022-06-21 11:11 ` David Laight
2022-06-20 0:42 ` [PATCH v4 06/34] lib/string_helpers: string_get_size() now returns characters wrote Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 07/34] lib/printbuf: Heap allocation Kent Overstreet
2022-06-21 7:58 ` Rasmus Villemoes
2022-06-20 0:42 ` [PATCH v4 08/34] lib/printbuf: Tabstops, indenting Kent Overstreet
2022-06-21 8:14 ` Rasmus Villemoes
2022-06-20 0:42 ` [PATCH v4 09/34] lib/printbuf: Unit specifiers Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 10/34] lib/pretty-printers: prt_string_option(), prt_bitflags() Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 11/34] vsprintf: Improve number() Kent Overstreet
2022-06-21 8:33 ` Rasmus Villemoes
2022-06-20 0:42 ` [PATCH v4 12/34] vsprintf: prt_u64_minwidth(), prt_u64() Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 13/34] test_printf: Drop requirement that sprintf not write past nul Kent Overstreet
2022-06-21 7:19 ` Rasmus Villemoes
2022-06-21 7:52 ` Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 14/34] vsprintf: Start consolidating printf_spec handling Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 15/34] vsprintf: Refactor resource_string() Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 16/34] vsprintf: Refactor fourcc_string() Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 17/34] vsprintf: Refactor ip_addr_string() Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 18/34] vsprintf: Refactor mac_address_string() Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 19/34] vsprintf: time_and_date() no longer takes printf_spec Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 20/34] vsprintf: flags_string() " Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 21/34] vsprintf: Refactor device_node_string, fwnode_string Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 22/34] vsprintf: Refactor hex_string, bitmap_string_list, bitmap_string Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 23/34] Input/joystick/analog: Convert from seq_buf -> printbuf Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 24/34] mm/memcontrol.c: Convert to printbuf Kent Overstreet
2022-06-20 11:37 ` Michal Hocko
2022-06-20 15:13 ` Kent Overstreet
2022-06-20 15:52 ` Michal Hocko
2022-06-20 0:42 ` [PATCH v4 25/34] clk: tegra: bpmp: " Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 26/34] tools/testing/nvdimm: " Kent Overstreet
2022-06-24 19:32 ` Dan Williams
2022-06-24 23:42 ` Santosh Sivaraj
2022-07-01 6:32 ` Shivaprasad G Bhat
2022-06-20 0:42 ` [PATCH v4 27/34] powerpc: " Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 28/34] x86/resctrl: " Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 29/34] PCI/P2PDMA: " Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 30/34] tracing: trace_events_synth: " Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 31/34] d_path: prt_path() Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 32/34] ACPI/APEI: Add missing include Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 33/34] tracing: Convert to printbuf Kent Overstreet
2022-06-20 0:42 ` [PATCH v4 34/34] Delete seq_buf Kent Overstreet
2022-06-20 4:19 ` [PATCH v4 00/34] Printbufs - new data structure for building strings David Laight
2022-06-20 4:54 ` Matthew Wilcox
2022-06-20 8:00 ` David Laight
2022-06-20 15:07 ` Kent Overstreet
2022-06-20 15:21 ` David Laight
2022-06-21 0:38 ` Joe Perches
2022-06-21 0:57 ` Kent Overstreet
2022-06-21 1:26 ` Joe Perches
2022-06-21 2:10 ` Joe Perches
2022-06-26 19:53 ` [RFC[ Alloc in vsprintf Joe Perches
2022-06-26 20:06 ` Kent Overstreet
2022-06-26 20:13 ` Joe Perches
2022-06-26 20:19 ` Linus Torvalds
2022-06-26 20:39 ` Joe Perches
2022-06-26 20:51 ` Kent Overstreet
2022-06-26 21:02 ` Joe Perches
2022-06-26 21:10 ` Kent Overstreet
2022-06-26 20:54 ` Linus Torvalds
2022-06-27 8:25 ` David Laight
2022-06-28 2:56 ` Kent Overstreet [this message]
2022-06-21 2:31 ` [PATCH v4 00/34] Printbufs - new data structure for building strings Kent Overstreet
2022-06-21 3:11 ` Kent Overstreet
2022-06-21 6:11 ` Rasmus Villemoes
2022-06-21 8:01 ` Kent Overstreet
2022-07-19 23:15 ` Steven Rostedt
2022-07-19 23:43 ` Kent Overstreet
2022-07-20 0:05 ` Steven Rostedt
2022-07-20 0:17 ` Kent Overstreet
2022-07-20 1:11 ` Steven Rostedt
2022-07-20 1:31 ` Kent Overstreet
2022-07-20 1:37 ` Steven Rostedt
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=ff21e07a-a30f-7516-69fb-c6c559e3c1b4@gmail.com \
--to=kent.overstreet@gmail.com \
--cc=David.Laight@ACULAB.COM \
--cc=akpm@linux-foundation.org \
--cc=andriy.shevchenko@linux.intel.com \
--cc=joe@perches.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux@rasmusvillemoes.dk \
--cc=ojeda@kernel.org \
--cc=pmladek@suse.com \
--cc=rostedt@goodmis.org \
--cc=senozhatsky@chromium.org \
--cc=torvalds@linux-foundation.org \
--cc=willy@infradead.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