[Linux-stm32] Patch "minmax: simplify min()/max()/clamp() implementation" has been added to the 6.6-stable tree
gregkh at linuxfoundation.org
gregkh at linuxfoundation.org
Mon Sep 22 12:27:00 UTC 2025
This is a note to let you know that I've just added the patch titled
minmax: simplify min()/max()/clamp() implementation
to the 6.6-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
minmax-simplify-min-max-clamp-implementation.patch
and it can be found in the queue-6.6 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree,
please let <stable at vger.kernel.org> know about it.
>From stable+bounces-180928-greg=kroah.com at vger.kernel.org Mon Sep 22 12:37:49 2025
From: Eliav Farber <farbere at amazon.com>
Date: Mon, 22 Sep 2025 10:32:31 +0000
Subject: minmax: simplify min()/max()/clamp() implementation
To: <richard at nod.at>, <anton.ivanov at cambridgegreys.com>, <johannes at sipsolutions.net>, <dave.hansen at linux.intel.com>, <luto at kernel.org>, <peterz at infradead.org>, <tglx at linutronix.de>, <mingo at redhat.com>, <bp at alien8.de>, <x86 at kernel.org>, <hpa at zytor.com>, <tony.luck at intel.com>, <qiuxu.zhuo at intel.com>, <james.morse at arm.com>, <mchehab at kernel.org>, <rric at kernel.org>, <harry.wentland at amd.com>, <sunpeng.li at amd.com>, <Rodrigo.Siqueira at amd.com>, <alexander.deucher at amd.com>, <christian.koenig at amd.com>, <Xinhui.Pan at amd.com>, <airlied at gmail.com>, <daniel at ffwll.ch>, <evan.quan at amd.com>, <maarten.lankhorst at linux.intel.com>, <mripard at kernel.org>, <tzimmermann at suse.de>, <jdelvare at suse.com>, <linux at roeck-us.net>, <linus.walleij at linaro.org>, <dmitry.torokhov at gmail.com>, <wens at csie.org>, <jernej.skrabec at gmail.com>, <samuel at sholland.org>, <agk at redhat.com>, <snitzer at kernel.org>, <dm-devel at lists.linux.dev>, <mailhol.vincent at wanadoo.fr>, <wg at grandegger.com>, <mkl at pengutronix.de>, <davem at davemloft.net>, <edu
mazet at google.com>, <kuba at kernel.org>, <pabeni at redhat.com>, <alexandre.torgue at foss.st.com>, <joabreu at synopsys.com>, <mcoquelin.stm32 at gmail.com>, <krzysztof.kozlowski at linaro.org>, <malattia at linux.it>, <hdegoede at redhat.com>, <ilpo.jarvinen at linux.intel.com>, <markgross at kernel.org>, <artur.paszkiewicz at intel.com>, <jejb at linux.ibm.com>, <martin.petersen at oracle.com>, <sakari.ailus at linux.intel.com>, <gregkh at linuxfoundation.org>, <clm at fb.com>, <josef at toxicpanda.com>, <dsterba at suse.com>, <luc.vanoostenryck at gmail.com>, <rostedt at goodmis.org>, <mhiramat at kernel.org>, <pmladek at suse.com>, <andriy.shevchenko at linux.intel.com>, <linux at rasmusvillemoes.dk>, <senozhatsky at chromium.org>, <minchan at kernel.org>, <akpm at linux-foundation.org>, <dsahern at kernel.org>, <shuah at kernel.org>, <keescook at chromium.org>, <wad at chromium.org>, <farbere at amazon.com>, <David.Laight at ACULAB.COM>, <arnd at kernel.org>, <linux-um at lists.infradead.org>, <linux-kernel at vger.kernel.org>, <linux-edac at vger.kernel.org>, <amd-gfx at lists.freedeskto
p.org>, <dri-devel at lists.freedesktop.org>, <linux-hwmon at vger.kernel.org>, <linux-input at vger.kernel.org>, <linux-arm-kernel at lists.infradead.org>, <linux-sunxi at lists.linux.dev>, <linux-media at vger.kernel.org>, <linux-can at vger.kernel.org>, <netdev at vger.kernel.org>, <linux-stm32 at st-md-mailman.stormreply.com>, <platform-driver-x86 at vger.kernel.org>, <linux-scsi at vger.kernel.org>, <linux-staging at lists.linux.dev>, <linux-btrfs at vger.kernel.org>, <linux-sparse at vger.kernel.org>, <linux-trace-kernel at vger.kernel.org>, <linux-mm at kvack.org>, <linux-kselftest at vger.kernel.org>, <bpf at vger.kernel.org>, <stable at vger.kernel.org>
Cc: Linus Torvalds <torvalds at linux-foundation.org>, David Laight <David.Laight at aculab.com>, Lorenzo Stoakes <lorenzo.stoakes at oracle.com>
Message-ID: <20250922103241.16213-6-farbere at amazon.com>
From: Linus Torvalds <torvalds at linux-foundation.org>
[ Upstream commit dc1c8034e31b14a2e5e212104ec508aec44ce1b9 ]
Now that we no longer have any C constant expression contexts (ie array
size declarations or static initializers) that use min() or max(), we
can simpify the implementation by not having to worry about the result
staying as a C constant expression.
So now we can unconditionally just use temporary variables of the right
type, and get rid of the excessive expansion that used to come from the
use of
__builtin_choose_expr(__is_constexpr(...), ..
to pick the specialized code for constant expressions.
Another expansion simplification is to pass the temporary variables (in
addition to the original expression) to our __types_ok() macro. That
may superficially look like it complicates the macro, but when we only
want the type of the expression, expanding the temporary variable names
is much simpler and smaller than expanding the potentially complicated
original expression.
As a result, on my machine, doing a
$ time make drivers/staging/media/atomisp/pci/isp/kernels/ynr/ynr_1.0/ia_css_ynr.host.i
goes from
real 0m16.621s
user 0m15.360s
sys 0m1.221s
to
real 0m2.532s
user 0m2.091s
sys 0m0.452s
because the token expansion goes down dramatically.
In particular, the longest line expansion (which was line 71 of that
'ia_css_ynr.host.c' file) shrinks from 23,338kB (yes, 23MB for one
single line) to "just" 1,444kB (now "only" 1.4MB).
And yes, that line is still the line from hell, because it's doing
multiple levels of "min()/max()" expansion thanks to some of them being
hidden inside the uDIGIT_FITTING() macro.
Lorenzo has a nice cleanup patch that makes that driver use inline
functions instead of macros for sDIGIT_FITTING() and uDIGIT_FITTING(),
which will fix that line once and for all, but the 16-fold reduction in
this case does show why we need to simplify these helpers.
Cc: David Laight <David.Laight at aculab.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes at oracle.com>
Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
Signed-off-by: Eliav Farber <farbere at amazon.com>
Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
---
include/linux/minmax.h | 43 ++++++++++++++++++++-----------------------
1 file changed, 20 insertions(+), 23 deletions(-)
--- a/include/linux/minmax.h
+++ b/include/linux/minmax.h
@@ -35,10 +35,10 @@
#define __is_noneg_int(x) \
(__builtin_choose_expr(__is_constexpr(x) && __is_signed(x), x, -1) >= 0)
-#define __types_ok(x, y) \
- (__is_signed(x) == __is_signed(y) || \
- __is_signed((x) + 0) == __is_signed((y) + 0) || \
- __is_noneg_int(x) || __is_noneg_int(y))
+#define __types_ok(x, y, ux, uy) \
+ (__is_signed(ux) == __is_signed(uy) || \
+ __is_signed((ux) + 0) == __is_signed((uy) + 0) || \
+ __is_noneg_int(x) || __is_noneg_int(y))
#define __cmp_op_min <
#define __cmp_op_max >
@@ -51,34 +51,31 @@
#define __cmp_once(op, type, x, y) \
__cmp_once_unique(op, type, x, y, __UNIQUE_ID(x_), __UNIQUE_ID(y_))
-#define __careful_cmp_once(op, x, y) ({ \
- static_assert(__types_ok(x, y), \
+#define __careful_cmp_once(op, x, y, ux, uy) ({ \
+ __auto_type ux = (x); __auto_type uy = (y); \
+ static_assert(__types_ok(x, y, ux, uy), \
#op "(" #x ", " #y ") signedness error, fix types or consider u" #op "() before " #op "_t()"); \
- __cmp_once(op, __auto_type, x, y); })
+ __cmp(op, ux, uy); })
-#define __careful_cmp(op, x, y) \
- __builtin_choose_expr(__is_constexpr((x) - (y)), \
- __cmp(op, x, y), __careful_cmp_once(op, x, y))
+#define __careful_cmp(op, x, y) \
+ __careful_cmp_once(op, x, y, __UNIQUE_ID(x_), __UNIQUE_ID(y_))
#define __clamp(val, lo, hi) \
((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
-#define __clamp_once(val, lo, hi, unique_val, unique_lo, unique_hi) ({ \
- typeof(val) unique_val = (val); \
- typeof(lo) unique_lo = (lo); \
- typeof(hi) unique_hi = (hi); \
+#define __clamp_once(val, lo, hi, uval, ulo, uhi) ({ \
+ __auto_type uval = (val); \
+ __auto_type ulo = (lo); \
+ __auto_type uhi = (hi); \
static_assert(__builtin_choose_expr(__is_constexpr((lo) > (hi)), \
(lo) <= (hi), true), \
"clamp() low limit " #lo " greater than high limit " #hi); \
- static_assert(__types_ok(val, lo), "clamp() 'lo' signedness error"); \
- static_assert(__types_ok(val, hi), "clamp() 'hi' signedness error"); \
- __clamp(unique_val, unique_lo, unique_hi); })
-
-#define __careful_clamp(val, lo, hi) ({ \
- __builtin_choose_expr(__is_constexpr((val) - (lo) + (hi)), \
- __clamp(val, lo, hi), \
- __clamp_once(val, lo, hi, __UNIQUE_ID(__val), \
- __UNIQUE_ID(__lo), __UNIQUE_ID(__hi))); })
+ static_assert(__types_ok(uval, lo, uval, ulo), "clamp() 'lo' signedness error"); \
+ static_assert(__types_ok(uval, hi, uval, uhi), "clamp() 'hi' signedness error"); \
+ __clamp(uval, ulo, uhi); })
+
+#define __careful_clamp(val, lo, hi) \
+ __clamp_once(val, lo, hi, __UNIQUE_ID(v_), __UNIQUE_ID(l_), __UNIQUE_ID(h_))
/**
* min - return minimum of two values of the same or compatible types
Patches currently in stable-queue which might be from farbere at amazon.com are
queue-6.6/minmax-don-t-use-max-in-situations-that-want-a-c-constant-expression.patch
queue-6.6/minmax-make-generic-min-and-max-macros-available-everywhere.patch
queue-6.6/minmax-fix-up-min3-and-max3-too.patch
queue-6.6/minmax-add-a-few-more-min_t-max_t-users.patch
queue-6.6/minmax-improve-macro-expansion-and-type-checking.patch
queue-6.6/minmax-avoid-overly-complicated-constant-expressions-in-vm-code.patch
queue-6.6/minmax-simplify-min-max-clamp-implementation.patch
queue-6.6/minmax-simplify-and-clarify-min_t-max_t-implementation.patch
More information about the Linux-stm32
mailing list