forked from mirrors/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>
This commit is contained in:
		
							parent
							
								
									31ff0ceeb2
								
							
						
					
					
						commit
						8ab8ba38d4
					
				
					 7 changed files with 71 additions and 7 deletions
				
			
		| 
						 | 
					@ -1827,6 +1827,9 @@ config TEST_HASH
 | 
				
			||||||
	  This is intended to help people writing architecture-specific
 | 
						  This is intended to help people writing architecture-specific
 | 
				
			||||||
	  optimized versions.  If unsure, say N.
 | 
						  optimized versions.  If unsure, say N.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					config TEST_IDA
 | 
				
			||||||
 | 
						tristate "Perform selftest on IDA functions"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config TEST_PARMAN
 | 
					config TEST_PARMAN
 | 
				
			||||||
	tristate "Perform selftest on priority array manager"
 | 
						tristate "Perform selftest on priority array manager"
 | 
				
			||||||
	default n
 | 
						default n
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,6 +50,7 @@ obj-$(CONFIG_TEST_BPF) += test_bpf.o
 | 
				
			||||||
obj-$(CONFIG_TEST_FIRMWARE) += test_firmware.o
 | 
					obj-$(CONFIG_TEST_FIRMWARE) += test_firmware.o
 | 
				
			||||||
obj-$(CONFIG_TEST_SYSCTL) += test_sysctl.o
 | 
					obj-$(CONFIG_TEST_SYSCTL) += test_sysctl.o
 | 
				
			||||||
obj-$(CONFIG_TEST_HASH) += test_hash.o test_siphash.o
 | 
					obj-$(CONFIG_TEST_HASH) += test_hash.o test_siphash.o
 | 
				
			||||||
 | 
					obj-$(CONFIG_TEST_IDA) += test_ida.o
 | 
				
			||||||
obj-$(CONFIG_TEST_KASAN) += test_kasan.o
 | 
					obj-$(CONFIG_TEST_KASAN) += test_kasan.o
 | 
				
			||||||
CFLAGS_test_kasan.o += -fno-builtin
 | 
					CFLAGS_test_kasan.o += -fno-builtin
 | 
				
			||||||
