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
 | 
			
		||||
	  optimized versions.  If unsure, say N.
 | 
			
		||||
 | 
			
		||||
config TEST_IDA
 | 
			
		||||
	tristate "Perform selftest on IDA functions"
 | 
			
		||||
 | 
			
		||||
config TEST_PARMAN
 | 
			
		||||
	tristate "Perform selftest on priority array manager"
 | 
			
		||||
	default n
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,6 +50,7 @@ obj-$(CONFIG_TEST_BPF) += test_bpf.o
 | 
			
		|||
obj-$(CONFIG_TEST_FIRMWARE) += test_firmware.o
 | 
			
		||||
obj-$(CONFIG_TEST_SYSCTL) += test_sysctl.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
 | 
			
		||||
CFLAGS_test_kasan.o += -fno-builtin
 | 
			
		||||
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)
 | 
			
		||||
 | 
			
		||||
idr-test.o: ../../../lib/test_ida.c
 | 
			
		||||
idr-test: idr-test.o $(CORE_OFILES)
 | 
			
		||||
 | 
			
		||||
multiorder: multiorder.o $(CORE_OFILES)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -309,6 +309,15 @@ void idr_checks(void)
 | 
			
		|||
	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
 | 
			
		||||
 * 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ida_checks(void)
 | 
			
		||||
void user_ida_checks(void)
 | 
			
		||||
{
 | 
			
		||||
	DEFINE_IDA(ida);
 | 
			
		||||
	int id;
 | 
			
		||||
| 
						 | 
				
			
			@ -582,12 +591,19 @@ void ida_thread_tests(void)
 | 
			
		|||
		pthread_join(threads[i], NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ida_tests(void)
 | 
			
		||||
{
 | 
			
		||||
	user_ida_checks();
 | 
			
		||||
	ida_checks();
 | 
			
		||||
	ida_exit();
 | 
			
		||||
	ida_thread_tests();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int __weak main(void)
 | 
			
		||||
{
 | 
			
		||||
	radix_tree_init();
 | 
			
		||||
	idr_checks();
 | 
			
		||||
	ida_checks();
 | 
			
		||||
	ida_thread_tests();
 | 
			
		||||
	ida_tests();
 | 
			
		||||
	radix_tree_cpu_dead(1);
 | 
			
		||||
	rcu_barrier();
 | 
			
		||||
	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",
 | 
			
		||||
		nr_allocated, preempt_count);
 | 
			
		||||
	idr_checks();
 | 
			
		||||
	ida_checks();
 | 
			
		||||
	ida_tests();
 | 
			
		||||
	rcu_barrier();
 | 
			
		||||
	printv(2, "after idr_checks: %d allocated, preempt %d\n",
 | 
			
		||||
		nr_allocated, preempt_count);
 | 
			
		||||
| 
						 | 
				
			
			@ -371,7 +371,6 @@ int main(int argc, char **argv)
 | 
			
		|||
	iteration_test(0, 10 + 90 * long_run);
 | 
			
		||||
	iteration_test(7, 10 + 90 * long_run);
 | 
			
		||||
	single_thread_tests(long_run);
 | 
			
		||||
	ida_thread_tests();
 | 
			
		||||
 | 
			
		||||
	/* Free any remaining preallocated nodes */
 | 
			
		||||
	radix_tree_cpu_dead(0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,8 +39,7 @@ void multiorder_checks(void);
 | 
			
		|||
void iteration_test(unsigned order, unsigned duration);
 | 
			
		||||
void benchmark(void);
 | 
			
		||||
void idr_checks(void);
 | 
			
		||||
void ida_checks(void);
 | 
			
		||||
void ida_thread_tests(void);
 | 
			
		||||
void ida_tests(void);
 | 
			
		||||
 | 
			
		||||
struct item *
 | 
			
		||||
item_tag_set(struct radix_tree_root *root, unsigned long index, int tag);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue