| /* |
| * 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>"); |
| |
| #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); |