Merge branch 'topic/tasklet-convert' into for-linus
[linux-block.git] / include / linux / torture.h
CommitLineData
082dfb3c 1/* SPDX-License-Identifier: GPL-2.0+ */
51b1130e
PM
2/*
3 * Common functions for in-kernel torture tests.
4 *
51b1130e
PM
5 * Copyright IBM Corporation, 2014
6 *
082dfb3c 7 * Author: Paul E. McKenney <paulmck@linux.ibm.com>
51b1130e
PM
8 */
9
10#ifndef __LINUX_TORTURE_H
11#define __LINUX_TORTURE_H
12
13#include <linux/types.h>
14#include <linux/cache.h>
15#include <linux/spinlock.h>
16#include <linux/threads.h>
17#include <linux/cpumask.h>
18#include <linux/seqlock.h>
19#include <linux/lockdep.h>
20#include <linux/completion.h>
21#include <linux/debugobjects.h>
22#include <linux/bug.h>
23#include <linux/compiler.h>
24
9e250225
PM
25/* Definitions for a non-string torture-test module parameter. */
26#define torture_param(type, name, init, msg) \
27 static type name = init; \
28 module_param(name, type, 0444); \
29 MODULE_PARM_DESC(name, msg);
30
c2884de3
PM
31#define TORTURE_FLAG "-torture:"
32#define TOROUT_STRING(s) \
489bb3d2 33 pr_alert("%s" TORTURE_FLAG " %s\n", torture_type, s)
c2884de3 34#define VERBOSE_TOROUT_STRING(s) \
7fafaac5 35 do { if (verbose) pr_alert("%s" TORTURE_FLAG " %s\n", torture_type, s); } while (0)
c2884de3 36#define VERBOSE_TOROUT_ERRSTRING(s) \
47cf29b9 37 do { if (verbose) pr_alert("%s" TORTURE_FLAG "!!! %s\n", torture_type, s); } while (0)
c2884de3 38
2e9e8081 39/* Definitions for online/offline exerciser. */
3a6cb58f 40typedef void torture_ofl_func(void);
d95f5ba9
PM
41bool torture_offline(int cpu, long *n_onl_attempts, long *n_onl_successes,
42 unsigned long *sum_offl, int *min_onl, int *max_onl);
43bool torture_online(int cpu, long *n_onl_attempts, long *n_onl_successes,
44 unsigned long *sum_onl, int *min_onl, int *max_onl);
3a6cb58f 45int torture_onoff_init(long ooholdoff, long oointerval, torture_ofl_func *f);
eea203fe 46void torture_onoff_stats(void);
2e9e8081
PM
47bool torture_onoff_failures(void);
48
9e250225 49/* Low-rider random number generator. */
51b1130e
PM
50struct torture_random_state {
51 unsigned long trs_state;
52 long trs_count;
53};
51b1130e 54#define DEFINE_TORTURE_RANDOM(name) struct torture_random_state name = { 0, 0 }
3025520e
PM
55#define DEFINE_TORTURE_RANDOM_PERCPU(name) \
56 DEFINE_PER_CPU(struct torture_random_state, name)
51b1130e 57unsigned long torture_random(struct torture_random_state *trsp);
4a5f133c
PM
58static inline void torture_random_init(struct torture_random_state *trsp)
59{
60 trsp->trs_state = 0;
61 trsp->trs_count = 0;
62}
51b1130e 63
3808dc9f
PM
64/* Task shuffler, which causes CPUs to occasionally go idle. */
65void torture_shuffle_task_register(struct task_struct *tp);
66int torture_shuffle_init(long shuffint);
3808dc9f 67
e991dbc0 68/* Test auto-shutdown handling. */
f67a3356 69void torture_shutdown_absorb(const char *title);
e991dbc0 70int torture_shutdown_init(int ssecs, void (*cleanup)(void));
f67a3356 71
628edaa5 72/* Task stuttering, which forces load/no-load transitions. */
474e59b4 73bool stutter_wait(const char *title);
ff3bf92d 74int torture_stutter_init(int s, int sgap);
628edaa5 75
b5daa8f3 76/* Initialization and cleanup. */
90127d60 77bool torture_init_begin(char *ttype, int v);
b5daa8f3 78void torture_init_end(void);
d36a7a0d
DB
79bool torture_cleanup_begin(void);
80void torture_cleanup_end(void);
36970bb9
PM
81bool torture_must_stop(void);
82bool torture_must_stop_irq(void);
7fafaac5 83void torture_kthread_stopping(char *title);
47cf29b9
PM
84int _torture_create_kthread(int (*fn)(void *arg), void *arg, char *s, char *m,
85 char *f, struct task_struct **tp);
9c029b86 86void _torture_stop_kthread(char *m, struct task_struct **tp);
47cf29b9
PM
87
88#define torture_create_kthread(n, arg, tp) \
89 _torture_create_kthread(n, (arg), #n, "Creating " #n " task", \
90 "Failed to create " #n, &(tp))
9c029b86
PM
91#define torture_stop_kthread(n, tp) \
92 _torture_stop_kthread("Stopping " #n " task", &(tp))
b5daa8f3 93
01b1d88b 94#ifdef CONFIG_PREEMPTION
cc1321c9
PM
95#define torture_preempt_schedule() preempt_schedule()
96#else
be44ae62 97#define torture_preempt_schedule() do { } while (0)
cc1321c9
PM
98#endif
99
51b1130e 100#endif /* __LINUX_TORTURE_H */