aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wilcox <willy@infradead.org>2018-06-18 16:59:29 -0400
committerMatthew Wilcox <willy@infradead.org>2018-08-21 23:54:20 -0400
commit8ab8ba38d48867aac01812e18f48fc9173ccd400 (patch)
tree4d149499e92ea666779d91caa2a487dfc322ffba
parent31ff0ceeb266a4ac96f3fc8cebb85df862a22f92 (diff)
ida: Start new test_ida module
Start transitioning the IDA tests into kernel space. Framework heavily cribbed from test_xarray.c. Signed-off-by: Matthew Wilcox <willy@infradead.org>
-rw-r--r--lib/Kconfig.debug3
-rw-r--r--lib/Makefile1
-rw-r--r--lib/test_ida.c45
-rw-r--r--tools/testing/radix-tree/Makefile1
-rw-r--r--tools/testing/radix-tree/idr-test.c22
-rw-r--r--tools/testing/radix-tree/main.c3
-rw-r--r--tools/testing/radix-tree/test.h3
7 files changed, 71 insertions, 7 deletions
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 8838d1158d19..2fff661d9070 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -1827,6 +1827,9 @@ config TEST_HASH
1827 This is intended to help people writing architecture-specific 1827 This is intended to help people writing architecture-specific
1828 optimized versions. If unsure, say N. 1828 optimized versions. If unsure, say N.
1829 1829
1830config TEST_IDA
1831 tristate "Perform selftest on IDA functions"
1832
1830config TEST_PARMAN 1833config TEST_PARMAN
1831 tristate "Perform selftest on priority array manager" 1834 tristate "Perform selftest on priority array manager"
1832 default n 1835 default n
diff --git a/lib/Makefile b/lib/Makefile
index 90dc5520b784..18d87ca4c949 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -50,6 +50,7 @@ obj-$(CONFIG_TEST_BPF) += test_bpf.o
50obj-$(CONFIG_TEST_FIRMWARE) += test_firmware.o 50obj-$(CONFIG_TEST_FIRMWARE) += test_firmware.o
51obj-$(CONFIG_TEST_SYSCTL) += test_sysctl.o 51obj-$(CONFIG_TEST_SYSCTL) += test_sysctl.o
52obj-$(CONFIG_TEST_HASH) += test_hash.o test_siphash.o 52obj-$(CONFIG_TEST_HASH) += test_hash.o test_siphash.o
53obj-$(CONFIG_TEST_IDA) += test_ida.o
53obj-$(CONFIG_TEST_KASAN) += test_kasan.o 54obj-$(CONFIG_TEST_KASAN) += test_kasan.o
54CFLAGS_test_kasan.o += -fno-builtin 55CFLAGS_test_kasan.o += -fno-builtin
55obj-$(CONFIG_TEST_UBSAN) += test_ubsan.o 56obj-$(CONFIG_TEST_UBSAN) += test_ubsan.o
diff --git a/lib/test_ida.c b/lib/test_ida.c
new file mode 100644
index 000000000000..8c9a0672696b
--- /dev/null
+++ b/lib/test_ida.c
@@ -0,0 +1,45 @@
1// SPDX-License-Identifier: GPL-2.0+
2/*
3 * test_ida.c: Test the IDA API
4 * Copyright (c) 2016-2018 Microsoft Corporation
5 * Copyright (c) 2018 Oracle Corporation
6 * Author: Matthew Wilcox <willy@infradead.org>
7 */
8
9#include <linux/idr.h>
10#include <linux/module.h>
11
12static unsigned int tests_run;
13static unsigned int tests_passed;
14
15#ifdef __KERNEL__
16void ida_dump(struct ida *ida) { }
17#endif
18#define IDA_BUG_ON(ida, x) do { \
19 tests_run++; \
20 if (x) { \
21 ida_dump(ida); \
22 dump_stack(); \
23 } else { \
24 tests_passed++; \
25 } \
26} while (0)
27
28static int ida_checks(void)
29{
30 DEFINE_IDA(ida);
31
32 IDA_BUG_ON(&ida, !ida_is_empty(&ida));
33
34 printk("IDA: %u of %u tests passed\n", tests_passed, tests_run);
35 return (tests_run != tests_passed) ? 0 : -EINVAL;
36}
37
38static void ida_exit(void)
39{
40}
41
42module_init(ida_checks);
43module_exit(ida_exit);
44MODULE_AUTHOR("Matthew Wilcox <willy@infradead.org>");
45MODULE_LICENSE("GPL");
diff --git a/tools/testing/radix-tree/Makefile b/tools/testing/radix-tree/Makefile
index da030a65d6d6..37baecc3766f 100644
--- a/tools/testing/radix-tree/Makefile
+++ b/tools/testing/radix-tree/Makefile
@@ -22,6 +22,7 @@ targets: generated/map-shift.h $(TARGETS)
22 22
23main: $(OFILES) 23main: $(OFILES)
24 24
25idr-test.o: ../../../lib/test_ida.c
25idr-test: idr-test.o $(CORE_OFILES) 26idr-test: idr-test.o $(CORE_OFILES)
26 27
27multiorder: multiorder.o $(CORE_OFILES) 28multiorder: multiorder.o $(CORE_OFILES)
diff --git a/tools/testing/radix-tree/idr-test.c b/tools/testing/radix-tree/idr-test.c
index ee820fcc29b0..604b51dc9b38 100644
--- a/tools/testing/radix-tree/idr-test.c
+++ b/tools/testing/radix-tree/idr-test.c
@@ -309,6 +309,15 @@ void idr_checks(void)
309 idr_u32_test(0); 309 idr_u32_test(0);
310} 310}
311 311
312#define module_init(x)
313#define module_exit(x)
314#define MODULE_AUTHOR(x)
315#define MODULE_LICENSE(x)
316#define dump_stack() assert(0)
317void ida_dump(struct ida *);
318
319#include "../../../lib/test_ida.c"
320
312/* 321/*
313 * Check that we get the correct error when we run out of memory doing 322 * Check that we get the correct error when we run out of memory doing
314 * allocations. To ensure we run out of memory, just "forget" to preload. 323 * allocations. To ensure we run out of memory, just "forget" to preload.
@@ -488,7 +497,7 @@ void ida_simple_get_remove_test(void)
488 ida_destroy(&ida); 497 ida_destroy(&ida);
489} 498}
490 499
491void ida_checks(void) 500void user_ida_checks(void)
492{ 501{
493 DEFINE_IDA(ida); 502 DEFINE_IDA(ida);
494 int id; 503 int id;
@@ -582,12 +591,19 @@ void ida_thread_tests(void)
582 pthread_join(threads[i], NULL); 591 pthread_join(threads[i], NULL);
583} 592}
584 593
594void ida_tests(void)
595{
596 user_ida_checks();
597 ida_checks();
598 ida_exit();
599 ida_thread_tests();
600}
601
585int __weak main(void) 602int __weak main(void)
586{ 603{
587 radix_tree_init(); 604 radix_tree_init();
588 idr_checks(); 605 idr_checks();
589 ida_checks(); 606 ida_tests();
590 ida_thread_tests();
591 radix_tree_cpu_dead(1); 607 radix_tree_cpu_dead(1);
592 rcu_barrier(); 608 rcu_barrier();
593 if (nr_allocated) 609 if (nr_allocated)
diff --git a/tools/testing/radix-tree/main.c b/tools/testing/radix-tree/main.c
index 584a8732f5ce..b741686e53d6 100644
--- a/tools/testing/radix-tree/main.c
+++ b/tools/testing/radix-tree/main.c
@@ -324,7 +324,7 @@ static void single_thread_tests(bool long_run)
324 printv(2, "after dynamic_height_check: %d allocated, preempt %d\n", 324 printv(2, "after dynamic_height_check: %d allocated, preempt %d\n",
325 nr_allocated, preempt_count); 325 nr_allocated, preempt_count);
326 idr_checks(); 326 idr_checks();
327 ida_checks(); 327 ida_tests();
328 rcu_barrier(); 328 rcu_barrier();
329 printv(2, "after idr_checks: %d allocated, preempt %d\n", 329 printv(2, "after idr_checks: %d allocated, preempt %d\n",
330 nr_allocated, preempt_count); 330 nr_allocated, preempt_count);
@@ -371,7 +371,6 @@ int main(int argc, char **argv)
371 iteration_test(0, 10 + 90 * long_run); 371 iteration_test(0, 10 + 90 * long_run);
372 iteration_test(7, 10 + 90 * long_run); 372 iteration_test(7, 10 + 90 * long_run);
373 single_thread_tests(long_run); 373 single_thread_tests(long_run);
374 ida_thread_tests();
375 374
376 /* Free any remaining preallocated nodes */ 375 /* Free any remaining preallocated nodes */
377 radix_tree_cpu_dead(0); 376 radix_tree_cpu_dead(0);
diff --git a/tools/testing/radix-tree/test.h b/tools/testing/radix-tree/test.h
index 31f1d9b6f506..92d901eacf49 100644
--- a/tools/testing/radix-tree/test.h
+++ b/tools/testing/radix-tree/test.h
@@ -39,8 +39,7 @@ void multiorder_checks(void);
39void iteration_test(unsigned order, unsigned duration); 39void iteration_test(unsigned order, unsigned duration);
40void benchmark(void); 40void benchmark(void);
41void idr_checks(void); 41void idr_checks(void);
42void ida_checks(void); 42void ida_tests(void);
43void ida_thread_tests(void);
44 43
45struct item * 44struct item *
46item_tag_set(struct radix_tree_root *root, unsigned long index, int tag); 45item_tag_set(struct radix_tree_root *root, unsigned long index, int tag);