2019-06-01 11:08:55 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2008-01-30 15:33:08 +03:00
/*
* Simple stack backtrace regression test module
*
* ( C ) Copyright 2008 Intel Corporation
* Author : Arjan van de Ven < arjan @ linux . intel . com >
*/
2008-06-27 20:06:54 +04:00
# include <linux/completion.h>
2008-06-27 20:04:48 +04:00
# include <linux/delay.h>
2008-06-27 20:06:54 +04:00
# include <linux/interrupt.h>
2008-01-30 15:33:08 +03:00
# include <linux/module.h>
# include <linux/sched.h>
2008-06-27 20:04:48 +04:00
# include <linux/stacktrace.h>
2008-01-30 15:33:08 +03:00
2008-06-27 20:06:54 +04:00
static void backtrace_test_normal ( void )
{
2014-06-05 03:11:18 +04:00
pr_info ( " Testing a backtrace from process context. \n " ) ;
pr_info ( " The following trace is a kernel self test and not a bug! \n " ) ;
2008-06-27 20:06:54 +04:00
dump_stack ( ) ;
}
2024-02-05 00:34:28 +03:00
static void backtrace_test_bh_workfn ( struct work_struct * work )
2008-06-27 20:06:54 +04:00
{
dump_stack ( ) ;
}
2024-02-05 00:34:28 +03:00
static DECLARE_WORK ( backtrace_bh_work , & backtrace_test_bh_workfn ) ;
2008-01-30 15:33:08 +03:00
2024-02-05 00:34:28 +03:00
static void backtrace_test_bh ( void )
2008-01-30 15:33:08 +03:00
{
2024-02-05 00:34:28 +03:00
pr_info ( " Testing a backtrace from BH context. \n " ) ;
2014-06-05 03:11:18 +04:00
pr_info ( " The following trace is a kernel self test and not a bug! \n " ) ;
2008-06-27 20:06:54 +04:00
2024-02-05 00:34:28 +03:00
queue_work ( system_bh_wq , & backtrace_bh_work ) ;
flush_work ( & backtrace_bh_work ) ;
2008-01-30 15:33:08 +03:00
}
2008-06-27 20:04:48 +04:00
# ifdef CONFIG_STACKTRACE
static void backtrace_test_saved ( void )
{
unsigned long entries [ 8 ] ;
2019-04-25 12:44:57 +03:00
unsigned int nr_entries ;
2008-06-27 20:04:48 +04:00
2014-06-05 03:11:18 +04:00
pr_info ( " Testing a saved backtrace. \n " ) ;
pr_info ( " The following trace is a kernel self test and not a bug! \n " ) ;
2008-06-27 20:04:48 +04:00
2019-04-25 12:44:57 +03:00
nr_entries = stack_trace_save ( entries , ARRAY_SIZE ( entries ) , 0 ) ;
stack_trace_print ( entries , nr_entries , 0 ) ;
2008-06-27 20:04:48 +04:00
}
# else
static void backtrace_test_saved ( void )
{
2014-06-05 03:11:18 +04:00
pr_info ( " Saved backtrace test skipped. \n " ) ;
2008-06-27 20:04:48 +04:00
}
# endif
2008-01-30 15:33:08 +03:00
static int backtrace_regression_test ( void )
{
2014-06-05 03:11:18 +04:00
pr_info ( " ====[ backtrace testing ]=========== \n " ) ;
2008-01-30 15:33:08 +03:00
2008-06-27 20:06:54 +04:00
backtrace_test_normal ( ) ;
2024-02-05 00:34:28 +03:00
backtrace_test_bh ( ) ;
2008-06-27 20:04:48 +04:00
backtrace_test_saved ( ) ;
2014-06-05 03:11:18 +04:00
pr_info ( " ====[ end of backtrace testing ]==== \n " ) ;
2008-01-30 15:33:08 +03:00
return 0 ;
}
static void exitf ( void )
{
}
module_init ( backtrace_regression_test ) ;
module_exit ( exitf ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " Arjan van de Ven <arjan@linux.intel.com> " ) ;