* [PATCH v2 0/2] percpu: Add a test case and fix for clang
@ 2024-10-16 18:23 Andy Shevchenko
2024-10-16 18:23 ` [PATCH v2 1/2] x86/percpu: Fix clang warning when dealing with unsigned types Andy Shevchenko
2024-10-16 18:23 ` [PATCH v2 2/2] percpu: Add a test case for the specific 64-bit value addition Andy Shevchenko
0 siblings, 2 replies; 3+ messages in thread
From: Andy Shevchenko @ 2024-10-16 18:23 UTC (permalink / raw)
To: Ingo Molnar, Uros Bizjak, Andy Shevchenko, linux-mm, linux-kernel
Cc: Dennis Zhou, Tejun Heo, Christoph Lameter, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin,
Andrew Morton
Add a test case to percpu to check a corner case with the specific
64-bit unsigned value. This test case shows why the first patch is
done in the way it's done.
The before and after has been tested with binary comparison of
the percpu_test module and runnig it on the real Intel system.
v2:
- updated Subject (Dave)
- added test case
Andy Shevchenko (2):
x86/percpu: Fix clang warning when dealing with unsigned types
percpu: Add a test case for the specific 64-bit value addition
arch/x86/include/asm/percpu.h | 7 ++++---
lib/percpu_test.c | 11 ++++++++++-
2 files changed, 14 insertions(+), 4 deletions(-)
--
2.43.0.rc1.1336.g36b5255a03ac
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH v2 1/2] x86/percpu: Fix clang warning when dealing with unsigned types
2024-10-16 18:23 [PATCH v2 0/2] percpu: Add a test case and fix for clang Andy Shevchenko
@ 2024-10-16 18:23 ` Andy Shevchenko
2024-10-16 18:23 ` [PATCH v2 2/2] percpu: Add a test case for the specific 64-bit value addition Andy Shevchenko
1 sibling, 0 replies; 3+ messages in thread
From: Andy Shevchenko @ 2024-10-16 18:23 UTC (permalink / raw)
To: Ingo Molnar, Uros Bizjak, Andy Shevchenko, linux-mm, linux-kernel
Cc: Dennis Zhou, Tejun Heo, Christoph Lameter, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin,
Andrew Morton
When percpu_add_op() is used with an unsigned argument, it prevents
kernel builds with clang, `make W=1` and CONFIG_WERROR=y:
net/ipv4/tcp_output.c:187:3: error: result of comparison of constant -1 with expression of type 'u8' (aka 'unsigned char') is always false [-Werror,-Wtautological-constant-out-of-range-compare]
187 | NET_ADD_STATS(sock_net(sk), LINUX_MIB_TCPACKCOMPRESSED,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
188 | tp->compressed_ack);
| ~~~~~~~~~~~~~~~~~~~
...
arch/x86/include/asm/percpu.h:238:31: note: expanded from macro 'percpu_add_op'
238 | ((val) == 1 || (val) == -1)) ? \
| ~~~~~ ^ ~~
Fix this by casting -1 to the type of the parameter and then compare.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
arch/x86/include/asm/percpu.h | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h
index c55a79d5feae..e525cd85f999 100644
--- a/arch/x86/include/asm/percpu.h
+++ b/arch/x86/include/asm/percpu.h
@@ -234,9 +234,10 @@ do { \
*/
#define percpu_add_op(size, qual, var, val) \
do { \
- const int pao_ID__ = (__builtin_constant_p(val) && \
- ((val) == 1 || (val) == -1)) ? \
- (int)(val) : 0; \
+ const int pao_ID__ = \
+ (__builtin_constant_p(val) && \
+ ((val) == 1 || \
+ (val) == (typeof(val))-1)) ? (int)(val) : 0; \
\
if (0) { \
typeof(var) pao_tmp__; \
--
2.43.0.rc1.1336.g36b5255a03ac
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH v2 2/2] percpu: Add a test case for the specific 64-bit value addition
2024-10-16 18:23 [PATCH v2 0/2] percpu: Add a test case and fix for clang Andy Shevchenko
2024-10-16 18:23 ` [PATCH v2 1/2] x86/percpu: Fix clang warning when dealing with unsigned types Andy Shevchenko
@ 2024-10-16 18:23 ` Andy Shevchenko
1 sibling, 0 replies; 3+ messages in thread
From: Andy Shevchenko @ 2024-10-16 18:23 UTC (permalink / raw)
To: Ingo Molnar, Uros Bizjak, Andy Shevchenko, linux-mm, linux-kernel
Cc: Dennis Zhou, Tejun Heo, Christoph Lameter, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin,
Andrew Morton
It might be a corner case when we add UINT_MAX as 64-bit unsigned value
to the percpu variable as it's not the same as -1 (ULONG_LONG_MAX).
Add a test case for that.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
lib/percpu_test.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/lib/percpu_test.c b/lib/percpu_test.c
index 4a3d70bbc1a0..ce7124b16dab 100644
--- a/lib/percpu_test.c
+++ b/lib/percpu_test.c
@@ -1,4 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
+#include <linux/limits.h>
#include <linux/module.h>
/* validate @native and @pcp counter values match @expected */
@@ -24,8 +25,9 @@ static int __init percpu_test_init(void)
* +ul_one/-ul_one below would replace with inc/dec instructions.
*/
volatile unsigned int ui_one = 1;
- long l = 0;
+ unsigned long long ull = 0;
unsigned long ul = 0;
+ long l = 0;
pr_info("percpu test start\n");
@@ -112,6 +114,13 @@ static int __init percpu_test_init(void)
CHECK(ul, ulong_counter, -1);
CHECK(ul, ulong_counter, ULONG_MAX);
+ ul = ull = 0;
+ __this_cpu_write(ulong_counter, 0);
+
+ ul = ull += UINT_MAX;
+ __this_cpu_add(ulong_counter, ull);
+ CHECK(ul, ulong_counter, UINT_MAX);
+
ul = 3;
__this_cpu_write(ulong_counter, 3);
--
2.43.0.rc1.1336.g36b5255a03ac
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2024-10-16 18:26 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-10-16 18:23 [PATCH v2 0/2] percpu: Add a test case and fix for clang Andy Shevchenko
2024-10-16 18:23 ` [PATCH v2 1/2] x86/percpu: Fix clang warning when dealing with unsigned types Andy Shevchenko
2024-10-16 18:23 ` [PATCH v2 2/2] percpu: Add a test case for the specific 64-bit value addition Andy Shevchenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox