Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+71 -7
+3
lib/Kconfig.debug
··· 1827 1827 This is intended to help people writing architecture-specific 1828 1828 optimized versions. If unsure, say N. 1829 1829 1830 + config TEST_IDA 1831 + tristate "Perform selftest on IDA functions" 1832 + 1830 1833 config TEST_PARMAN 1831 1834 tristate "Perform selftest on priority array manager" 1832 1835 default n
+1
lib/Makefile
··· 50 50 obj-$(CONFIG_TEST_FIRMWARE) += test_firmware.o 51 51 obj-$(CONFIG_TEST_SYSCTL) += test_sysctl.o 52 52 obj-$(CONFIG_TEST_HASH) += test_hash.o test_siphash.o 53 + obj-$(CONFIG_TEST_IDA) += test_ida.o 53 54 obj-$(CONFIG_TEST_KASAN) += test_kasan.o 54 55 CFLAGS_test_kasan.o += -fno-builtin 55 56 obj-$(CONFIG_TEST_UBSAN) += test_ubsan.o
+45
lib/test_ida.c
··· 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 + 12 + static unsigned int tests_run; 13 + static unsigned int tests_passed; 14 + 15 + #ifdef __KERNEL__ 16 + void 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 + 28 + static 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 + 38 + static void ida_exit(void) 39 + { 40 + } 41 + 42 + module_init(ida_checks); 43 + module_exit(ida_exit); 44 + MODULE_AUTHOR("Matthew Wilcox <willy@infradead.org>"); 45 + MODULE_LICENSE("GPL");
+1
tools/testing/radix-tree/Makefile
··· 22 22 23 23 main: $(OFILES) 24 24 25 + idr-test.o: ../../../lib/test_ida.c 25 26 idr-test: idr-test.o $(CORE_OFILES) 26 27 27 28 multiorder: multiorder.o $(CORE_OFILES)
+19 -3
tools/testing/radix-tree/idr-test.c
··· 309 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) 317 + void ida_dump(struct ida *); 318 + 319 + #include "../../../lib/test_ida.c" 320 + 312 321 /* 313 322 * Check that we get the correct error when we run out of memory doing 314 323 * allocations. To ensure we run out of memory, just "forget" to preload. ··· 497 488 ida_destroy(&ida); 498 489 } 499 490 500 - void ida_checks(void) 491 + void user_ida_checks(void) 501 492 { 502 493 DEFINE_IDA(ida); 503 494 int id; ··· 591 582 pthread_join(threads[i], NULL); 592 583 } 593 584 585 + void ida_tests(void) 586 + { 587 + user_ida_checks(); 588 + ida_checks(); 589 + ida_exit(); 590 + ida_thread_tests(); 591 + } 592 + 594 593 int __weak main(void) 595 594 { 596 595 radix_tree_init(); 597 596 idr_checks(); 598 - ida_checks(); 599 - ida_thread_tests(); 597 + ida_tests(); 600 598 radix_tree_cpu_dead(1); 601 599 rcu_barrier(); 602 600 if (nr_allocated)
+1 -2
tools/testing/radix-tree/main.c
··· 324 324 printv(2, "after dynamic_height_check: %d allocated, preempt %d\n", 325 325 nr_allocated, preempt_count); 326 326 idr_checks(); 327 - ida_checks(); 327 + ida_tests(); 328 328 rcu_barrier(); 329 329 printv(2, "after idr_checks: %d allocated, preempt %d\n", 330 330 nr_allocated, preempt_count); ··· 371 371 iteration_test(0, 10 + 90 * long_run); 372 372 iteration_test(7, 10 + 90 * long_run); 373 373 single_thread_tests(long_run); 374 - ida_thread_tests(); 375 374 376 375 /* Free any remaining preallocated nodes */ 377 376 radix_tree_cpu_dead(0);
+1 -2
tools/testing/radix-tree/test.h
··· 39 39 void iteration_test(unsigned order, unsigned duration); 40 40 void benchmark(void); 41 41 void idr_checks(void); 42 - void ida_checks(void); 43 - void ida_thread_tests(void); 42 + void ida_tests(void); 44 43 45 44 struct item * 46 45 item_tag_set(struct radix_tree_root *root, unsigned long index, int tag);