From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id EE137CAC5AC for ; Mon, 22 Sep 2025 12:27:36 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 507308E0018; Mon, 22 Sep 2025 08:27:36 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4DDFE8E0010; Mon, 22 Sep 2025 08:27:36 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 41BA58E0018; Mon, 22 Sep 2025 08:27:36 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 302268E0010 for ; Mon, 22 Sep 2025 08:27:36 -0400 (EDT) Received: from smtpin29.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id EB4CAC0634 for ; Mon, 22 Sep 2025 12:27:35 +0000 (UTC) X-FDA: 83916812070.29.6719456 Received: from sea.source.kernel.org (sea.source.kernel.org [172.234.252.31]) by imf12.hostedemail.com (Postfix) with ESMTP id 2647840006 for ; Mon, 22 Sep 2025 12:27:32 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=fail ("body hash did not verify") header.d=linuxfoundation.org header.s=korg header.b=vR10fA4F; spf=pass (imf12.hostedemail.com: domain of gregkh@linuxfoundation.org designates 172.234.252.31 as permitted sender) smtp.mailfrom=gregkh@linuxfoundation.org; dmarc=pass (policy=none) header.from=linuxfoundation.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1758544053; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:dkim-signature; bh=nTzbFZiYAJTRK8qMuz4o4344RnUOIwxcO51vaqJud9I=; b=X/DvtIlYUw3ElnHXU8Af41g+INeDcxto/bLUEuQfQaoWZrxVhfCsgdIPxnFNRDqjqU1K1V yWdir18zVMGmKtBIgT92vvmyz3nidwCiLusSibCZbpzbVo4+ZboheHt8pCEEWdB3onhR6J xgkPWgr2N39T25z7dNUAZjUagMbYjsE= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1758544053; a=rsa-sha256; cv=none; b=YXpLqTlSopiBZGBJtbjiJDvSBc5nwJJbPYbIO1d165fK65Oq5sU3Ut0tEOvVf/CNSj48Yt KRma3dpFw1nz0S25T04bfilNUj100VkwWxEJd7wa9oGzG/xrG/pN/HMih+4AQQX8ghCw7z htapmXiaN4tN3JE7sMktz1acW8Nzv9o= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=fail ("body hash did not verify") header.d=linuxfoundation.org header.s=korg header.b=vR10fA4F; spf=pass (imf12.hostedemail.com: domain of gregkh@linuxfoundation.org designates 172.234.252.31 as permitted sender) smtp.mailfrom=gregkh@linuxfoundation.org; dmarc=pass (policy=none) header.from=linuxfoundation.org Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 24F4A419B7; Mon, 22 Sep 2025 12:27:32 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2D4CDC113D0; Mon, 22 Sep 2025 12:27:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1758544052; bh=rRfLqX/zR5w+ifwG90F2/vKyrmETA1lsBOrPDyyqAEM=; h=Subject:To:Cc:From:Date:In-Reply-To:From; b=vR10fA4FmZ4v7KaHCZIyLcLXELsAbPUAD5lYraSzHLR8SUfcT7fvuaVAfns1d40qo ntIYtwcGsPGn6qaY9unY9gkWp6CxSXcCwRRsXp2js5R/wunwsZ0apFhkBqd5cHpQeH 1Is19V8BQwQKhQvN6kPToNslukgQ2UAJ+ojqTKAY= Subject: Patch "minmax: simplify min()/max()/clamp() implementation" has been added to the 6.6-stable tree To: David.Laight@ACULAB.COM, David.Laight@aculab.com, Rodrigo.Siqueira@amd.com, Xinhui.Pan@amd.com, agk@redhat.com, airlied@gmail.com, akpm@linux-foundation.org, alexander.deucher@amd.com, alexandre.torgue@foss.st.com, amd-gfx@lists.freedesktop.org, andriy.shevchenko@linux.intel.com, anton.ivanov@cambridgegreys.com, arnd@kernel.org, artur.paszkiewicz@intel.com, bp@alien8.de, christian.koenig@amd.com, clm@fb.com, daniel@ffwll.ch, dave.hansen@linux.intel.com, davem@davemloft.net, dm-devel@lists.linux.dev, dmitry.torokhov@gmail.com, dri-devel@lists.freedesktop.org, dsahern@kernel.org, dsterba@suse.com, edumazet@google.com, evan.quan@amd.com, farbere@amazon.com, gregkh@linuxfoundation.org, harry.wentland@amd.com, hdegoede@redhat.com, hpa@zytor.com, ilpo.jarvinen@linux.intel.com, james.morse@arm.com, jdelvare@suse.com, jejb@linux.ibm.com, jernej.skrabec@gmail.com, joabreu@synopsys.com, johannes@sipsolutions.net, josef@toxicpanda.com, keescook@chromium.org, krzysztof.kozlowski@linaro.org, kuba@kernel.org, linus.walleij@linaro.org, l@kvack.org, inux-arm-kernel@lists.infradead.org, linux-mm@kvack.org, linux-staging@lists.linux.dev, linux-stm32@st-md-mailman.stormreply.com, linux-sunxi@lists.linux.dev, linux-um@lists.infradead.org, linux@rasmusvillemoes.dk, linux@roeck-us.net, lorenzo.stoakes@oracle.com, luc.vanoostenryck@gmail.com, luto@kernel.org, maarten.lankhorst@linux.intel.com, mailhol.vincent@wanadoo.fr, malattia@linux.it, markgross@kernel.org, martin.petersen@oracle.com, mchehab@kernel.org, mcoquelin.stm32@gmail.com, mhiramat@kernel.org, minchan@kernel.org, mingo@redhat.com, mkl@pengutronix.de, mripard@kernel.org, pabeni@redhat.com, peterz@infradead.org, pmladek@suse.com, qiuxu.zhuo@intel.com, richard@nod.at, rostedt@goodmis.org, rric@kernel.org, sakari.ailus@linux.intel.com, samuel@sholland.org, senozhatsky@chromium.org, shuah@kernel.org, snitzer@kernel.org, sunpeng.li@amd.com, tglx@linutronix.de, tony.luck@intel.com, torvalds@linux-foundation.org, tzimmermann@suse.de, wad@chromium.org, wens@csie.org, wg@grandegger.com, x86@kernel.org Cc: From: Date: Mon, 22 Sep 2025 14:27:00 +0200 In-Reply-To: <20250922103241.16213-6-farbere@amazon.com> Message-ID: <2025092200-bullfrog-resolved-b3bd@gregkh> MIME-Version: 1.0 Content-Type: text/plain; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: 8bit X-stable: commit X-Patchwork-Hint: ignore X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 2647840006 X-Stat-Signature: 5y31iuc5af1yjph715ocr6nuapy7ruyi X-Rspam-User: X-HE-Tag: 1758544052-855333 X-HE-Meta: U2FsdGVkX1+PfCXhTkVAvXnEkuXA07M5SAoXExl+oqMtpgyo1JHXDW1GUf3a2lPQaZAXvjGdfuW76TnFvnyzoi/psyQKo0sHhhd47RHx7DOoD5qHwjDxMLgSShPBMEniB9dPUTG9q+03Gm2xWyGsaB712jr9A3DWyQLV4+arQj21WBdKxvLubzxEEkvEgK6Cdhi18y2QBYsO+rAJ57gXBX3k/R3t8JIkV4X+BXnnB+C2ZRBW3RWECCy87HVczhLAcNlc0lqCJmMTiGwJmhVE7M0LoTwIsQvEuvLOcQ8ONImAwf6WLj1tgnT5Pz9ZSQ+f6ZPHYMaRYFuSeW0mpWsSVH3PFQOoYdYoJJTh/AlBc2O5tl2LeUiRqp6i/mBlASlcrsluBWJlTAc829jfMVbFaB7Qzs4TwU/9an4Bj9tbboDhMLj1B1Y77Fvt/vPApPvjg7fgKWYrOEA0xDe7uST3bdWTHf31WVlKkMty8PevzyLO6qte/SbsmSFlVyscZoru6Ee8HALEDtJNuK1VjixAEtDT6WE6EaP+mMHYNr1w34OCWvQ3ryhdad9ozv9HPu9bkZ1t0JlqDmso+4yCBYHKiyTs2gAlzoevIQTInsZh+MuZlMSxx1Rw5saD/JO4WccbUcTcXTECOhvmoWQGJnKi9M/05pLhR5FpQti1R7R+DC38UW/RgH5pTUEyNI2i+Vk5wlXVQblxDVt39i63dnhHSJfxgogieRpBbRMt9Vo8XA1/oxBfj2fvLPU1b9Ae5HSwwbPJBNg2Kxoo7xwNtjRi90bvYjabpgPNj0crEJS1qJjYKBcWDn399ihXbLeRC7XLNYEWiUS/TiA/IKYeyUFpRC1L2T7UMdXeUzltrnQIsfr27HoKQWjPoUeeVm8aZKU4clSLsXbrY2k53eUo7EQejHp2u2ZTRXlSfovpEkI6kFtplsPAwA/fQ6z+uZicNyFxXsCLTvO7xjndFFLAdWh jboKTtnP zeHqvhMQ32HOf+Jzim0mq7iW56mIBsW3MetE4yqsOGwcfK09I342PvUaoWvQSqm7alagXOdTxcU93Zv7+vgPrtjKuuxNwCrA4h7PLjm/LD7KKS4S5uZ0e66AkC9nNZe9CY5MTi64Rbf9yHoRuj8gz+axlnJRlzAxWRRhDrbIJOEmea9Ox/yUTcyg1/O5dXO2tIaMi5Q0psppsMEtULDSwLnfKcB6szfChq5SGkI7BROMH4RpYIcYs4OKOZyhNM4iOobC+6vl54yCuUBCp+7UIxh4XHPHw44KAAwPIPFTv1aICNctuccCK5uxVDj1H6kWJGJIwCauM9dZ68axCP8rBOPVcfyy9sbP170Trub8IPj8M3IJnniM4KjE/c3cmNygCFRnAha13Rz1xS81E/VWQubPQcpt4BB6iz9bE6wGIKRQR+E4ldIGS6mwmNn6L5v3bAYQQlC/oocbCdcz3l+e5JNhZ8wnnjM9/wz8R6IijF5SBMRy1hZDo8ZTiBRDB2o9VRXsqe61nNVK7Ckrvb/ez+JAX2OuBEEoe0xwaGk3KUp6+ibcL4DWuELc3BHzrhtlgQARxAAnbd+hLZt5wO6c3w9xoDuG+ZXFb9XGRGCSVmXwEV45ZvCceBWo8f3rXxzB5C0lN9IxiP/iXetvRQPV90BD2mzeo8ZHAQf4w0Z8o+g/MlpzKb9jFlzH4inAmjHRd8JwWtCVDDNajKzv7P8QFukZGdAwvNZ57ioIXZJB+SzLl0PXxjX0At6bEUQNJbsJxpdT4aDgji7XmTsj+Qhcju6HxjinBY9DprGtlDyRg3BjjCJi0hINuLCW9uvCYueQJuVs4DwzMxMAqge61w0d+Vrl7VogUJHjctTrkMTtGEDnQHi3ailEnmExvUSEJ6VV5za7Z0OXRfsErePNiIouD+HjqpUmVZdG31yoUPIUFuPmCRx38qq+EDXKSvULQaTOqg92KoeyNuko2XuNFa2ac3/rnLM3m dwRiyrgo 6qwzQ3zMIzmiotDBk3SHZYzl4RjMYmAy1mJk7jvTNgl3KBcG7ms1SjMMaIZF3YSYeAADD4hSzapl0qmgCwuc0lgSYUYrojwEIBIlA4UTvqPLysijGR+SojcWR3jPpgn5xyUfPGGeyi8d4zqu4qIL/TgT/gYTUoDzre5J7qR6alsqj79O/VGIfxnMdU/keBL1UC65vAbIS1CUxKzD6NV6CIpqkd0icBImPgX98kXFv87UYE2z5J0FRHbrv5u0frFPtc8wiZpY/Q9eGLit084i10aVuSuRLRZziscPJXQzLtjG9D70oTu2n6v1NSv9HL98Bdawbl4bL9TSkVfJD/cQVh5DA88KpHJLZU/K2rBwOirik19s5V4vgW8wKnDfCYVh/Doz3OGa/09i/oneTXF9fQwAMBeRhV8OckLJXWQEY0Ifzi45dOZOTr85BDSdXHLLZviDdBGgwQBgnaplg/o3laXsXfXtlHnrB8nu7CD12FBeyHeIQa26nxA0UMQJhZZIdYmF/Hkilw/q96scjphHUieHbz1MBVXx9UXNKes5HkwRb7TmYlgjkNstOsxrndd4qy4jRQBotyXk1Yoojum19Zvs620FO0s/GyESD/9eaA0uFS1fCnUN1mFDw+ir0fK/VE10aqxfAC3Hlli0j+KxUlo0uzJzzdHsxjOxvSiboIEfci9jw0hCxopTyJ/3VngYPMzm9AerQsmH/Vur6RFY9XFne/2h/JD8CibxRu0RiI9/EeIUg3tzkZu1C9YcRs+YEPQLLCVWze4= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: 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 know about it. >From stable+bounces-180928-greg=kroah.com@vger.kernel.org Mon Sep 22 12:37:49 2025 From: Eliav Farber Date: Mon, 22 Sep 2025 10:32:31 +0000 Subject: minmax: simplify min()/max()/clamp() implementation To: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Cc: Linus Torvalds , David Laight , Lorenzo Stoakes Message-ID: <20250922103241.16213-6-farbere@amazon.com> From: Linus Torvalds [ 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 Cc: Lorenzo Stoakes Signed-off-by: Linus Torvalds Signed-off-by: Eliav Farber Signed-off-by: Greg Kroah-Hartman --- 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@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