| From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Subject: percpu: add a test case for the specific 64-bit value addition |
| Date: Wed, 16 Oct 2024 21:23:52 +0300 |
| |
| 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. |
| |
| Link: https://lkml.kernel.org/r/20241016182635.1156168-3-andriy.shevchenko@linux.intel.com |
| Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Cc: Borislav Petkov (AMD) <bp@alien8.de> |
| Cc: Christoph Lameter <cl@linux.com> |
| Cc: Dave Hansen <dave.hansen@linux.intel.com> |
| Cc: Dennis Zhou <dennis@kernel.org> |
| Cc: "H. Peter Anvin" <hpa@zytor.com> |
| Cc: Ingo Molnar <mingo@kernel.org> |
| Cc: Ingo Molnar <mingo@redhat.com> |
| Cc: Tejun Heo <tj@kernel.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Uros Bizjak <ubizjak@gmail.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| lib/percpu_test.c | 11 ++++++++++- |
| 1 file changed, 10 insertions(+), 1 deletion(-) |
| |
| --- a/lib/percpu_test.c~percpu-add-a-test-case-for-the-specific-64-bit-value-addition |
| +++ a/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); |
| |
| _ |