* [PATCH v2 0/2] lib/prime_numbers: convert self-test to KUnit
@ 2025-02-08 13:58 Tamir Duberstein
2025-02-08 13:58 ` [PATCH v2 1/2] lib/math: Hook up tests/Makefile Tamir Duberstein
2025-02-08 13:58 ` [PATCH v2 2/2] lib/prime_numbers: convert self-test to KUnit Tamir Duberstein
0 siblings, 2 replies; 7+ messages in thread
From: Tamir Duberstein @ 2025-02-08 13:58 UTC (permalink / raw)
To: David Gow, Shuah Khan, Luis Felipe Hernandez, Andrew Morton,
Shuah Khan
Cc: linux-kernel, linux-kselftest, Tamir Duberstein
This is a clear example of a unit test.
I tested this using:
$ tools/testing/kunit/kunit.py run --arch arm64 --make_options LLVM=1 math-prime_numbers
On success:
; [08:51:41] ============== math-prime_numbers (1 subtest) ==============
; [08:51:41] [PASSED] prime_numbers_test
; [08:51:41] =============== [PASSED] math-prime_numbers ================
; [08:51:41] ============================================================
; [08:51:41] Testing complete. Ran 1 tests: passed: 1
On failure:
; [08:50:19] ============== math-prime_numbers (1 subtest) ==============
; [08:50:19] # prime_numbers_test: ASSERTION FAILED at lib/math/tests/prime_numbers_kunit.c:28
; [08:50:19] Expected slow == fast, but
; [08:50:19] slow == 0 (0x0)
; [08:50:19] fast == 1 (0x1)
; [08:50:19] is-prime(2)
; [08:50:19] [FAILED] prime_numbers_test
; [08:50:19] # module: prime_numbers_kunit
; [08:50:19] # math-prime_numbers: primes.{last=61, .sz=64, .primes[]=...x28208a20a08a28ac} = 2-3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61
; [08:50:19] =============== [FAILED] math-prime_numbers ================
; [08:50:19] ============================================================
; [08:50:19] Testing complete. Ran 1 tests: failed: 1
Signed-off-by: Tamir Duberstein <tamird@gmail.com>
---
Changes in v2:
- Keep all the details hidden in prime_numbers.c; expose `with_primes`
for debug logging in the test. (David Gow)
- Link to v1: https://lore.kernel.org/r/20250207-prime_numbers-kunit-convert-v1-0-6067f2b7c713@gmail.com
---
Tamir Duberstein (2):
lib/math: Hook up tests/Makefile
lib/prime_numbers: convert self-test to KUnit
lib/Kconfig.debug | 14 +++++
lib/math/Makefile | 4 +-
lib/math/prime_numbers.c | 82 ++++------------------------
lib/math/prime_numbers_private.h | 17 ++++++
lib/math/tests/Makefile | 1 +
lib/math/tests/prime_numbers_kunit.c | 59 ++++++++++++++++++++
tools/testing/selftests/lib/config | 1 -
tools/testing/selftests/lib/prime_numbers.sh | 4 --
8 files changed, 104 insertions(+), 78 deletions(-)
---
base-commit: 2014c95afecee3e76ca4a56956a936e23283f05b
change-id: 20250207-prime_numbers-kunit-convert-71c9b3c1d1d4
Best regards,
--
Tamir Duberstein <tamird@gmail.com>
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH v2 1/2] lib/math: Hook up tests/Makefile 2025-02-08 13:58 [PATCH v2 0/2] lib/prime_numbers: convert self-test to KUnit Tamir Duberstein @ 2025-02-08 13:58 ` Tamir Duberstein 2025-02-08 13:58 ` [PATCH v2 2/2] lib/prime_numbers: convert self-test to KUnit Tamir Duberstein 1 sibling, 0 replies; 7+ messages in thread From: Tamir Duberstein @ 2025-02-08 13:58 UTC (permalink / raw) To: David Gow, Shuah Khan, Luis Felipe Hernandez, Andrew Morton, Shuah Khan Cc: linux-kernel, linux-kselftest, Tamir Duberstein This Makefile has been dead code since it was added in commit 7fcc9b53216c ("lib/math: Add int_pow test suite"); the tests worked because of the duplicated rules in the parent directory's Makefile. Wire up tests/Makefile and remove the duplication. Fixes: 7fcc9b53216c ("lib/math: Add int_pow test suite") Reviewed-by: David Gow <davidgow@google.com> Signed-off-by: Tamir Duberstein <tamird@gmail.com> --- lib/math/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/math/Makefile b/lib/math/Makefile index 853f023ae537..d390da9a59fe 100644 --- a/lib/math/Makefile +++ b/lib/math/Makefile @@ -5,8 +5,8 @@ obj-$(CONFIG_CORDIC) += cordic.o obj-$(CONFIG_PRIME_NUMBERS) += prime_numbers.o obj-$(CONFIG_RATIONAL) += rational.o -obj-$(CONFIG_INT_POW_TEST) += tests/int_pow_kunit.o obj-$(CONFIG_TEST_DIV64) += test_div64.o obj-$(CONFIG_TEST_MULDIV64) += test_mul_u64_u64_div_u64.o obj-$(CONFIG_RATIONAL_KUNIT_TEST) += rational-test.o -obj-$(CONFIG_INT_SQRT_KUNIT_TEST) += tests/int_sqrt_kunit.o \ No newline at end of file + +obj-y += tests/ -- 2.48.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 2/2] lib/prime_numbers: convert self-test to KUnit 2025-02-08 13:58 [PATCH v2 0/2] lib/prime_numbers: convert self-test to KUnit Tamir Duberstein 2025-02-08 13:58 ` [PATCH v2 1/2] lib/math: Hook up tests/Makefile Tamir Duberstein @ 2025-02-08 13:58 ` Tamir Duberstein 2025-02-08 14:07 ` Tamir Duberstein ` (3 more replies) 1 sibling, 4 replies; 7+ messages in thread From: Tamir Duberstein @ 2025-02-08 13:58 UTC (permalink / raw) To: David Gow, Shuah Khan, Luis Felipe Hernandez, Andrew Morton, Shuah Khan Cc: linux-kernel, linux-kselftest, Tamir Duberstein Extract a private header and convert the prime_numbers self-test to a KUnit test. I considered parameterizing the test using `KUNIT_CASE_PARAM` but didn't see how it was possible since the test logic is entangled with the test parameter generation logic. Signed-off-by: Tamir Duberstein <tamird@gmail.com> --- lib/Kconfig.debug | 14 +++++ lib/math/prime_numbers.c | 82 ++++------------------------ lib/math/prime_numbers_private.h | 17 ++++++ lib/math/tests/Makefile | 1 + lib/math/tests/prime_numbers_kunit.c | 59 ++++++++++++++++++++ tools/testing/selftests/lib/config | 1 - tools/testing/selftests/lib/prime_numbers.sh | 4 -- 7 files changed, 102 insertions(+), 76 deletions(-) diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 1af972a92d06..616beaca4a2b 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -3197,6 +3197,20 @@ config INT_SQRT_KUNIT_TEST If unsure, say N +config PRIME_NUMBERS_KUNIT_TEST + tristate "Prime number generator test" if !KUNIT_ALL_TESTS + depends on KUNIT + select PRIME_NUMBERS + default KUNIT_ALL_TESTS + help + This option enables the KUnit test suite for the {is,next}_prime_number + functions. + + Enabling this option will include tests that compare the prime number + generator functions against a brute force implementation. + + If unsure, say N + endif # RUNTIME_TESTING_MENU config ARCH_USE_MEMTEST diff --git a/lib/math/prime_numbers.c b/lib/math/prime_numbers.c index 9a17ee9af93a..540d9b7b178f 100644 --- a/lib/math/prime_numbers.c +++ b/lib/math/prime_numbers.c @@ -1,16 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-only -#define pr_fmt(fmt) "prime numbers: " fmt #include <linux/module.h> #include <linux/mutex.h> #include <linux/prime_numbers.h> -#include <linux/slab.h> -struct primes { - struct rcu_head rcu; - unsigned long last, sz; - unsigned long primes[]; -}; +#include "prime_numbers_private.h" #if BITS_PER_LONG == 64 static const struct primes small_primes = { @@ -64,7 +58,13 @@ static const struct primes __rcu *primes = RCU_INITIALIZER(&small_primes); static unsigned long selftest_max; -static bool slow_is_prime_number(unsigned long x) +#ifdef CONFIG_PRIME_NUMBERS_KUNIT_TEST +EXPORT_SYMBOL(slow_is_prime_number); + +#else +static +#endif +bool slow_is_prime_number(unsigned long x) { unsigned long y = int_sqrt(x); @@ -239,74 +239,14 @@ bool is_prime_number(unsigned long x) } EXPORT_SYMBOL(is_prime_number); -static void dump_primes(void) +void with_primes(void *ctx, primes_fn fn) { - const struct primes *p; - char *buf; - - buf = kmalloc(PAGE_SIZE, GFP_KERNEL); - rcu_read_lock(); - p = rcu_dereference(primes); - - if (buf) - bitmap_print_to_pagebuf(true, buf, p->primes, p->sz); - pr_info("primes.{last=%lu, .sz=%lu, .primes[]=...x%lx} = %s\n", - p->last, p->sz, p->primes[BITS_TO_LONGS(p->sz) - 1], buf); - + fn(ctx, rcu_dereference(primes)); rcu_read_unlock(); - - kfree(buf); -} - -static int selftest(unsigned long max) -{ - unsigned long x, last; - - if (!max) - return 0; - - for (last = 0, x = 2; x < max; x++) { - bool slow = slow_is_prime_number(x); - bool fast = is_prime_number(x); - - if (slow != fast) { - pr_err("inconsistent result for is-prime(%lu): slow=%s, fast=%s!\n", - x, slow ? "yes" : "no", fast ? "yes" : "no"); - goto err; - } - - if (!slow) - continue; - - if (next_prime_number(last) != x) { - pr_err("incorrect result for next-prime(%lu): expected %lu, got %lu\n", - last, x, next_prime_number(last)); - goto err; - } - last = x; - } - - pr_info("%s(%lu) passed, last prime was %lu\n", __func__, x, last); - return 0; - -err: - dump_primes(); - return -EINVAL; -} - -static int __init primes_init(void) -{ - return selftest(selftest_max); -} - -static void __exit primes_exit(void) -{ - free_primes(); } -module_init(primes_init); -module_exit(primes_exit); +module_exit(free_primes); module_param_named(selftest, selftest_max, ulong, 0400); diff --git a/lib/math/prime_numbers_private.h b/lib/math/prime_numbers_private.h new file mode 100644 index 000000000000..9e1d440c5398 --- /dev/null +++ b/lib/math/prime_numbers_private.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#include <linux/types.h> + +struct primes { + struct rcu_head rcu; + unsigned long last, sz; + unsigned long primes[]; +}; + +#ifdef CONFIG_PRIME_NUMBERS_KUNIT_TEST +bool slow_is_prime_number(unsigned long x); +#endif +typedef void (*primes_fn)(void *, const struct primes *); + +// Calls the callback under RCU lock. The callback must not retain the primes pointer. +void with_primes(void *ctx, primes_fn fn); diff --git a/lib/math/tests/Makefile b/lib/math/tests/Makefile index e1a79f093b2d..da21a592c75a 100644 --- a/lib/math/tests/Makefile +++ b/lib/math/tests/Makefile @@ -2,3 +2,4 @@ obj-$(CONFIG_INT_POW_TEST) += int_pow_kunit.o obj-$(CONFIG_INT_SQRT_KUNIT_TEST) += int_sqrt_kunit.o +obj-$(CONFIG_PRIME_NUMBERS_KUNIT_TEST) += prime_numbers_kunit.o diff --git a/lib/math/tests/prime_numbers_kunit.c b/lib/math/tests/prime_numbers_kunit.c new file mode 100644 index 000000000000..2f1643208c66 --- /dev/null +++ b/lib/math/tests/prime_numbers_kunit.c @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include <kunit/test.h> +#include <linux/module.h> +#include <linux/prime_numbers.h> + +#include "../prime_numbers_private.h" + +static void dump_primes(void *ctx, const struct primes *p) +{ + static char buf[PAGE_SIZE]; + struct kunit_suite *suite = ctx; + + bitmap_print_to_pagebuf(true, buf, p->primes, p->sz); + kunit_info(suite, "primes.{last=%lu, .sz=%lu, .primes[]=...x%lx} = %s", + p->last, p->sz, p->primes[BITS_TO_LONGS(p->sz) - 1], buf); +} + +static void prime_numbers_test(struct kunit *test) +{ + const unsigned long max = 65536; + unsigned long x, last, next; + + for (last = 0, x = 2; x < max; x++) { + const bool slow = slow_is_prime_number(x); + const bool fast = is_prime_number(x); + + KUNIT_ASSERT_EQ_MSG(test, slow, fast, "is-prime(%lu)", x); + + if (!slow) + continue; + + next = next_prime_number(last); + KUNIT_ASSERT_EQ_MSG(test, next, x, "next-prime(%lu)", last); + last = next; + } +} + +static void kunit_suite_exit(struct kunit_suite *suite) +{ + with_primes(suite, dump_primes); +} + +static struct kunit_case prime_numbers_cases[] = { + KUNIT_CASE(prime_numbers_test), + {}, +}; + +static struct kunit_suite prime_numbers_suite = { + .name = "math-prime_numbers", + .suite_exit = kunit_suite_exit, + .test_cases = prime_numbers_cases, +}; + +kunit_test_suite(prime_numbers_suite); + +MODULE_AUTHOR("Intel Corporation"); +MODULE_DESCRIPTION("Prime number library"); +MODULE_LICENSE("GPL"); diff --git a/tools/testing/selftests/lib/config b/tools/testing/selftests/lib/config index dc15aba8d0a3..306a3d4dca98 100644 --- a/tools/testing/selftests/lib/config +++ b/tools/testing/selftests/lib/config @@ -1,5 +1,4 @@ CONFIG_TEST_PRINTF=m CONFIG_TEST_SCANF=m CONFIG_TEST_BITMAP=m -CONFIG_PRIME_NUMBERS=m CONFIG_TEST_BITOPS=m diff --git a/tools/testing/selftests/lib/prime_numbers.sh b/tools/testing/selftests/lib/prime_numbers.sh deleted file mode 100755 index 370b79a9cb2e..000000000000 --- a/tools/testing/selftests/lib/prime_numbers.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Checks fast/slow prime_number generation for inconsistencies -$(dirname $0)/../kselftest/module.sh "prime numbers" prime_numbers selftest=65536 -- 2.48.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] lib/prime_numbers: convert self-test to KUnit 2025-02-08 13:58 ` [PATCH v2 2/2] lib/prime_numbers: convert self-test to KUnit Tamir Duberstein @ 2025-02-08 14:07 ` Tamir Duberstein 2025-02-08 21:36 ` kernel test robot ` (2 subsequent siblings) 3 siblings, 0 replies; 7+ messages in thread From: Tamir Duberstein @ 2025-02-08 14:07 UTC (permalink / raw) To: David Gow, Shuah Khan, Luis Felipe Hernandez, Andrew Morton, Shuah Khan Cc: linux-kernel, linux-kselftest On Sat, Feb 8, 2025 at 8:58 AM Tamir Duberstein <tamird@gmail.com> wrote: > > [...] > > diff --git a/lib/math/prime_numbers.c b/lib/math/prime_numbers.c > index 9a17ee9af93a..540d9b7b178f 100644 > --- a/lib/math/prime_numbers.c > +++ b/lib/math/prime_numbers.c > @@ -64,7 +58,13 @@ static const struct primes __rcu *primes = RCU_INITIALIZER(&small_primes); > > static unsigned long selftest_max; Shoot, this snuck into v2. Please pretend this isn't here, I'll remove it after your review in v3. > [...] > > module_param_named(selftest, selftest_max, ulong, 0400); > > [...] Same here. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] lib/prime_numbers: convert self-test to KUnit 2025-02-08 13:58 ` [PATCH v2 2/2] lib/prime_numbers: convert self-test to KUnit Tamir Duberstein 2025-02-08 14:07 ` Tamir Duberstein @ 2025-02-08 21:36 ` kernel test robot 2025-02-08 22:29 ` kernel test robot 2025-02-08 22:50 ` kernel test robot 3 siblings, 0 replies; 7+ messages in thread From: kernel test robot @ 2025-02-08 21:36 UTC (permalink / raw) To: Tamir Duberstein, David Gow, Shuah Khan, Luis Felipe Hernandez, Andrew Morton Cc: oe-kbuild-all, Linux Memory Management List, linux-kernel, linux-kselftest, Tamir Duberstein Hi Tamir, kernel test robot noticed the following build warnings: [auto build test WARNING on 2014c95afecee3e76ca4a56956a936e23283f05b] url: https://github.com/intel-lab-lkp/linux/commits/Tamir-Duberstein/lib-math-Hook-up-tests-Makefile/20250208-220040 base: 2014c95afecee3e76ca4a56956a936e23283f05b patch link: https://lore.kernel.org/r/20250208-prime_numbers-kunit-convert-v2-2-863119447e04%40gmail.com patch subject: [PATCH v2 2/2] lib/prime_numbers: convert self-test to KUnit config: i386-buildonly-randconfig-001-20250209 (https://download.01.org/0day-ci/archive/20250209/202502090509.wLhmGzkc-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250209/202502090509.wLhmGzkc-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202502090509.wLhmGzkc-lkp@intel.com/ All warnings (new ones prefixed by >>): lib/math/prime_numbers.c: In function 'expand_to_next_prime': lib/math/prime_numbers.c:126:15: error: implicit declaration of function 'kmalloc'; did you mean 'mm_alloc'? [-Werror=implicit-function-declaration] 126 | new = kmalloc(sizeof(*new) + bitmap_size(sz), | ^~~~~~~ | mm_alloc >> lib/math/prime_numbers.c:126:13: warning: assignment to 'struct primes *' from 'int' makes pointer from integer without a cast [-Wint-conversion] 126 | new = kmalloc(sizeof(*new) + bitmap_size(sz), | ^ lib/math/prime_numbers.c:134:17: error: implicit declaration of function 'kfree' [-Werror=implicit-function-declaration] 134 | kfree(new); | ^~~~~ cc1: some warnings being treated as errors vim +126 lib/math/prime_numbers.c cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 106 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 107 static bool expand_to_next_prime(unsigned long x) cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 108 { cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 109 const struct primes *p; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 110 struct primes *new; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 111 unsigned long sz, y; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 112 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 113 /* Betrand's Postulate (or Chebyshev's theorem) states that if n > 3, cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 114 * there is always at least one prime p between n and 2n - 2. cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 115 * Equivalently, if n > 1, then there is always at least one prime p cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 116 * such that n < p < 2n. cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 117 * cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 118 * http://mathworld.wolfram.com/BertrandsPostulate.html cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 119 * https://en.wikipedia.org/wiki/Bertrand's_postulate cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 120 */ cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 121 sz = 2 * x; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 122 if (sz < x) cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 123 return false; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 124 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 125 sz = round_up(sz, BITS_PER_LONG); 717c8ae7aae4f2 lib/prime_numbers.c Chris Wilson 2017-01-13 @126 new = kmalloc(sizeof(*new) + bitmap_size(sz), 717c8ae7aae4f2 lib/prime_numbers.c Chris Wilson 2017-01-13 127 GFP_KERNEL | __GFP_NOWARN); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 128 if (!new) cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 129 return false; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 130 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 131 mutex_lock(&lock); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 132 p = rcu_dereference_protected(primes, lockdep_is_held(&lock)); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 133 if (x < p->last) { cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 134 kfree(new); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 135 goto unlock; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 136 } cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 137 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 138 /* Where memory permits, track the primes using the cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 139 * Sieve of Eratosthenes. The sieve is to remove all multiples of known cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 140 * primes from the set, what remains in the set is therefore prime. cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 141 */ cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 142 bitmap_fill(new->primes, sz); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 143 bitmap_copy(new->primes, p->primes, p->sz); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 144 for (y = 2UL; y < sz; y = find_next_bit(new->primes, sz, y + 1)) cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 145 new->last = clear_multiples(y, new->primes, p->sz, sz); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 146 new->sz = sz; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 147 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 148 BUG_ON(new->last <= x); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 149 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 150 rcu_assign_pointer(primes, new); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 151 if (p != &small_primes) cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 152 kfree_rcu((struct primes *)p, rcu); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 153 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 154 unlock: cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 155 mutex_unlock(&lock); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 156 return true; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 157 } cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 158 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] lib/prime_numbers: convert self-test to KUnit 2025-02-08 13:58 ` [PATCH v2 2/2] lib/prime_numbers: convert self-test to KUnit Tamir Duberstein 2025-02-08 14:07 ` Tamir Duberstein 2025-02-08 21:36 ` kernel test robot @ 2025-02-08 22:29 ` kernel test robot 2025-02-08 22:50 ` kernel test robot 3 siblings, 0 replies; 7+ messages in thread From: kernel test robot @ 2025-02-08 22:29 UTC (permalink / raw) To: Tamir Duberstein, David Gow, Shuah Khan, Luis Felipe Hernandez, Andrew Morton Cc: llvm, oe-kbuild-all, Linux Memory Management List, linux-kernel, linux-kselftest, Tamir Duberstein Hi Tamir, kernel test robot noticed the following build errors: [auto build test ERROR on 2014c95afecee3e76ca4a56956a936e23283f05b] url: https://github.com/intel-lab-lkp/linux/commits/Tamir-Duberstein/lib-math-Hook-up-tests-Makefile/20250208-220040 base: 2014c95afecee3e76ca4a56956a936e23283f05b patch link: https://lore.kernel.org/r/20250208-prime_numbers-kunit-convert-v2-2-863119447e04%40gmail.com patch subject: [PATCH v2 2/2] lib/prime_numbers: convert self-test to KUnit config: i386-buildonly-randconfig-002-20250209 (https://download.01.org/0day-ci/archive/20250209/202502090614.UJPLikn4-lkp@intel.com/config) compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250209/202502090614.UJPLikn4-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202502090614.UJPLikn4-lkp@intel.com/ All errors (new ones prefixed by >>): >> lib/math/prime_numbers.c:126:8: error: call to undeclared function 'kmalloc'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 126 | new = kmalloc(sizeof(*new) + bitmap_size(sz), | ^ lib/math/prime_numbers.c:126:8: note: did you mean 'mm_alloc'? include/linux/sched/mm.h:16:26: note: 'mm_alloc' declared here 16 | extern struct mm_struct *mm_alloc(void); | ^ >> lib/math/prime_numbers.c:126:6: error: incompatible integer to pointer conversion assigning to 'struct primes *' from 'int' [-Wint-conversion] 126 | new = kmalloc(sizeof(*new) + bitmap_size(sz), | ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 127 | GFP_KERNEL | __GFP_NOWARN); | ~~~~~~~~~~~~~~~~~~~~~~~~~~ >> lib/math/prime_numbers.c:134:3: error: call to undeclared function 'kfree'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 134 | kfree(new); | ^ 3 errors generated. vim +/kmalloc +126 lib/math/prime_numbers.c cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 106 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 107 static bool expand_to_next_prime(unsigned long x) cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 108 { cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 109 const struct primes *p; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 110 struct primes *new; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 111 unsigned long sz, y; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 112 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 113 /* Betrand's Postulate (or Chebyshev's theorem) states that if n > 3, cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 114 * there is always at least one prime p between n and 2n - 2. cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 115 * Equivalently, if n > 1, then there is always at least one prime p cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 116 * such that n < p < 2n. cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 117 * cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 118 * http://mathworld.wolfram.com/BertrandsPostulate.html cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 119 * https://en.wikipedia.org/wiki/Bertrand's_postulate cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 120 */ cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 121 sz = 2 * x; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 122 if (sz < x) cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 123 return false; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 124 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 125 sz = round_up(sz, BITS_PER_LONG); 717c8ae7aae4f2 lib/prime_numbers.c Chris Wilson 2017-01-13 @126 new = kmalloc(sizeof(*new) + bitmap_size(sz), 717c8ae7aae4f2 lib/prime_numbers.c Chris Wilson 2017-01-13 127 GFP_KERNEL | __GFP_NOWARN); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 128 if (!new) cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 129 return false; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 130 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 131 mutex_lock(&lock); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 132 p = rcu_dereference_protected(primes, lockdep_is_held(&lock)); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 133 if (x < p->last) { cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 @134 kfree(new); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 135 goto unlock; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 136 } cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 137 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 138 /* Where memory permits, track the primes using the cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 139 * Sieve of Eratosthenes. The sieve is to remove all multiples of known cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 140 * primes from the set, what remains in the set is therefore prime. cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 141 */ cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 142 bitmap_fill(new->primes, sz); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 143 bitmap_copy(new->primes, p->primes, p->sz); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 144 for (y = 2UL; y < sz; y = find_next_bit(new->primes, sz, y + 1)) cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 145 new->last = clear_multiples(y, new->primes, p->sz, sz); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 146 new->sz = sz; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 147 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 148 BUG_ON(new->last <= x); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 149 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 150 rcu_assign_pointer(primes, new); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 151 if (p != &small_primes) cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 152 kfree_rcu((struct primes *)p, rcu); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 153 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 154 unlock: cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 155 mutex_unlock(&lock); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 156 return true; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 157 } cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 158 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] lib/prime_numbers: convert self-test to KUnit 2025-02-08 13:58 ` [PATCH v2 2/2] lib/prime_numbers: convert self-test to KUnit Tamir Duberstein ` (2 preceding siblings ...) 2025-02-08 22:29 ` kernel test robot @ 2025-02-08 22:50 ` kernel test robot 3 siblings, 0 replies; 7+ messages in thread From: kernel test robot @ 2025-02-08 22:50 UTC (permalink / raw) To: Tamir Duberstein, David Gow, Shuah Khan, Luis Felipe Hernandez, Andrew Morton Cc: oe-kbuild-all, Linux Memory Management List, linux-kernel, linux-kselftest, Tamir Duberstein Hi Tamir, kernel test robot noticed the following build errors: [auto build test ERROR on 2014c95afecee3e76ca4a56956a936e23283f05b] url: https://github.com/intel-lab-lkp/linux/commits/Tamir-Duberstein/lib-math-Hook-up-tests-Makefile/20250208-220040 base: 2014c95afecee3e76ca4a56956a936e23283f05b patch link: https://lore.kernel.org/r/20250208-prime_numbers-kunit-convert-v2-2-863119447e04%40gmail.com patch subject: [PATCH v2 2/2] lib/prime_numbers: convert self-test to KUnit config: i386-buildonly-randconfig-001-20250209 (https://download.01.org/0day-ci/archive/20250209/202502090640.RJYhwFQe-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250209/202502090640.RJYhwFQe-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202502090640.RJYhwFQe-lkp@intel.com/ All errors (new ones prefixed by >>): lib/math/prime_numbers.c: In function 'expand_to_next_prime': >> lib/math/prime_numbers.c:126:15: error: implicit declaration of function 'kmalloc'; did you mean 'mm_alloc'? [-Werror=implicit-function-declaration] 126 | new = kmalloc(sizeof(*new) + bitmap_size(sz), | ^~~~~~~ | mm_alloc lib/math/prime_numbers.c:126:13: warning: assignment to 'struct primes *' from 'int' makes pointer from integer without a cast [-Wint-conversion] 126 | new = kmalloc(sizeof(*new) + bitmap_size(sz), | ^ >> lib/math/prime_numbers.c:134:17: error: implicit declaration of function 'kfree' [-Werror=implicit-function-declaration] 134 | kfree(new); | ^~~~~ cc1: some warnings being treated as errors vim +126 lib/math/prime_numbers.c cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 106 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 107 static bool expand_to_next_prime(unsigned long x) cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 108 { cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 109 const struct primes *p; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 110 struct primes *new; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 111 unsigned long sz, y; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 112 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 113 /* Betrand's Postulate (or Chebyshev's theorem) states that if n > 3, cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 114 * there is always at least one prime p between n and 2n - 2. cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 115 * Equivalently, if n > 1, then there is always at least one prime p cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 116 * such that n < p < 2n. cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 117 * cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 118 * http://mathworld.wolfram.com/BertrandsPostulate.html cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 119 * https://en.wikipedia.org/wiki/Bertrand's_postulate cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 120 */ cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 121 sz = 2 * x; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 122 if (sz < x) cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 123 return false; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 124 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 125 sz = round_up(sz, BITS_PER_LONG); 717c8ae7aae4f2 lib/prime_numbers.c Chris Wilson 2017-01-13 @126 new = kmalloc(sizeof(*new) + bitmap_size(sz), 717c8ae7aae4f2 lib/prime_numbers.c Chris Wilson 2017-01-13 127 GFP_KERNEL | __GFP_NOWARN); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 128 if (!new) cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 129 return false; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 130 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 131 mutex_lock(&lock); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 132 p = rcu_dereference_protected(primes, lockdep_is_held(&lock)); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 133 if (x < p->last) { cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 @134 kfree(new); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 135 goto unlock; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 136 } cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 137 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 138 /* Where memory permits, track the primes using the cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 139 * Sieve of Eratosthenes. The sieve is to remove all multiples of known cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 140 * primes from the set, what remains in the set is therefore prime. cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 141 */ cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 142 bitmap_fill(new->primes, sz); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 143 bitmap_copy(new->primes, p->primes, p->sz); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 144 for (y = 2UL; y < sz; y = find_next_bit(new->primes, sz, y + 1)) cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 145 new->last = clear_multiples(y, new->primes, p->sz, sz); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 146 new->sz = sz; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 147 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 148 BUG_ON(new->last <= x); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 149 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 150 rcu_assign_pointer(primes, new); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 151 if (p != &small_primes) cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 152 kfree_rcu((struct primes *)p, rcu); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 153 cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 154 unlock: cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 155 mutex_unlock(&lock); cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 156 return true; cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 157 } cf4a7207b1cb4a lib/prime_numbers.c Chris Wilson 2016-12-22 158 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-02-08 22:51 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-02-08 13:58 [PATCH v2 0/2] lib/prime_numbers: convert self-test to KUnit Tamir Duberstein 2025-02-08 13:58 ` [PATCH v2 1/2] lib/math: Hook up tests/Makefile Tamir Duberstein 2025-02-08 13:58 ` [PATCH v2 2/2] lib/prime_numbers: convert self-test to KUnit Tamir Duberstein 2025-02-08 14:07 ` Tamir Duberstein 2025-02-08 21:36 ` kernel test robot 2025-02-08 22:29 ` kernel test robot 2025-02-08 22:50 ` kernel test robot
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox