| From: David Laight <David.Laight@ACULAB.COM> |
| Subject: minmax.h: remove some #defines that are only expanded once |
| Date: Mon, 18 Nov 2024 19:15:51 +0000 |
| |
| The bodies of __signed_type_use() and __unsigned_type_use() are much the |
| same size as their names - so put the bodies in the only line that expands |
| them. |
| |
| Similarly __signed_type() is defined separately for 64bit and then used |
| exactly once just below. |
| |
| Change the test for __signed_type from CONFIG_64BIT to one based on gcc |
| defined macros so that the code is valid if it gets used outside of a |
| kernel build. |
| |
| Link: https://lkml.kernel.org/r/9386d1ebb8974fbabbed2635160c3975@AcuMS.aculab.com |
| Signed-off-by: David Laight <david.laight@aculab.com> |
| Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Cc: Arnd Bergmann <arnd@kernel.org> |
| Cc: Christoph Hellwig <hch@infradead.org> |
| Cc: Dan Carpenter <dan.carpenter@linaro.org> |
| Cc: Jason A. Donenfeld <Jason@zx2c4.com> |
| Cc: Jens Axboe <axboe@kernel.dk> |
| Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> |
| Cc: Mateusz Guzik <mjguzik@gmail.com> |
| Cc: Matthew Wilcox <willy@infradead.org> |
| Cc: Pedro Falcato <pedro.falcato@gmail.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| include/linux/minmax.h | 14 ++++++-------- |
| 1 file changed, 6 insertions(+), 8 deletions(-) |
| |
| --- a/include/linux/minmax.h~minmaxh-remove-some-defines-that-are-only-expanded-once |
| +++ a/include/linux/minmax.h |
| @@ -46,10 +46,8 @@ |
| * comparison, and these expressions only need to be careful to not cause |
| * warnings for pointer use. |
| */ |
| -#define __signed_type_use(ux) (2 + __is_nonneg(ux)) |
| -#define __unsigned_type_use(ux) (1 + 2 * (sizeof(ux) < 4)) |
| #define __sign_use(ux) (is_signed_type(typeof(ux)) ? \ |
| - __signed_type_use(ux) : __unsigned_type_use(ux)) |
| + (2 + __is_nonneg(ux)) : (1 + 2 * (sizeof(ux) < 4))) |
| |
| /* |
| * Check whether a signed value is always non-negative. |
| @@ -57,7 +55,7 @@ |
| * A cast is needed to avoid any warnings from values that aren't signed |
| * integer types (in which case the result doesn't matter). |
| * |
| - * On 64-bit any integer or pointer type can safely be cast to 'long'. |
| + * On 64-bit any integer or pointer type can safely be cast to 'long long'. |
| * But on 32-bit we need to avoid warnings about casting pointers to integers |
| * of different sizes without truncating 64-bit values so 'long' or 'long long' |
| * must be used depending on the size of the value. |
| @@ -66,12 +64,12 @@ |
| * them, but we do not use s128 types in the kernel (we do use 'u128', |
| * but they are handled by the !is_signed_type() case). |
| */ |
| -#ifdef CONFIG_64BIT |
| - #define __signed_type(ux) long |
| +#if __SIZEOF_POINTER__ == __SIZEOF_LONG_LONG__ |
| +#define __is_nonneg(ux) statically_true((long long)(ux) >= 0) |
| #else |
| - #define __signed_type(ux) typeof(__builtin_choose_expr(sizeof(ux) > 4, 1LL, 1L)) |
| +#define __is_nonneg(ux) statically_true( \ |
| + (typeof(__builtin_choose_expr(sizeof(ux) > 4, 1LL, 1L)))(ux) >= 0) |
| #endif |
| -#define __is_nonneg(ux) statically_true((__signed_type(ux))(ux) >= 0) |
| |
| #define __types_ok(ux, uy) \ |
| (__sign_use(ux) & __sign_use(uy)) |
| _ |