2014-01-27 23:49:39 +04:00
/*
* Common functions for in - kernel torture tests .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , you can access it online at
* http : //www.gnu.org/licenses/gpl-2.0.html.
*
* Copyright ( C ) IBM Corporation , 2014
*
* Author : Paul E . McKenney < paulmck @ us . ibm . com >
* Based on kernel / rcu / torture . c .
*/
# include <linux/types.h>
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/module.h>
# include <linux/kthread.h>
# include <linux/err.h>
# include <linux/spinlock.h>
# include <linux/smp.h>
# include <linux/interrupt.h>
# include <linux/sched.h>
# include <linux/atomic.h>
# include <linux/bitops.h>
# include <linux/completion.h>
# include <linux/moduleparam.h>
# include <linux/percpu.h>
# include <linux/notifier.h>
# include <linux/reboot.h>
# include <linux/freezer.h>
# include <linux/cpu.h>
# include <linux/delay.h>
# include <linux/stat.h>
# include <linux/slab.h>
# include <linux/trace_clock.h>
# include <asm/byteorder.h>
# include <linux/torture.h>
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " Paul E. McKenney <paulmck@us.ibm.com> " ) ;
2014-01-29 19:40:27 +04:00
int fullstop = FULLSTOP_RMMOD ;
EXPORT_SYMBOL_GPL ( fullstop ) ;
DEFINE_MUTEX ( fullstop_mutex ) ;
EXPORT_SYMBOL_GPL ( fullstop_mutex ) ;
2014-01-27 23:49:39 +04:00
# define TORTURE_RANDOM_MULT 39916801 /* prime */
# define TORTURE_RANDOM_ADD 479001701 /* prime */
# define TORTURE_RANDOM_REFRESH 10000
/*
* Crude but fast random - number generator . Uses a linear congruential
* generator , with occasional help from cpu_clock ( ) .
*/
unsigned long
torture_random ( struct torture_random_state * trsp )
{
if ( - - trsp - > trs_count < 0 ) {
trsp - > trs_state + = ( unsigned long ) local_clock ( ) ;
trsp - > trs_count = TORTURE_RANDOM_REFRESH ;
}
trsp - > trs_state = trsp - > trs_state * TORTURE_RANDOM_MULT +
TORTURE_RANDOM_ADD ;
return swahw32 ( trsp - > trs_state ) ;
}
EXPORT_SYMBOL_GPL ( torture_random ) ;
2014-01-29 19:40:27 +04:00
/*
* Absorb kthreads into a kernel function that won ' t return , so that
* they won ' t ever access module text or data again .
*/
void torture_shutdown_absorb ( const char * title )
{
while ( ACCESS_ONCE ( fullstop ) = = FULLSTOP_SHUTDOWN ) {
pr_notice (
" torture thread %s parking due to system shutdown \n " ,
title ) ;
schedule_timeout_uninterruptible ( MAX_SCHEDULE_TIMEOUT ) ;
}
}
EXPORT_SYMBOL_GPL ( torture_shutdown_absorb ) ;