1 // SPDX-License-Identifier: GPL-2.0-only 1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 2 /* 3 * Simple stack backtrace regression test modu 3 * Simple stack backtrace regression test module 4 * 4 * 5 * (C) Copyright 2008 Intel Corporation 5 * (C) Copyright 2008 Intel Corporation 6 * Author: Arjan van de Ven <arjan@linux.intel 6 * Author: Arjan van de Ven <arjan@linux.intel.com> 7 */ 7 */ 8 8 9 #include <linux/completion.h> 9 #include <linux/completion.h> 10 #include <linux/delay.h> 10 #include <linux/delay.h> 11 #include <linux/interrupt.h> 11 #include <linux/interrupt.h> 12 #include <linux/module.h> 12 #include <linux/module.h> 13 #include <linux/sched.h> 13 #include <linux/sched.h> 14 #include <linux/stacktrace.h> 14 #include <linux/stacktrace.h> 15 15 16 static void backtrace_test_normal(void) 16 static void backtrace_test_normal(void) 17 { 17 { 18 pr_info("Testing a backtrace from proc 18 pr_info("Testing a backtrace from process context.\n"); 19 pr_info("The following trace is a kern 19 pr_info("The following trace is a kernel self test and not a bug!\n"); 20 20 21 dump_stack(); 21 dump_stack(); 22 } 22 } 23 23 24 static void backtrace_test_bh_workfn(struct wo !! 24 static DECLARE_COMPLETION(backtrace_work); >> 25 >> 26 static void backtrace_test_irq_callback(unsigned long data) 25 { 27 { 26 dump_stack(); 28 dump_stack(); >> 29 complete(&backtrace_work); 27 } 30 } 28 31 29 static DECLARE_WORK(backtrace_bh_work, &backtr !! 32 static DECLARE_TASKLET_OLD(backtrace_tasklet, &backtrace_test_irq_callback); 30 33 31 static void backtrace_test_bh(void) !! 34 static void backtrace_test_irq(void) 32 { 35 { 33 pr_info("Testing a backtrace from BH c !! 36 pr_info("Testing a backtrace from irq context.\n"); 34 pr_info("The following trace is a kern 37 pr_info("The following trace is a kernel self test and not a bug!\n"); 35 38 36 queue_work(system_bh_wq, &backtrace_bh !! 39 init_completion(&backtrace_work); 37 flush_work(&backtrace_bh_work); !! 40 tasklet_schedule(&backtrace_tasklet); >> 41 wait_for_completion(&backtrace_work); 38 } 42 } 39 43 40 #ifdef CONFIG_STACKTRACE 44 #ifdef CONFIG_STACKTRACE 41 static void backtrace_test_saved(void) 45 static void backtrace_test_saved(void) 42 { 46 { 43 unsigned long entries[8]; 47 unsigned long entries[8]; 44 unsigned int nr_entries; 48 unsigned int nr_entries; 45 49 46 pr_info("Testing a saved backtrace.\n" 50 pr_info("Testing a saved backtrace.\n"); 47 pr_info("The following trace is a kern 51 pr_info("The following trace is a kernel self test and not a bug!\n"); 48 52 49 nr_entries = stack_trace_save(entries, 53 nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 0); 50 stack_trace_print(entries, nr_entries, 54 stack_trace_print(entries, nr_entries, 0); 51 } 55 } 52 #else 56 #else 53 static void backtrace_test_saved(void) 57 static void backtrace_test_saved(void) 54 { 58 { 55 pr_info("Saved backtrace test skipped. 59 pr_info("Saved backtrace test skipped.\n"); 56 } 60 } 57 #endif 61 #endif 58 62 59 static int backtrace_regression_test(void) 63 static int backtrace_regression_test(void) 60 { 64 { 61 pr_info("====[ backtrace testing ]==== 65 pr_info("====[ backtrace testing ]===========\n"); 62 66 63 backtrace_test_normal(); 67 backtrace_test_normal(); 64 backtrace_test_bh(); !! 68 backtrace_test_irq(); 65 backtrace_test_saved(); 69 backtrace_test_saved(); 66 70 67 pr_info("====[ end of backtrace testin 71 pr_info("====[ end of backtrace testing ]====\n"); 68 return 0; 72 return 0; 69 } 73 } 70 74 71 static void exitf(void) 75 static void exitf(void) 72 { 76 { 73 } 77 } 74 78 75 module_init(backtrace_regression_test); 79 module_init(backtrace_regression_test); 76 module_exit(exitf); 80 module_exit(exitf); 77 MODULE_DESCRIPTION("Simple stack backtrace reg << 78 MODULE_LICENSE("GPL"); 81 MODULE_LICENSE("GPL"); 79 MODULE_AUTHOR("Arjan van de Ven <arjan@linux.i 82 MODULE_AUTHOR("Arjan van de Ven <arjan@linux.intel.com>"); 80 83
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.