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
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
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
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
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.
© 2016 - 2026 Red Hat, Inc.