xref: /linux-6.15/kernel/backtracetest.c (revision 82a9d6bd)
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 Nossum static 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 Heo static 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 Heo static 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 Nossum static 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 Nossum static 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 Ven static 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 Ven static 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