obj-$(CONFIG_TEST_UBSAN) += test_ubsan.o
 | 
					obj-$(CONFIG_TEST_UBSAN) += test_ubsan.o
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										45
									
								
								lib/test_ida.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								lib/test_ida.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,45 @@
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: GPL-2.0+
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * test_ida.c: Test the IDA API
 | 
				
			||||||
 | 
					 * Copyright (c) 2016-2018 Microsoft Corporation
 | 
				
			||||||
 | 
					 * Copyright (c) 2018 Oracle Corporation
 | 
				
			||||||
 | 
					 * Author: Matthew Wilcox <willy@infradead.org>
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <linux/idr.h>
 | 
				
			||||||
 | 
					#include <linux/module.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static unsigned int tests_run;
 | 
				
			||||||
 | 
					static unsigned int tests_passed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __KERNEL__
 | 
				
			||||||
 | 
					void ida_dump(struct ida *ida) { }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#define IDA_BUG_ON(ida, x) do {						\
 | 
				
			||||||
 | 
						tests_run++;							\
 | 
				
			||||||
 | 
						if (x) {							\
 | 
				
			||||||
 | 
							ida_dump(ida);						\
 | 
				
			||||||
 | 
							dump_stack();						\
 | 
				
			||||||
 | 
						} else {							\
 | 
				
			||||||
 | 
							tests_passed++;						\
 | 
				
			||||||
 | 
						}								\
 | 
				
			||||||
 | 
					} while (0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int ida_checks(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						DEFINE_IDA(ida);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						IDA_BUG_ON(&ida, !ida_is_empty(&ida));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						printk("IDA: %u of %u tests passed\n", tests_passed, tests_run);
 | 
				
			||||||
 | 
						return (tests_run != tests_passed) ? 0 : -EINVAL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void ida_exit(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module_init(ida_checks);
 | 
				
			||||||
 | 
					module_exit(ida_exit);
 | 
				
			||||||
 | 
					MODULE_AUTHOR("Matthew Wilcox <willy@infradead.org>");
 | 
				
			||||||
 | 
					MODULE_LICENSE("GPL");
 | 
				
			||||||
| 
						 | 
					@ -22,6 +22,7 @@ targets: generated/map-shift.h $(TARGETS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
main:	$(OFILES)
 | 
					main:	$(OFILES)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					idr-test.o: ../../../lib/test_ida.c
 | 
				
			||||||
idr-test: idr-test.o $(CORE_OFILES)
 | 
					idr-test: idr-test.o $(CORE_OFILES)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
multiorder: multiorder.o $(CORE_OFILES)
 | 
					multiorder: multiorder.o $(CORE_OFILES)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -309,6 +309,15 @@ void idr_checks(void)
 | 
				
			||||||
	idr_u32_test(0);
 | 
						idr_u32_test(0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define module_init(x)
 | 
				
			||||||
 | 
					#define module_exit(x)
 | 
				
			||||||
 | 
					#define MODULE_AUTHOR(x)
 | 
				
			||||||
 | 
					#define MODULE_LICENSE(x)
 | 
				
			||||||
 | 
					#define dump_stack()    assert(0)
 | 
				
			||||||
 | 
					void ida_dump(struct ida *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "../../../lib/test_ida.c"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Check that we get the correct error when we run out of memory doing
 | 
					 * Check that we get the correct error when we run out of memory doing
 | 
				
			||||||
 * allocations.  To ensure we run out of memory, just "forget" to preload.
 | 
					 * allocations.  To ensure we run out of memory, just "forget" to preload.
 | 
				
			||||||
| 
						 | 
					@ -488,7 +497,7 @@ void ida_simple_get_remove_test(void)
 | 
				
			||||||
	ida_destroy(&ida);
 | 
						ida_destroy(&ida);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ida_checks(void)
 | 
					void user_ida_checks(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	DEFINE_IDA(ida);
 | 
						DEFINE_IDA(ida);
 | 
				
			||||||
	int id;
 | 
						int id;
 | 
				
			||||||
| 
						 | 
					@ -582,12 +591,19 @@ void ida_thread_tests(void)
 | 
				
			||||||
		pthread_join(threads[i], NULL);
 | 
							pthread_join(threads[i], NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ida_tests(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						user_ida_checks();
 | 
				
			||||||
 | 
						ida_checks();
 | 
				
			||||||
 | 
						ida_exit();
 | 
				
			||||||
 | 
						ida_thread_tests();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int __weak main(void)
 | 
					int __weak main(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	radix_tree_init();
 | 
						radix_tree_init();
 | 
				
			||||||
	idr_checks();
 | 
						idr_checks();
 | 
				
			||||||
	ida_checks();
 | 
						ida_tests();
 | 
				
			||||||
	ida_thread_tests();
 | 
					 | 
				
			||||||
	radix_tree_cpu_dead(1);
 | 
						radix_tree_cpu_dead(1);
 | 
				
			||||||
	rcu_barrier();
 | 
						rcu_barrier();
 | 
				
			||||||
	if (nr_allocated)
 | 
						if (nr_allocated)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -324,7 +324,7 @@ static void single_thread_tests(bool long_run)
 | 
				
			||||||
	printv(2, "after dynamic_height_check: %d allocated, preempt %d\n",
 | 
						printv(2, "after dynamic_height_check: %d allocated, preempt %d\n",
 | 
				
			||||||
		nr_allocated, preempt_count);
 | 
							nr_allocated, preempt_count);
 | 
				
			||||||
	idr_checks();
 | 
						idr_checks();
 | 
				
			||||||
	ida_checks();
 | 
						ida_tests();
 | 
				
			||||||
	rcu_barrier();
 | 
						rcu_barrier();
 | 
				
			||||||
	printv(2, "after idr_checks: %d allocated, preempt %d\n",
 | 
						printv(2, "after idr_checks: %d allocated, preempt %d\n",
 | 
				
			||||||
		nr_allocated, preempt_count);
 | 
							nr_allocated, preempt_count);
 | 
				
			||||||
| 
						 | 
					@ -371,7 +371,6 @@ int main(int argc, char **argv)
 | 
				
			||||||
	iteration_test(0, 10 + 90 * long_run);
 | 
						iteration_test(0, 10 + 90 * long_run);
 | 
				
			||||||
	iteration_test(7, 10 + 90 * long_run);
 | 
						iteration_test(7, 10 + 90 * long_run);
 | 
				
			||||||
	single_thread_tests(long_run);
 | 
						single_thread_tests(long_run);
 | 
				
			||||||
	ida_thread_tests();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Free any remaining preallocated nodes */
 | 
						/* Free any remaining preallocated nodes */
 | 
				
			||||||
	radix_tree_cpu_dead(0);
 | 
						radix_tree_cpu_dead(0);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,8 +39,7 @@ void multiorder_checks(void);
 | 
				
			||||||
void iteration_test(unsigned order, unsigned duration);
 | 
					void iteration_test(unsigned order, unsigned duration);
 | 
				
			||||||
void benchmark(void);
 | 
					void benchmark(void);
 | 
				
			||||||
void idr_checks(void);
 | 
					void idr_checks(void);
 | 
				
			||||||
void ida_checks(void);
 | 
					void ida_tests(void);
 | 
				
			||||||
void ida_thread_tests(void);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct item *
 | 
					struct item *
 | 
				
			||||||
item_tag_set(struct radix_tree_root *root, unsigned long index, int tag);
 | 
					item_tag_set(struct radix_tree_root *root, unsigned long index, int tag);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue