All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Laight <David.Laight@ACULAB.COM>
To: 'Jiri Slaby' <jirislaby@gmail.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	'Andy Shevchenko' <andriy.shevchenko@linux.intel.com>,
	'Andrew Morton' <akpm@linux-foundation.org>,
	"'Matthew Wilcox (Oracle)'" <willy@infradead.org>,
	'Christoph Hellwig' <hch@infradead.org>,
	"'Jason A. Donenfeld'" <Jason@zx2c4.com>
Subject: RE: [PATCH next v4 0/5] minmax: Relax type checks in min() and max().
Date: Mon, 8 Jan 2024 13:34:36 +0000	[thread overview]
Message-ID: <147531551ec54a558c91bbef47f035c8@AcuMS.aculab.com> (raw)
In-Reply-To: <18c6df0d-45ed-450c-9eda-95160a2bbb8e@gmail.com>

From: Jiri Slaby <jirislaby@gmail.com>
> Sent: 08 January 2024 11:46
> 
> Hi,
> 
> On 18. 09. 23, 10:14, David Laight wrote:
> > The min() (etc) functions in minmax.h require that the arguments have
> > exactly the same types.
> >
> > However when the type check fails, rather than look at the types and
> > fix the type of a variable/constant, everyone seems to jump on min_t().
> > In reality min_t() ought to be rare - when something unusual is being
> > done, not normality.
> ...
> > David Laight (5):
> >    minmax: Add umin(a, b) and umax(a, b)
> >    minmax: Allow min()/max()/clamp() if the arguments have the same
> >      signedness.
> >    minmax: Fix indentation of __cmp_once() and __clamp_once()
> >    minmax: Allow comparisons of 'int' against 'unsigned char/short'.
> >    minmax: Relax check to allow comparison between unsigned arguments and
> >      signed constants.
> 
> This slows down the build and increases the build memory consumption so
> that it causes OOMs.
> 
> In particular 6.7:
> $ time make drivers/media/pci/solo6x10/solo6x10-p2m.i
> ...
>    CPP [M] drivers/media/pci/solo6x10/solo6x10-p2m.i
> real    0m45,002s
> user    0m40,840s
> sys     0m5,922s
> 
> 
> $ git revert 867046cc7027703f60a46339ffde91a1970f2901
> $ time make drivers/media/pci/solo6x10/solo6x10-p2m.i
> ...
>    CPP [M] drivers/media/pci/solo6x10/solo6x10-p2m.i
> real    0m11,132s
> user    0m9,737s
> sys     0m1,415s
> 
> 
> $ git revert 4ead534fba42fc4fd41163297528d2aa731cd121
> $ time make drivers/media/pci/solo6x10/solo6x10-p2m.i
> ...
>    CPP [M] drivers/media/pci/solo6x10/solo6x10-p2m.i
> real    0m3,711s
> user    0m3,041s
> sys     0m0,710s
> 
> 
> 
> Note it's only a preprocessor run. If you run a compiler on top of that,
> it even dies.
> 
> There is nothing special in that file, just:
> if (SOLO_SDRAM_END(solo_dev) > solo_dev->sdram_size) {
> 
> which at some point expands to
>          max(__SOLO_JPEG_MIN_SIZE(__solo),                               \
>              min((__solo->sdram_size - SOLO_JPEG_EXT_ADDR(__solo)),
> 0x00ff0000))
> 
> and that expands to a lot of stuff.
> 
> Note that _line_ is 519 kbytes on 6.6 already. And 6 MB on 6.7.

Even with trivial min() max() it is 7.5k (piped through xargs -s72):
(see https://godbolt.org/z/rzE39YodW)

The 'explosion' happens because there are nested max(a, min(b, c)).
I think: max(a, min(max(b, min(c, d)), e))

I actually can't help feeling that is the driver ever uses
any of these values they ought to be saved during initialisation.
That would likely save a lot of code later - as well as shrinking
this test to something sane.

return ((((((((0x00000000 + 0x00480000) + ((solo->type == 1 ?
0x10000 : 0x20000) * 32)) + 0x00080000) + 0x00010000) +
((((solo->sdram_size <= (32 << 20)) ? 4 : 16) + 1) * (18 << 16)))
+ (0x00140000 * solo->nr_chans * 2)) + (((solo->nr_chans *
0x00080000)) > (((((solo->sdram_size - ((((((0x00000000 +
0x00480000) + ((solo->type == 1 ? 0x10000 : 0x20000) * 32)) +
0x00080000) + 0x00010000) + ((((solo->sdram_size <= (32 << 20)) ?
4 : 16) + 1) * (18 << 16))) + (0x00140000 * solo->nr_chans * 2)))
- (solo->nr_chans * 0x00080000))) < (0x00ff0000) ?
(((solo->sdram_size - ((((((0x00000000 + 0x00480000) +
((solo->type == 1 ? 0x10000 : 0x20000) * 32)) + 0x00080000) +
0x00010000) + ((((solo->sdram_size <= (32 << 20)) ? 4 : 16) + 1) *
(18 << 16))) + (0x00140000 * solo->nr_chans * 2))) -
(solo->nr_chans * 0x00080000))) : (0x00ff0000))) ?
((solo->nr_chans * 0x00080000)) : (((((solo->sdram_size -
((((((0x00000000 + 0x00480000) + ((solo->type == 1 ? 0x10000 :
0x20000) * 32)) + 0x00080000) + 0x00010000) + ((((solo->sdram_size
<= (32 << 20)) ? 4 : 16) + 1) * (18 << 16))) + (0x00140000 *
solo->nr_chans * 2))) - (solo->nr_chans * 0x00080000))) <
(0x00ff0000) ? (((solo->sdram_size - ((((((0x00000000 +
0x00480000) + ((solo->type == 1 ? 0x10000 : 0x20000) * 32)) +
0x00080000) + 0x00010000) + ((((solo->sdram_size <= (32 << 20)) ?
4 : 16) + 1) * (18 << 16))) + (0x00140000 * solo->nr_chans * 2)))
- (solo->nr_chans * 0x00080000))) : (0x00ff0000))))) +
(((solo->nr_chans * 0x00080000)) > ((((solo->sdram_size -
(((((((0x00000000 + 0x00480000) + ((solo->type == 1 ? 0x10000 :
0x20000) * 32)) + 0x00080000) + 0x00010000) + ((((solo->sdram_size
<= (32 << 20)) ? 4 : 16) + 1) * (18 << 16))) + (0x00140000 *
solo->nr_chans * 2)) + (((solo->nr_chans * 0x00080000)) >
(((((solo->sdram_size - ((((((0x00000000 + 0x00480000) +
((solo->type == 1 ? 0x10000 : 0x20000) * 32)) + 0x00080000) +
0x00010000) + ((((solo->sdram_size <= (32 << 20)) ? 4 : 16) + 1) *
(18 << 16))) + (0x00140000 * solo->nr_chans * 2))) -
(solo->nr_chans * 0x00080000))) < (0x00ff0000) ?
(((solo->sdram_size - ((((((0x00000000 + 0x00480000) +
((solo->type == 1 ? 0x10000 : 0x20000) * 32)) + 0x00080000) +
0x00010000) + ((((solo->sdram_size <= (32 << 20)) ? 4 : 16) + 1) *
(18 << 16))) + (0x00140000 * solo->nr_chans * 2))) -
(solo->nr_chans * 0x00080000))) : (0x00ff0000))) ?
((solo->nr_chans * 0x00080000)) : (((((solo->sdram_size -
((((((0x00000000 + 0x00480000) + ((solo->type == 1 ? 0x10000 :
0x20000) * 32)) + 0x00080000) + 0x00010000) + ((((solo->sdram_size
<= (32 << 20)) ? 4 : 16) + 1) * (18 << 16))) + (0x00140000 *
solo->nr_chans * 2))) - (solo->nr_chans * 0x00080000))) <
(0x00ff0000) ? (((solo->sdram_size - ((((((0x00000000 +
0x00480000) + ((solo->type == 1 ? 0x10000 : 0x20000) * 32)) +
0x00080000) + 0x00010000) + ((((solo->sdram_size <= (32 << 20)) ?
4 : 16) + 1) * (18 << 16))) + (0x00140000 * solo->nr_chans * 2)))
- (solo->nr_chans * 0x00080000))) : (0x00ff0000))))))) <
(0x00ff0000) ? ((solo->sdram_size - (((((((0x00000000 +
0x00480000) + ((solo->type == 1 ? 0x10000 : 0x20000) * 32)) +
0x00080000) + 0x00010000) + ((((solo->sdram_size <= (32 << 20)) ?
4 : 16) + 1) * (18 << 16))) + (0x00140000 * solo->nr_chans * 2)) +
(((solo->nr_chans * 0x00080000)) > (((((solo->sdram_size -
((((((0x00000000 + 0x00480000) + ((solo->type == 1 ? 0x10000 :
0x20000) * 32)) + 0x00080000) + 0x00010000) + ((((solo->sdram_size
<= (32 << 20)) ? 4 : 16) + 1) * (18 << 16))) + (0x00140000 *
solo->nr_chans * 2))) - (solo->nr_chans * 0x00080000))) <
(0x00ff0000) ? (((solo->sdram_size - ((((((0x00000000 +
0x00480000) + ((solo->type == 1 ? 0x10000 : 0x20000) * 32)) +
0x00080000) + 0x00010000) + ((((solo->sdram_size <= (32 << 20)) ?
4 : 16) + 1) * (18 << 16))) + (0x00140000 * solo->nr_chans * 2)))
- (solo->nr_chans * 0x00080000))) : (0x00ff0000))) ?
((solo->nr_chans * 0x00080000)) : (((((solo->sdram_size -
((((((0x00000000 + 0x00480000) + ((solo->type == 1 ? 0x10000 :
0x20000) * 32)) + 0x00080000) + 0x00010000) + ((((solo->sdram_size
<= (32 << 20)) ? 4 : 16) + 1) * (18 << 16))) + (0x00140000 *
solo->nr_chans * 2))) - (solo->nr_chans * 0x00080000))) <
(0x00ff0000) ? (((solo->sdram_size - ((((((0x00000000 +
0x00480000) + ((solo->type == 1 ? 0x10000 : 0x20000) * 32)) +
0x00080000) + 0x00010000) + ((((solo->sdram_size <= (32 << 20)) ?
4 : 16) + 1) * (18 << 16))) + (0x00140000 * solo->nr_chans * 2)))
- (solo->nr_chans * 0x00080000))) : (0x00ff0000))))))) :
(0x00ff0000))) ? ((solo->nr_chans * 0x00080000)) :
((((solo->sdram_size - (((((((0x00000000 + 0x00480000) +
((solo->type == 1 ? 0x10000 : 0x20000) * 32)) + 0x00080000) +
0x00010000) + ((((solo->sdram_size <= (32 << 20)) ? 4 : 16) + 1) *
(18 << 16))) + (0x00140000 * solo->nr_chans * 2)) +
(((solo->nr_chans * 0x00080000)) > (((((solo->sdram_size -
((((((0x00000000 + 0x00480000) + ((solo->type == 1 ? 0x10000 :
0x20000) * 32)) + 0x00080000) + 0x00010000) + ((((solo->sdram_size
<= (32 << 20)) ? 4 : 16) + 1) * (18 << 16))) + (0x00140000 *
solo->nr_chans * 2))) - (solo->nr_chans * 0x00080000))) <
(0x00ff0000) ? (((solo->sdram_size - ((((((0x00000000 +
0x00480000) + ((solo->type == 1 ? 0x10000 : 0x20000) * 32)) +
0x00080000) + 0x00010000) + ((((solo->sdram_size <= (32 << 20)) ?
4 : 16) + 1) * (18 << 16))) + (0x00140000 * solo->nr_chans * 2)))
- (solo->nr_chans * 0x00080000))) : (0x00ff0000))) ?
((solo->nr_chans * 0x00080000)) : (((((solo->sdram_size -
((((((0x00000000 + 0x00480000) + ((solo->type == 1 ? 0x10000 :
0x20000) * 32)) + 0x00080000) + 0x00010000) + ((((solo->sdram_size
<= (32 << 20)) ? 4 : 16) + 1) * (18 << 16))) + (0x00140000 *
solo->nr_chans * 2))) - (solo->nr_chans * 0x00080000))) <
(0x00ff0000) ? (((solo->sdram_size - ((((((0x00000000 +
0x00480000) + ((solo->type == 1 ? 0x10000 : 0x20000) * 32)) +
0x00080000) + 0x00010000) + ((((solo->sdram_size <= (32 << 20)) ?
4 : 16) + 1) * (18 << 16))) + (0x00140000 * solo->nr_chans * 2)))
- (solo->nr_chans * 0x00080000))) : (0x00ff0000))))))) <
(0x00ff0000) ? ((solo->sdram_size - (((((((0x00000000 +
0x00480000) + ((solo->type == 1 ? 0x10000 : 0x20000) * 32)) +
0x00080000) + 0x00010000) + ((((solo->sdram_size <= (32 << 20)) ?
4 : 16) + 1) * (18 << 16))) + (0x00140000 * solo->nr_chans * 2)) +
(((solo->nr_chans * 0x00080000)) > (((((solo->sdram_size -
((((((0x00000000 + 0x00480000) + ((solo->type == 1 ? 0x10000 :
0x20000) * 32)) + 0x00080000) + 0x00010000) + ((((solo->sdram_size
<= (32 << 20)) ? 4 : 16) + 1) * (18 << 16))) + (0x00140000 *
solo->nr_chans * 2))) - (solo->nr_chans * 0x00080000))) <
(0x00ff0000) ? (((solo->sdram_size - ((((((0x00000000 +
0x00480000) + ((solo->type == 1 ? 0x10000 : 0x20000) * 32)) +
0x00080000) + 0x00010000) + ((((solo->sdram_size <= (32 << 20)) ?
4 : 16) + 1) * (18 << 16))) + (0x00140000 * solo->nr_chans * 2)))
- (solo->nr_chans * 0x00080000))) : (0x00ff0000))) ?
((solo->nr_chans * 0x00080000)) : (((((solo->sdram_size -
((((((0x00000000 + 0x00480000) + ((solo->type == 1 ? 0x10000 :
0x20000) * 32)) + 0x00080000) + 0x00010000) + ((((solo->sdram_size
<= (32 << 20)) ? 4 : 16) + 1) * (18 << 16))) + (0x00140000 *
solo->nr_chans * 2))) - (solo->nr_chans * 0x00080000))) <
(0x00ff0000) ? (((solo->sdram_size - ((((((0x00000000 +
0x00480000) + ((solo->type == 1 ? 0x10000 : 0x20000) * 32)) +
0x00080000) + 0x00010000) + ((((solo->sdram_size <= (32 << 20)) ?
4 : 16) + 1) * (18 << 16))) + (0x00140000 * solo->nr_chans * 2)))
- (solo->nr_chans * 0x00080000))) : (0x00ff0000))))))) :
(0x00ff0000))))); }

	David

> 
> The file is 4.3M vs. 122M.
> 
> Could you investigate/fix/revert (at least) the above two commits?
> 
> thanks,
> --
> js

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)

  reply	other threads:[~2024-01-08 13:35 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-18  8:14 [PATCH next v4 0/5] minmax: Relax type checks in min() and max() David Laight
2023-09-18  8:16 ` [PATCH next v4 1/5] minmax: Add umin(a, b) and umax(a, b) David Laight
2024-01-12 12:49   ` Dan Carpenter
2024-01-12 13:40     ` David Laight
2024-01-12 14:03       ` Dan Carpenter
2024-01-12 14:26         ` David Laight
2024-01-18 10:30           ` Dan Carpenter
2023-09-18  8:17 ` [PATCH next v4 2/5] minmax: Allow min()/max()/clamp() if the arguments have the same signedness David Laight
2023-09-18  8:17 ` [PATCH next v4 3/5] minmax: Fix indentation of __cmp_once() and __clamp_once() David Laight
2023-09-18  8:18 ` [PATCH next v4 4/5] minmax: Allow comparisons of 'int' against 'unsigned char/short' David Laight
2023-09-18  8:19 ` [PATCH next v4 5/5] minmax: Relax check to allow comparison between unsigned arguments and signed constants David Laight
2023-09-27 17:30 ` [PATCH next v4 0/5] minmax: Relax type checks in min() and max() Andrew Morton
2023-09-28  8:10   ` David Laight
2024-01-08 11:46 ` Jiri Slaby
2024-01-08 13:34   ` David Laight [this message]
2024-01-08 18:19   ` Linus Torvalds
2024-01-08 20:04     ` Linus Torvalds
2024-01-08 21:11       ` Linus Torvalds
2024-01-09  0:39         ` [PATCH next v4 0/5] minmax: Relax type checks in min() and max().^[[C John Stoffel
2024-01-09  6:54         ` [PATCH next v4 0/5] minmax: Relax type checks in min() and max() Jiri Slaby
2024-01-10  6:17         ` Stephen Rothwell
2024-01-10  9:03           ` David Laight
2024-01-10 19:35           ` Linus Torvalds
2024-01-10 22:58             ` David Laight
2024-01-20 21:33               ` Linus Torvalds
2024-01-21 22:18                 ` David Laight
2024-01-09  9:35     ` David Laight
2024-01-09  9:41     ` David Laight
2024-01-09 12:09     ` Kalle Valo
2024-01-19  7:14     ` Jiri Slaby
2024-01-19  8:23       ` Hans Verkuil
2024-01-19  9:14       ` David Laight
2024-01-12  9:13 ` Dan Carpenter
2024-01-12 12:16   ` David Laight
2024-01-12 12:40     ` Dan Carpenter

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=147531551ec54a558c91bbef47f035c8@AcuMS.aculab.com \
    --to=david.laight@aculab.com \
    --cc=Jason@zx2c4.com \
    --cc=akpm@linux-foundation.org \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=hch@infradead.org \
    --cc=jirislaby@gmail.com \
    --cc=linux-kernel@vger.kernel.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 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.