1b886d83cSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 26dab2778SArjan van de Ven /* 36dab2778SArjan van de Ven * Simple stack backtrace regression test module 46dab2778SArjan van de Ven * 56dab2778SArjan van de Ven * (C) Copyright 2008 Intel Corporation 66dab2778SArjan van de Ven * Author: Arjan van de Ven <[email protected]> 76dab2778SArjan van de Ven */ 86dab2778SArjan van de Ven 94e6a0535SVegard Nossum #include <linux/completion.h> 10ad118c54SVegard Nossum #include <linux/delay.h> 114e6a0535SVegard Nossum #include <linux/interrupt.h> 126dab2778SArjan van de Ven #include <linux/module.h> 136dab2778SArjan van de Ven #include <linux/sched.h> 14ad118c54SVegard Nossum #include <linux/stacktrace.h> 156dab2778SArjan van de Ven backtrace_test_normal(void)164e6a0535SVegard Nossumstatic void backtrace_test_normal(void) 174e6a0535SVegard Nossum { 18462b29b8SFabian Frederick pr_info("Testing a backtrace from process context.\n"); 19462b29b8SFabian Frederick pr_info("The following trace is a kernel self test and not a bug!\n"); 206dab2778SArjan van de Ven 214e6a0535SVegard Nossum dump_stack(); 224e6a0535SVegard Nossum } 234e6a0535SVegard Nossum backtrace_test_bh_workfn(struct work_struct * work)247245d24fSTejun Heostatic void backtrace_test_bh_workfn(struct work_struct *work) 254e6a0535SVegard Nossum { 264e6a0535SVegard Nossum dump_stack(); 274e6a0535SVegard Nossum } 284e6a0535SVegard Nossum 297245d24fSTejun Heo static DECLARE_WORK(backtrace_bh_work, &backtrace_test_bh_workfn); 304e6a0535SVegard Nossum backtrace_test_bh(void)317245d24fSTejun Heostatic void backtrace_test_bh(void) 326dab2778SArjan van de Ven { 337245d24fSTejun Heo pr_info("Testing a backtrace from BH context.\n"); 34462b29b8SFabian Frederick pr_info("The following trace is a kernel self test and not a bug!\n"); 354e6a0535SVegard Nossum 367245d24fSTejun Heo queue_work(system_bh_wq, &backtrace_bh_work); 377245d24fSTejun Heo flush_work(&backtrace_bh_work); 386dab2778SArjan van de Ven } 39ad118c54SVegard Nossum 40ad118c54SVegard Nossum #ifdef CONFIG_STACKTRACE backtrace_test_saved(void)41ad118c54SVegard Nossumstatic void backtrace_test_saved(void) 42ad118c54SVegard Nossum { 43ad118c54SVegard Nossum unsigned long entries[8]; 441b59562dSThomas Gleixner unsigned int nr_entries; 45ad118c54SVegard Nossum 46462b29b8SFabian Frederick pr_info("Testing a saved backtrace.\n"); 47462b29b8SFabian Frederick pr_info("The following trace is a kernel self test and not a bug!\n"); 48ad118c54SVegard Nossum 491b59562dSThomas Gleixner nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 0); 501b59562dSThomas Gleixner stack_trace_print(entries, nr_entries, 0); 51ad118c54SVegard Nossum } 52ad118c54SVegard Nossum #else backtrace_test_saved(void)53ad118c54SVegard Nossumstatic void backtrace_test_saved(void) 54ad118c54SVegard Nossum { 55462b29b8SFabian Frederick pr_info("Saved backtrace test skipped.\n"); 56ad118c54SVegard Nossum } 57ad118c54SVegard Nossum #endif 58ad118c54SVegard Nossum backtrace_regression_test(void)596dab2778SArjan van de Venstatic int backtrace_regression_test(void) 606dab2778SArjan van de Ven { 61462b29b8SFabian Frederick pr_info("====[ backtrace testing ]===========\n"); 626dab2778SArjan van de Ven 634e6a0535SVegard Nossum backtrace_test_normal(); 647245d24fSTejun Heo backtrace_test_bh(); 65ad118c54SVegard Nossum backtrace_test_saved(); 66ad118c54SVegard Nossum 67462b29b8SFabian Frederick pr_info("====[ end of backtrace testing ]====\n"); 686dab2778SArjan van de Ven return 0; 696dab2778SArjan van de Ven } 706dab2778SArjan van de Ven exitf(void)716dab2778SArjan van de Venstatic void exitf(void) 726dab2778SArjan van de Ven { 736dab2778SArjan van de Ven } 746dab2778SArjan van de Ven 756dab2778SArjan van de Ven module_init(backtrace_regression_test); 766dab2778SArjan van de Ven module_exit(exitf); 77*82a9d6bdSJeff Johnson MODULE_DESCRIPTION("Simple stack backtrace regression test module"); 786dab2778SArjan van de Ven MODULE_LICENSE("GPL"); 796dab2778SArjan van de Ven MODULE_AUTHOR("Arjan van de Ven <[email protected]>"); 80