1cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
2cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * lib/locking-selftest.c
3cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar *
4cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Testsuite for various locking APIs: spinlocks, rwlocks,
5cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * mutexes and rw-semaphores.
6cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar *
7cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * It is checking both false positives and false negatives.
8cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar *
9cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Started by Ingo Molnar:
10cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar *
11cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar *  Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
12cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
13cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include <linux/rwsem.h>
14cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include <linux/mutex.h>
151b375dc30710180c4b88cc59caba6e3481ec5c8bMaarten Lankhorst#include <linux/ww_mutex.h>
16cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include <linux/sched.h>
17cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include <linux/delay.h>
18fbb9ce9530fd9b66096d5187fa6a115d16d9746cIngo Molnar#include <linux/lockdep.h>
19cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include <linux/spinlock.h>
20cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include <linux/kallsyms.h>
21cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include <linux/interrupt.h>
22cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include <linux/debug_locks.h>
23cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include <linux/irqflags.h>
24cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
25cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
26cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Change this to 1 if you want to see the failure printouts:
27cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
28cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic unsigned int debug_locks_verbose;
29cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
301de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic DEFINE_WW_CLASS(ww_lockdep);
311de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
32cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic int __init setup_debug_locks_verbose(char *str)
33cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar{
34cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	get_option(&str, &debug_locks_verbose);
35cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
36cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	return 1;
37cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar}
38cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
39cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar__setup("debug_locks_verbose=", setup_debug_locks_verbose);
40cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
41cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define FAILURE		0
42cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define SUCCESS		1
43cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
44cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define LOCKTYPE_SPIN	0x1
45cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define LOCKTYPE_RWLOCK	0x2
46cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define LOCKTYPE_MUTEX	0x4
47cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define LOCKTYPE_RWSEM	0x8
481de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#define LOCKTYPE_WW	0x10
491de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
501de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic struct ww_acquire_ctx t, t2;
51f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorststatic struct ww_mutex o, o2, o3;
52cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
53cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
54cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Normal standalone locks, for the circular and irq-context
55cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * dependency tests:
56cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
579fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhangstatic DEFINE_RAW_SPINLOCK(lock_A);
589fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhangstatic DEFINE_RAW_SPINLOCK(lock_B);
599fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhangstatic DEFINE_RAW_SPINLOCK(lock_C);
609fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhangstatic DEFINE_RAW_SPINLOCK(lock_D);
61cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
62cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_RWLOCK(rwlock_A);
63cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_RWLOCK(rwlock_B);
64cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_RWLOCK(rwlock_C);
65cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_RWLOCK(rwlock_D);
66cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
67cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_MUTEX(mutex_A);
68cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_MUTEX(mutex_B);
69cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_MUTEX(mutex_C);
70cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_MUTEX(mutex_D);
71cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
72cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DECLARE_RWSEM(rwsem_A);
73cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DECLARE_RWSEM(rwsem_B);
74cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DECLARE_RWSEM(rwsem_C);
75cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DECLARE_RWSEM(rwsem_D);
76cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
77cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
78cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Locks that we initialize dynamically as well so that
79cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * e.g. X1 and X2 becomes two instances of the same class,
80cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * but X* and Y* are different classes. We do this so that
81cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * we do not trigger a real lockup:
82cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
839fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhangstatic DEFINE_RAW_SPINLOCK(lock_X1);
849fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhangstatic DEFINE_RAW_SPINLOCK(lock_X2);
859fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhangstatic DEFINE_RAW_SPINLOCK(lock_Y1);
869fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhangstatic DEFINE_RAW_SPINLOCK(lock_Y2);
879fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhangstatic DEFINE_RAW_SPINLOCK(lock_Z1);
889fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhangstatic DEFINE_RAW_SPINLOCK(lock_Z2);
89cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
90cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_RWLOCK(rwlock_X1);
91cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_RWLOCK(rwlock_X2);
92cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_RWLOCK(rwlock_Y1);
93cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_RWLOCK(rwlock_Y2);
94cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_RWLOCK(rwlock_Z1);
95cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_RWLOCK(rwlock_Z2);
96cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
97cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_MUTEX(mutex_X1);
98cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_MUTEX(mutex_X2);
99cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_MUTEX(mutex_Y1);
100cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_MUTEX(mutex_Y2);
101cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_MUTEX(mutex_Z1);
102cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DEFINE_MUTEX(mutex_Z2);
103cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
104cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DECLARE_RWSEM(rwsem_X1);
105cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DECLARE_RWSEM(rwsem_X2);
106cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DECLARE_RWSEM(rwsem_Y1);
107cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DECLARE_RWSEM(rwsem_Y2);
108cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DECLARE_RWSEM(rwsem_Z1);
109cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic DECLARE_RWSEM(rwsem_Z2);
110cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
111cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
112cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * non-inlined runtime initializers, to let separate locks share
113cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * the same lock-class:
114cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
115cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define INIT_CLASS_FUNC(class) 				\
116cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic noinline void					\
1179fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhanginit_class_##class(raw_spinlock_t *lock, rwlock_t *rwlock, \
1189fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhang	struct mutex *mutex, struct rw_semaphore *rwsem)\
119cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar{							\
1209fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhang	raw_spin_lock_init(lock);			\
121cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	rwlock_init(rwlock);				\
122cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	mutex_init(mutex);				\
123cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	init_rwsem(rwsem);				\
124cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar}
125cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
126cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarINIT_CLASS_FUNC(X)
127cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarINIT_CLASS_FUNC(Y)
128cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarINIT_CLASS_FUNC(Z)
129cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
130cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void init_shared_classes(void)
131cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar{
132cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	init_class_X(&lock_X1, &rwlock_X1, &mutex_X1, &rwsem_X1);
133cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	init_class_X(&lock_X2, &rwlock_X2, &mutex_X2, &rwsem_X2);
134cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
135cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	init_class_Y(&lock_Y1, &rwlock_Y1, &mutex_Y1, &rwsem_Y1);
136cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	init_class_Y(&lock_Y2, &rwlock_Y2, &mutex_Y2, &rwsem_Y2);
137cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
138cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	init_class_Z(&lock_Z1, &rwlock_Z1, &mutex_Z1, &rwsem_Z1);
139cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	init_class_Z(&lock_Z2, &rwlock_Z2, &mutex_Z2, &rwsem_Z2);
140cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar}
141cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
142cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
143cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * For spinlocks and rwlocks we also do hardirq-safe / softirq-safe tests.
144cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * The following functions use a lock from a simulated hardirq/softirq
145cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * context, causing the locks to be marked as hardirq-safe/softirq-safe:
146cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
147cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
148cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define HARDIRQ_DISABLE		local_irq_disable
149cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define HARDIRQ_ENABLE		local_irq_enable
150cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
151cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define HARDIRQ_ENTER()				\
152cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	local_irq_disable();			\
153ba9f207c9f82115aba4ce04b22e0081af0ae300fFrederic Weisbecker	__irq_enter();				\
154cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	WARN_ON(!in_irq());
155cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
156cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define HARDIRQ_EXIT()				\
157cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	__irq_exit();				\
158cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	local_irq_enable();
159cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
160cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define SOFTIRQ_DISABLE		local_bh_disable
161cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define SOFTIRQ_ENABLE		local_bh_enable
162cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
163cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define SOFTIRQ_ENTER()				\
164cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		local_bh_disable();		\
165cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		local_irq_disable();		\
166d820ac4c2fa881079e6b689d2098adce337558aeIngo Molnar		lockdep_softirq_enter();	\
167cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		WARN_ON(!in_softirq());
168cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
169cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define SOFTIRQ_EXIT()				\
170d820ac4c2fa881079e6b689d2098adce337558aeIngo Molnar		lockdep_softirq_exit();		\
171cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		local_irq_enable();		\
172cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		local_bh_enable();
173cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
174cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
175cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Shortcuts for lock/unlock API variants, to keep
176cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * the testcases compact:
177cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
1789fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhang#define L(x)			raw_spin_lock(&lock_##x)
1799fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhang#define U(x)			raw_spin_unlock(&lock_##x)
180cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define LU(x)			L(x); U(x)
1819fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhang#define SI(x)			raw_spin_lock_init(&lock_##x)
182cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
183cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define WL(x)			write_lock(&rwlock_##x)
184cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define WU(x)			write_unlock(&rwlock_##x)
185cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define WLU(x)			WL(x); WU(x)
186cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
187cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define RL(x)			read_lock(&rwlock_##x)
188cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define RU(x)			read_unlock(&rwlock_##x)
189cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define RLU(x)			RL(x); RU(x)
190cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define RWI(x)			rwlock_init(&rwlock_##x)
191cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
192cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define ML(x)			mutex_lock(&mutex_##x)
193cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define MU(x)			mutex_unlock(&mutex_##x)
194cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define MI(x)			mutex_init(&mutex_##x)
195cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
196cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define WSL(x)			down_write(&rwsem_##x)
197cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define WSU(x)			up_write(&rwsem_##x)
198cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
199cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define RSL(x)			down_read(&rwsem_##x)
200cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define RSU(x)			up_read(&rwsem_##x)
201cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define RWSI(x)			init_rwsem(&rwsem_##x)
202cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
2031de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#ifndef CONFIG_DEBUG_WW_MUTEX_SLOWPATH
2041de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#define WWAI(x)			ww_acquire_init(x, &ww_lockdep)
2051de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#else
2061de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#define WWAI(x)			do { ww_acquire_init(x, &ww_lockdep); (x)->deadlock_inject_countdown = ~0U; } while (0)
2071de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#endif
2081de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#define WWAD(x)			ww_acquire_done(x)
2091de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#define WWAF(x)			ww_acquire_fini(x)
2101de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
2111de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#define WWL(x, c)		ww_mutex_lock(x, c)
2121de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#define WWT(x)			ww_mutex_trylock(x)
2131de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#define WWL1(x)			ww_mutex_lock(x, NULL)
2141de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#define WWU(x)			ww_mutex_unlock(x)
2151de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
2161de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
217cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define LOCK_UNLOCK_2(x,y)	LOCK(x); LOCK(y); UNLOCK(y); UNLOCK(x)
218cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
219cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
220cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Generate different permutations of the same testcase, using
221cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * the same basic lock-dependency/state events:
222cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
223cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
224cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define GENERATE_TESTCASE(name)			\
225cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar						\
226cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void name(void) { E(); }
227cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
228cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define GENERATE_PERMUTATIONS_2_EVENTS(name)	\
229cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar						\
230cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void name##_12(void) { E1(); E2(); }	\
231cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void name##_21(void) { E2(); E1(); }
232cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
233cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define GENERATE_PERMUTATIONS_3_EVENTS(name)		\
234cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar							\
235cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void name##_123(void) { E1(); E2(); E3(); }	\
236cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void name##_132(void) { E1(); E3(); E2(); }	\
237cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void name##_213(void) { E2(); E1(); E3(); }	\
238cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void name##_231(void) { E2(); E3(); E1(); }	\
239cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void name##_312(void) { E3(); E1(); E2(); }	\
240cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void name##_321(void) { E3(); E2(); E1(); }
241cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
242cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
243cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * AA deadlock:
244cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
245cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
246cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E()					\
247cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar						\
248cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(X1);				\
249cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(X2); /* this one should fail */
250cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
251cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
252cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * 6 testcases:
253cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
254cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin.h"
255cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(AA_spin)
256cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock.h"
257cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(AA_wlock)
258cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock.h"
259cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(AA_rlock)
260cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-mutex.h"
261cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(AA_mutex)
262cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wsem.h"
263cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(AA_wsem)
264cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rsem.h"
265cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(AA_rsem)
266cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
267cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E
268cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
269cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
270cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Special-case for read-locking, they are
2716c9076ec9cd448f43bbda871352a7067f456ee26Ingo Molnar * allowed to recurse on the same lock class:
272cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
273cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void rlock_AA1(void)
274cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar{
275cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RL(X1);
276cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RL(X1); // this one should NOT fail
277cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar}
278cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
279cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void rlock_AA1B(void)
280cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar{
281cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RL(X1);
2826c9076ec9cd448f43bbda871352a7067f456ee26Ingo Molnar	RL(X2); // this one should NOT fail
283cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar}
284cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
285cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void rsem_AA1(void)
286cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar{
287cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RSL(X1);
288cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RSL(X1); // this one should fail
289cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar}
290cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
291cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void rsem_AA1B(void)
292cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar{
293cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RSL(X1);
294cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RSL(X2); // this one should fail
295cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar}
296cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
297cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * The mixing of read and write locks is not allowed:
298cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
299cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void rlock_AA2(void)
300cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar{
301cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RL(X1);
302cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	WL(X2); // this one should fail
303cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar}
304cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
305cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void rsem_AA2(void)
306cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar{
307cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RSL(X1);
308cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	WSL(X2); // this one should fail
309cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar}
310cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
311cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void rlock_AA3(void)
312cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar{
313cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	WL(X1);
314cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RL(X2); // this one should fail
315cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar}
316cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
317cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void rsem_AA3(void)
318cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar{
319cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	WSL(X1);
320cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RSL(X2); // this one should fail
321cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar}
322cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
323cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
324cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * ABBA deadlock:
325cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
326cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
327cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E()					\
328cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar						\
329cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(A, B);			\
330cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(B, A); /* fail */
331cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
332cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
333cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * 6 testcases:
334cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
335cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin.h"
336cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBA_spin)
337cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock.h"
338cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBA_wlock)
339cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock.h"
340cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBA_rlock)
341cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-mutex.h"
342cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBA_mutex)
343cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wsem.h"
344cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBA_wsem)
345cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rsem.h"
346cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBA_rsem)
347cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
348cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E
349cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
350cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
351cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * AB BC CA deadlock:
352cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
353cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
354cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E()					\
355cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar						\
356cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(A, B);			\
357cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(B, C);			\
358cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(C, A); /* fail */
359cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
360cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
361cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * 6 testcases:
362cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
363cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin.h"
364cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBCCA_spin)
365cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock.h"
366cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBCCA_wlock)
367cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock.h"
368cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBCCA_rlock)
369cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-mutex.h"
370cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBCCA_mutex)
371cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wsem.h"
372cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBCCA_wsem)
373cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rsem.h"
374cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBCCA_rsem)
375cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
376cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E
377cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
378cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
379cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * AB CA BC deadlock:
380cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
381cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
382cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E()					\
383cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar						\
384cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(A, B);			\
385cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(C, A);			\
386cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(B, C); /* fail */
387cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
388cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
389cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * 6 testcases:
390cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
391cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin.h"
392cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCABC_spin)
393cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock.h"
394cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCABC_wlock)
395cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock.h"
396cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCABC_rlock)
397cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-mutex.h"
398cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCABC_mutex)
399cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wsem.h"
400cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCABC_wsem)
401cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rsem.h"
402cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCABC_rsem)
403cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
404cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E
405cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
406cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
407cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * AB BC CD DA deadlock:
408cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
409cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
410cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E()					\
411cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar						\
412cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(A, B);			\
413cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(B, C);			\
414cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(C, D);			\
415cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(D, A); /* fail */
416cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
417cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
418cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * 6 testcases:
419cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
420cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin.h"
421cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBCCDDA_spin)
422cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock.h"
423cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBCCDDA_wlock)
424cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock.h"
425cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBCCDDA_rlock)
426cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-mutex.h"
427cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBCCDDA_mutex)
428cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wsem.h"
429cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBCCDDA_wsem)
430cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rsem.h"
431cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABBCCDDA_rsem)
432cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
433cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E
434cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
435cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
436cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * AB CD BD DA deadlock:
437cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
438cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E()					\
439cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar						\
440cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(A, B);			\
441cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(C, D);			\
442cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(B, D);			\
443cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(D, A); /* fail */
444cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
445cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
446cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * 6 testcases:
447cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
448cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin.h"
449cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCDBDDA_spin)
450cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock.h"
451cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCDBDDA_wlock)
452cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock.h"
453cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCDBDDA_rlock)
454cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-mutex.h"
455cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCDBDDA_mutex)
456cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wsem.h"
457cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCDBDDA_wsem)
458cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rsem.h"
459cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCDBDDA_rsem)
460cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
461cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E
462cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
463cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
464cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * AB CD BC DA deadlock:
465cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
466cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E()					\
467cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar						\
468cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(A, B);			\
469cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(C, D);			\
470cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(B, C);			\
471cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK_UNLOCK_2(D, A); /* fail */
472cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
473cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
474cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * 6 testcases:
475cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
476cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin.h"
477cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCDBCDA_spin)
478cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock.h"
479cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCDBCDA_wlock)
480cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock.h"
481cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCDBCDA_rlock)
482cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-mutex.h"
483cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCDBCDA_mutex)
484cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wsem.h"
485cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCDBCDA_wsem)
486cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rsem.h"
487cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(ABCDBCDA_rsem)
488cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
489cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E
490cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
491cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
492cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Double unlock:
493cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
494cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E()					\
495cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar						\
496cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(A);				\
497cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(A);				\
498cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(A); /* fail */
499cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
500cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
501cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * 6 testcases:
502cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
503cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin.h"
504cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(double_unlock_spin)
505cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock.h"
506cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(double_unlock_wlock)
507cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock.h"
508cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(double_unlock_rlock)
509cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-mutex.h"
510cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(double_unlock_mutex)
511cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wsem.h"
512cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(double_unlock_wsem)
513cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rsem.h"
514cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(double_unlock_rsem)
515cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
516cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E
517cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
518cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
519cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Bad unlock ordering:
520cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
521cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E()					\
522cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar						\
523cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(A);				\
524cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(B);				\
525cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(A); /* fail */			\
526cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(B);
527cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
528cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
529cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * 6 testcases:
530cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
531cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin.h"
532cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(bad_unlock_order_spin)
533cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock.h"
534cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(bad_unlock_order_wlock)
535cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock.h"
536cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(bad_unlock_order_rlock)
537cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-mutex.h"
538cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(bad_unlock_order_mutex)
539cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wsem.h"
540cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(bad_unlock_order_wsem)
541cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rsem.h"
542cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(bad_unlock_order_rsem)
543cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
544cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E
545cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
546cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
547cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * initializing a held lock:
548cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
549cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E()					\
550cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar						\
551cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(A);				\
552cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	INIT(A); /* fail */
553cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
554cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
555cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * 6 testcases:
556cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
557cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin.h"
558cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(init_held_spin)
559cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock.h"
560cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(init_held_wlock)
561cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock.h"
562cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(init_held_rlock)
563cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-mutex.h"
564cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(init_held_mutex)
565cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wsem.h"
566cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(init_held_wsem)
567cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rsem.h"
568cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_TESTCASE(init_held_rsem)
569cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
570cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E
571cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
572cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
573cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * locking an irq-safe lock with irqs enabled:
574cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
575cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E1()				\
576cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
577cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_ENTER();			\
578cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(A);			\
579cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(A);			\
580cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_EXIT();
581cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
582cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E2()				\
583cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
584cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(A);			\
585cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(A);
586cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
587cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
588cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Generate 24 testcases:
589cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
590cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin-hardirq.h"
591cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_spin)
592cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
593cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock-hardirq.h"
594cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_rlock)
595cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
596cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock-hardirq.h"
597cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_wlock)
598cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
599cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin-softirq.h"
600cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_spin)
601cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
602cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock-softirq.h"
603cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_rlock)
604cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
605cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock-softirq.h"
606cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_wlock)
607cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
608cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E1
609cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E2
610cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
611cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
612cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Enabling hardirqs with a softirq-safe lock held:
613cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
614cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E1()				\
615cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
616cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	SOFTIRQ_ENTER();		\
617cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(A);			\
618cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(A);			\
619cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	SOFTIRQ_EXIT();
620cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
621cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E2()				\
622cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
623cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	HARDIRQ_DISABLE();		\
624cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(A);			\
625cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	HARDIRQ_ENABLE();		\
626cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(A);
627cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
628cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
629cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Generate 12 testcases:
630cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
631cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin.h"
632cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A_spin)
633cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
634cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock.h"
635cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A_wlock)
636cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
637cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock.h"
638cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A_rlock)
639cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
640cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E1
641cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E2
642cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
643cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
644cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Enabling irqs with an irq-safe lock held:
645cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
646cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E1()				\
647cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
648cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_ENTER();			\
649cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(A);			\
650cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(A);			\
651cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_EXIT();
652cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
653cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E2()				\
654cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
655cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_DISABLE();			\
656cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(A);			\
657cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_ENABLE();			\
658cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(A);
659cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
660cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
661cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Generate 24 testcases:
662cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
663cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin-hardirq.h"
664cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_spin)
665cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
666cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock-hardirq.h"
667cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_rlock)
668cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
669cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock-hardirq.h"
670cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_wlock)
671cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
672cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin-softirq.h"
673cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_spin)
674cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
675cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock-softirq.h"
676cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_rlock)
677cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
678cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock-softirq.h"
679cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_wlock)
680cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
681cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E1
682cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E2
683cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
684cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
685cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Acquiring a irq-unsafe lock while holding an irq-safe-lock:
686cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
687cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E1()				\
688cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
689cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(A);			\
690cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(B);			\
691cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(B);			\
692cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(A);			\
693cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
694cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E2()				\
695cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
696cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(B);			\
697cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(B);
698cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
699cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E3()				\
700cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
701cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_ENTER();			\
702cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(A);			\
703cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(A);			\
704cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_EXIT();
705cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
706cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
707cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Generate 36 testcases:
708cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
709cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin-hardirq.h"
710cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_spin)
711cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
712cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock-hardirq.h"
713cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_rlock)
714cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
715cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock-hardirq.h"
716cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_wlock)
717cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
718cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin-softirq.h"
719cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_spin)
720cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
721cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock-softirq.h"
722cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_rlock)
723cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
724cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock-softirq.h"
725cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_wlock)
726cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
727cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E1
728cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E2
729cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E3
730cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
731cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
732cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * If a lock turns into softirq-safe, but earlier it took
733cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * a softirq-unsafe lock:
734cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
735cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
736cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E1()				\
737cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_DISABLE();			\
738cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(A);			\
739cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(B);			\
740cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(B);			\
741cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(A);			\
742cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_ENABLE();
743cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
744cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E2()				\
745cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(B);			\
746cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(B);
747cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
748cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E3()				\
749cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_ENTER();			\
750cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(A);			\
751cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(A);			\
752cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_EXIT();
753cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
754cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
755cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Generate 36 testcases:
756cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
757cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin-hardirq.h"
758cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_spin)
759cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
760cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock-hardirq.h"
761cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_rlock)
762cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
763cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock-hardirq.h"
764cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_wlock)
765cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
766cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin-softirq.h"
767cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_spin)
768cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
769cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock-softirq.h"
770cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_rlock)
771cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
772cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock-softirq.h"
773cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_wlock)
774cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
775cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E1
776cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E2
777cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E3
778cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
779cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
780cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * read-lock / write-lock irq inversion.
781cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar *
782cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Deadlock scenario:
783cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar *
784cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * CPU#1 is at #1, i.e. it has write-locked A, but has not
785cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * taken B yet.
786cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar *
787cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * CPU#2 is at #2, i.e. it has locked B.
788cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar *
789cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Hardirq hits CPU#2 at point #2 and is trying to read-lock A.
790cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar *
791cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * The deadlock occurs because CPU#1 will spin on B, and CPU#2
792cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * will spin on A.
793cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
794cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
795cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E1()				\
796cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
797cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_DISABLE();			\
798cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	WL(A);				\
799cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(B);			\
800cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(B);			\
801cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	WU(A);				\
802cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_ENABLE();
803cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
804cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E2()				\
805cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
806cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	LOCK(B);			\
807cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	UNLOCK(B);
808cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
809cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E3()				\
810cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
811cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_ENTER();			\
812cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RL(A);				\
813cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RU(A);				\
814cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_EXIT();
815cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
816cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
817cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Generate 36 testcases:
818cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
819cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin-hardirq.h"
820cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_hard_spin)
821cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
822cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock-hardirq.h"
823cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_hard_rlock)
824cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
825cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock-hardirq.h"
826cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_hard_wlock)
827cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
828cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-spin-softirq.h"
829cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_soft_spin)
830cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
831cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-rlock-softirq.h"
832cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_soft_rlock)
833cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
834cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-wlock-softirq.h"
835cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_soft_wlock)
836cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
837cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E1
838cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E2
839cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E3
840cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
841cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
842cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * read-lock / write-lock recursion that is actually safe.
843cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
844cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
845cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E1()				\
846cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
847cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_DISABLE();			\
848cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	WL(A);				\
849cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	WU(A);				\
850cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_ENABLE();
851cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
852cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E2()				\
853cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
854cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RL(A);				\
855cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RU(A);				\
856cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
857cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E3()				\
858cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
859cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_ENTER();			\
860cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RL(A);				\
861cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	L(B);				\
862cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	U(B);				\
863cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RU(A);				\
864cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_EXIT();
865cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
866cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
867cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Generate 12 testcases:
868cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
869cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-hardirq.h"
870cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irq_read_recursion_hard)
871cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
872cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-softirq.h"
873cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo MolnarGENERATE_PERMUTATIONS_3_EVENTS(irq_read_recursion_soft)
874cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
875cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E1
876cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E2
877cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef E3
878cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
879cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
880cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * read-lock / write-lock recursion that is unsafe.
881cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
882cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
883cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E1()				\
884cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
885cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_DISABLE();			\
886cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	L(B);				\
887cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	WL(A);				\
888cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	WU(A);				\
889cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	U(B);				\
890cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_ENABLE();
891cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
892cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E2()				\
893cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
894cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RL(A);				\
895cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	RU(A);				\
896cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
897cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define E3()				\
898cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar					\
899cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_ENTER();			\
900cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	L(B);				\
901cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	U(B);				\
902cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	IRQ_EXIT();
903cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
904cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
905cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * Generate 12 testcases:
906cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
907cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-hardirq.h"
908cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar// GENERATE_PERMUTATIONS_3_EVENTS(irq_read_recursion2_hard)
909cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
910cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#include "locking-selftest-softirq.h"
911cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar// GENERATE_PERMUTATIONS_3_EVENTS(irq_read_recursion2_soft)
912cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
913cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#ifdef CONFIG_DEBUG_LOCK_ALLOC
914cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar# define I_SPINLOCK(x)	lockdep_reset_lock(&lock_##x.dep_map)
915cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar# define I_RWLOCK(x)	lockdep_reset_lock(&rwlock_##x.dep_map)
916cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar# define I_MUTEX(x)	lockdep_reset_lock(&mutex_##x.dep_map)
917cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar# define I_RWSEM(x)	lockdep_reset_lock(&rwsem_##x.dep_map)
9181de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst# define I_WW(x)	lockdep_reset_lock(&x.dep_map)
919cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#else
920cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar# define I_SPINLOCK(x)
921cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar# define I_RWLOCK(x)
922cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar# define I_MUTEX(x)
923cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar# define I_RWSEM(x)
9241de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst# define I_WW(x)
925cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#endif
926cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
927cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define I1(x)					\
928cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	do {					\
929cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		I_SPINLOCK(x);			\
930cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		I_RWLOCK(x);			\
931cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		I_MUTEX(x);			\
932cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		I_RWSEM(x);			\
933cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	} while (0)
934cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
935cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define I2(x)					\
936cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	do {					\
9379fb1b90ce0a847a8cc9492a6c1f347b5be1f33ffYong Zhang		raw_spin_lock_init(&lock_##x);	\
938cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		rwlock_init(&rwlock_##x);	\
939cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		mutex_init(&mutex_##x);		\
940cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		init_rwsem(&rwsem_##x);		\
941cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	} while (0)
942cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
943cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void reset_locks(void)
944cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar{
945cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	local_irq_disable();
9461de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	lockdep_free_key_range(&ww_lockdep.acquire_key, 1);
9471de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	lockdep_free_key_range(&ww_lockdep.mutex_key, 1);
9481de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
949cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	I1(A); I1(B); I1(C); I1(D);
950cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	I1(X1); I1(X2); I1(Y1); I1(Y2); I1(Z1); I1(Z2);
951f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	I_WW(t); I_WW(t2); I_WW(o.base); I_WW(o2.base); I_WW(o3.base);
952cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	lockdep_reset();
953cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	I2(A); I2(B); I2(C); I2(D);
954cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	init_shared_classes();
9551de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
956f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ww_mutex_init(&o, &ww_lockdep); ww_mutex_init(&o2, &ww_lockdep); ww_mutex_init(&o3, &ww_lockdep);
9571de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	memset(&t, 0, sizeof(t)); memset(&t2, 0, sizeof(t2));
9581de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	memset(&ww_lockdep.acquire_key, 0, sizeof(ww_lockdep.acquire_key));
9591de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	memset(&ww_lockdep.mutex_key, 0, sizeof(ww_lockdep.mutex_key));
960cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	local_irq_enable();
961cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar}
962cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
963cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#undef I
964cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
965cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic int testcase_total;
966cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic int testcase_successes;
967cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic int expected_testcase_failures;
968cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic int unexpected_testcase_failures;
969cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
970cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic void dotest(void (*testcase_fn)(void), int expected, int lockclass_mask)
971cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar{
972cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	unsigned long saved_preempt_count = preempt_count();
973cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
974cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	WARN_ON(irqs_disabled());
975cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
976cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	testcase_fn();
977cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	/*
978cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	 * Filter out expected failures:
979cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	 */
980cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#ifndef CONFIG_PROVE_LOCKING
981166989e366ffa66108b2f37b870e66b85b2185adMaarten Lankhorst	if (expected == FAILURE && debug_locks) {
9821de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst		expected_testcase_failures++;
9831de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst		printk("failed|");
984166989e366ffa66108b2f37b870e66b85b2185adMaarten Lankhorst	}
985166989e366ffa66108b2f37b870e66b85b2185adMaarten Lankhorst	else
986166989e366ffa66108b2f37b870e66b85b2185adMaarten Lankhorst#endif
987166989e366ffa66108b2f37b870e66b85b2185adMaarten Lankhorst	if (debug_locks != expected) {
9881de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst		unexpected_testcase_failures++;
9891de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst		printk("FAILED|");
9901de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
9911de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst		dump_stack();
992cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	} else {
993cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		testcase_successes++;
994cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("  ok  |");
995cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	}
996cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	testcase_total++;
997cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
998cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	if (debug_locks_verbose)
999cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk(" lockclass mask: %x, debug_locks: %d, expected: %d\n",
1000cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar			lockclass_mask, debug_locks, expected);
1001cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	/*
1002cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	 * Some tests (e.g. double-unlock) might corrupt the preemption
1003cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	 * count, so restore it:
1004cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	 */
10054a2b4b222743bb07fedf985b884550f2ca067ea9Peter Zijlstra	preempt_count_set(saved_preempt_count);
1006cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#ifdef CONFIG_TRACE_IRQFLAGS
1007cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	if (softirq_count())
1008cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		current->softirqs_enabled = 0;
1009cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	else
1010cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		current->softirqs_enabled = 1;
1011cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#endif
1012cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1013cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	reset_locks();
1014cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar}
1015cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1016cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarstatic inline void print_testname(const char *testname)
1017cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar{
1018cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("%33s:", testname);
1019cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar}
1020cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1021cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_1(desc, name, nr)				\
1022cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	print_testname(desc"/"#nr);				\
1023cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_##nr, SUCCESS, LOCKTYPE_RWLOCK);		\
1024cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("\n");
1025cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1026cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_1B(desc, name, nr)				\
1027cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	print_testname(desc"/"#nr);				\
1028cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_##nr, FAILURE, LOCKTYPE_RWLOCK);		\
1029cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("\n");
1030cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1031cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_3(desc, name, nr)				\
1032cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	print_testname(desc"/"#nr);				\
1033cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_spin_##nr, FAILURE, LOCKTYPE_SPIN);	\
1034cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_wlock_##nr, FAILURE, LOCKTYPE_RWLOCK);	\
1035cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_rlock_##nr, SUCCESS, LOCKTYPE_RWLOCK);	\
1036cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("\n");
1037cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1038cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_3RW(desc, name, nr)				\
1039cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	print_testname(desc"/"#nr);				\
1040cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_spin_##nr, FAILURE, LOCKTYPE_SPIN|LOCKTYPE_RWLOCK);\
1041cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_wlock_##nr, FAILURE, LOCKTYPE_RWLOCK);	\
1042cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_rlock_##nr, SUCCESS, LOCKTYPE_RWLOCK);	\
1043cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("\n");
1044cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1045cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_6(desc, name)				\
1046cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	print_testname(desc);					\
1047cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_spin, FAILURE, LOCKTYPE_SPIN);		\
1048cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_wlock, FAILURE, LOCKTYPE_RWLOCK);		\
1049cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_rlock, FAILURE, LOCKTYPE_RWLOCK);		\
1050cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_mutex, FAILURE, LOCKTYPE_MUTEX);		\
1051cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_wsem, FAILURE, LOCKTYPE_RWSEM);		\
1052cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_rsem, FAILURE, LOCKTYPE_RWSEM);		\
1053cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("\n");
1054cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1055cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_6_SUCCESS(desc, name)			\
1056cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	print_testname(desc);					\
1057cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_spin, SUCCESS, LOCKTYPE_SPIN);		\
1058cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_wlock, SUCCESS, LOCKTYPE_RWLOCK);		\
1059cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_rlock, SUCCESS, LOCKTYPE_RWLOCK);		\
1060cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_mutex, SUCCESS, LOCKTYPE_MUTEX);		\
1061cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_wsem, SUCCESS, LOCKTYPE_RWSEM);		\
1062cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_rsem, SUCCESS, LOCKTYPE_RWSEM);		\
1063cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("\n");
1064cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1065cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar/*
1066cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar * 'read' variant: rlocks must not trigger.
1067cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar */
1068cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_6R(desc, name)				\
1069cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	print_testname(desc);					\
1070cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_spin, FAILURE, LOCKTYPE_SPIN);		\
1071cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_wlock, FAILURE, LOCKTYPE_RWLOCK);		\
1072cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_rlock, SUCCESS, LOCKTYPE_RWLOCK);		\
1073cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_mutex, FAILURE, LOCKTYPE_MUTEX);		\
1074cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_wsem, FAILURE, LOCKTYPE_RWSEM);		\
1075cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(name##_rsem, FAILURE, LOCKTYPE_RWSEM);		\
1076cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("\n");
1077cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1078cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_2I(desc, name, nr)				\
1079cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_1("hard-"desc, name##_hard, nr);		\
1080cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_1("soft-"desc, name##_soft, nr);
1081cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1082cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_2IB(desc, name, nr)				\
1083cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_1B("hard-"desc, name##_hard, nr);		\
1084cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_1B("soft-"desc, name##_soft, nr);
1085cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1086cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_6I(desc, name, nr)				\
1087cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_3("hard-"desc, name##_hard, nr);		\
1088cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_3("soft-"desc, name##_soft, nr);
1089cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1090cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_6IRW(desc, name, nr)			\
1091cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_3RW("hard-"desc, name##_hard, nr);		\
1092cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_3RW("soft-"desc, name##_soft, nr);
1093cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1094cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_2x3(desc, name)				\
1095cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_3(desc, name, 12);				\
1096cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_3(desc, name, 21);
1097cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1098cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_2x6(desc, name)				\
1099cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6I(desc, name, 12);				\
1100cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6I(desc, name, 21);
1101cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1102cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_6x2(desc, name)				\
1103cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_2I(desc, name, 123);			\
1104cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_2I(desc, name, 132);			\
1105cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_2I(desc, name, 213);			\
1106cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_2I(desc, name, 231);			\
1107cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_2I(desc, name, 312);			\
1108cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_2I(desc, name, 321);
1109cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1110cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_6x2B(desc, name)				\
1111cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_2IB(desc, name, 123);			\
1112cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_2IB(desc, name, 132);			\
1113cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_2IB(desc, name, 213);			\
1114cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_2IB(desc, name, 231);			\
1115cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_2IB(desc, name, 312);			\
1116cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_2IB(desc, name, 321);
1117cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1118cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_6x6(desc, name)				\
1119cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6I(desc, name, 123);			\
1120cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6I(desc, name, 132);			\
1121cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6I(desc, name, 213);			\
1122cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6I(desc, name, 231);			\
1123cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6I(desc, name, 312);			\
1124cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6I(desc, name, 321);
1125cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1126cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar#define DO_TESTCASE_6x6RW(desc, name)				\
1127cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6IRW(desc, name, 123);			\
1128cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6IRW(desc, name, 132);			\
1129cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6IRW(desc, name, 213);			\
1130cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6IRW(desc, name, 231);			\
1131cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6IRW(desc, name, 312);			\
1132cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6IRW(desc, name, 321);
1133cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
11341de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_fail_acquire(void)
11351de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
11361de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	int ret;
11371de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
11381de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
11391de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	t.stamp++;
11401de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
11411de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWL(&o, &t);
11421de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
11431de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	if (WARN_ON(!o.ctx) ||
11441de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	    WARN_ON(ret))
11451de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst		return;
11461de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
11471de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	/* No lockdep test, pure API */
11481de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWL(&o, &t);
11491de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(ret != -EALREADY);
11501de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
11511de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWT(&o);
11521de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(ret);
11531de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
11541de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	t2 = t;
11551de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	t2.stamp++;
11561de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWL(&o, &t2);
11571de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(ret != -EDEADLK);
11581de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o);
11591de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
11601de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	if (WWT(&o))
11611de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst		WWU(&o);
11621de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#ifdef CONFIG_DEBUG_LOCK_ALLOC
11631de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	else
11641de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst		DEBUG_LOCKS_WARN_ON(1);
11651de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#endif
11661de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
11671de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
11682fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorststatic void ww_test_normal(void)
11692fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst{
11702fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	int ret;
11712fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst
11722fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	WWAI(&t);
11732fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst
11742fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	/*
11752fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	 * None of the ww_mutex codepaths should be taken in the 'normal'
11762fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	 * mutex calls. The easiest way to verify this is by using the
11772fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	 * normal mutex calls, and making sure o.ctx is unmodified.
11782fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	 */
11792fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst
11802fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	/* mutex_lock (and indirectly, mutex_lock_nested) */
11812fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	o.ctx = (void *)~0UL;
11822fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	mutex_lock(&o.base);
11832fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	mutex_unlock(&o.base);
11842fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	WARN_ON(o.ctx != (void *)~0UL);
11852fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst
11862fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	/* mutex_lock_interruptible (and *_nested) */
11872fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	o.ctx = (void *)~0UL;
11882fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	ret = mutex_lock_interruptible(&o.base);
11892fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	if (!ret)
11902fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst		mutex_unlock(&o.base);
11912fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	else
11922fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst		WARN_ON(1);
11932fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	WARN_ON(o.ctx != (void *)~0UL);
11942fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst
11952fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	/* mutex_lock_killable (and *_nested) */
11962fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	o.ctx = (void *)~0UL;
11972fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	ret = mutex_lock_killable(&o.base);
11982fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	if (!ret)
11992fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst		mutex_unlock(&o.base);
12002fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	else
12012fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst		WARN_ON(1);
12022fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	WARN_ON(o.ctx != (void *)~0UL);
12032fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst
12042fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	/* trylock, succeeding */
12052fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	o.ctx = (void *)~0UL;
12062fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	ret = mutex_trylock(&o.base);
12072fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	WARN_ON(!ret);
12082fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	if (ret)
12092fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst		mutex_unlock(&o.base);
12102fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	else
12112fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst		WARN_ON(1);
12122fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	WARN_ON(o.ctx != (void *)~0UL);
12132fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst
12142fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	/* trylock, failing */
12152fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	o.ctx = (void *)~0UL;
12162fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	mutex_lock(&o.base);
12172fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	ret = mutex_trylock(&o.base);
12182fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	WARN_ON(ret);
12192fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	mutex_unlock(&o.base);
12202fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	WARN_ON(o.ctx != (void *)~0UL);
12212fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst
12222fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	/* nest_lock */
12232fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	o.ctx = (void *)~0UL;
12242fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	mutex_lock_nest_lock(&o.base, &t);
12252fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	mutex_unlock(&o.base);
12262fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	WARN_ON(o.ctx != (void *)~0UL);
12272fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst}
12282fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst
12291de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_two_contexts(void)
12301de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
12311de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
12321de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t2);
12331de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
12341de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
12351de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_diff_class(void)
12361de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
12371de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
12381de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#ifdef CONFIG_DEBUG_MUTEXES
12391de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	t.ww_class = NULL;
12401de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst#endif
12411de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWL(&o, &t);
12421de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
12431de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
12441de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_context_done_twice(void)
12451de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
12461de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
12471de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAD(&t);
12481de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAD(&t);
12491de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAF(&t);
12501de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
12511de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
12521de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_context_unlock_twice(void)
12531de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
12541de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
12551de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAD(&t);
12561de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAF(&t);
12571de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAF(&t);
12581de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
12591de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
12601de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_context_fini_early(void)
12611de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
12621de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
12631de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWL(&o, &t);
12641de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAD(&t);
12651de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAF(&t);
12661de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
12671de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
12681de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_context_lock_after_done(void)
12691de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
12701de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
12711de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAD(&t);
12721de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWL(&o, &t);
12731de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
12741de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
12751de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_object_unlock_twice(void)
12761de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
12771de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWL1(&o);
12781de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o);
12791de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o);
12801de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
12811de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
12821de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_object_lock_unbalanced(void)
12831de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
12841de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
12851de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWL(&o, &t);
12861de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	t.acquired = 0;
12871de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o);
12881de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAF(&t);
12891de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
12901de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
12911de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_object_lock_stale_context(void)
12921de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
12931de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
12941de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	o.ctx = &t2;
12951de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWL(&o, &t);
12961de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
12971de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
1298f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorststatic void ww_test_edeadlk_normal(void)
1299f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst{
1300f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	int ret;
1301f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1302f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_lock(&o2.base);
1303f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o2.ctx = &t2;
1304f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_release(&o2.base.dep_map, 1, _THIS_IP_);
1305f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1306f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWAI(&t);
1307f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2 = t;
1308f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2.stamp--;
1309f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1310f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o, &t);
1311f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret);
1312f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1313f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o2, &t);
1314f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret != -EDEADLK);
1315f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1316f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o2.ctx = NULL;
1317f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_acquire(&o2.base.dep_map, 0, 1, _THIS_IP_);
1318f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_unlock(&o2.base);
1319f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWU(&o);
1320f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1321f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWL(&o2, &t);
1322f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst}
1323f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1324f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorststatic void ww_test_edeadlk_normal_slow(void)
1325f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst{
1326f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	int ret;
1327f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1328f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_lock(&o2.base);
1329f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_release(&o2.base.dep_map, 1, _THIS_IP_);
1330f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o2.ctx = &t2;
1331f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1332f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWAI(&t);
1333f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2 = t;
1334f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2.stamp--;
1335f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1336f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o, &t);
1337f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret);
1338f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1339f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o2, &t);
1340f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret != -EDEADLK);
1341f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1342f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o2.ctx = NULL;
1343f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_acquire(&o2.base.dep_map, 0, 1, _THIS_IP_);
1344f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_unlock(&o2.base);
1345f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWU(&o);
1346f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1347f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ww_mutex_lock_slow(&o2, &t);
1348f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst}
1349f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1350f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorststatic void ww_test_edeadlk_no_unlock(void)
1351f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst{
1352f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	int ret;
1353f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1354f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_lock(&o2.base);
1355f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o2.ctx = &t2;
1356f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_release(&o2.base.dep_map, 1, _THIS_IP_);
1357f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1358f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWAI(&t);
1359f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2 = t;
1360f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2.stamp--;
1361f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1362f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o, &t);
1363f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret);
1364f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1365f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o2, &t);
1366f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret != -EDEADLK);
1367f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1368f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o2.ctx = NULL;
1369f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_acquire(&o2.base.dep_map, 0, 1, _THIS_IP_);
1370f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_unlock(&o2.base);
1371f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1372f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWL(&o2, &t);
1373f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst}
1374f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1375f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorststatic void ww_test_edeadlk_no_unlock_slow(void)
1376f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst{
1377f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	int ret;
1378f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1379f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_lock(&o2.base);
1380f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_release(&o2.base.dep_map, 1, _THIS_IP_);
1381f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o2.ctx = &t2;
1382f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1383f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWAI(&t);
1384f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2 = t;
1385f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2.stamp--;
1386f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1387f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o, &t);
1388f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret);
1389f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1390f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o2, &t);
1391f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret != -EDEADLK);
1392f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1393f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o2.ctx = NULL;
1394f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_acquire(&o2.base.dep_map, 0, 1, _THIS_IP_);
1395f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_unlock(&o2.base);
1396f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1397f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ww_mutex_lock_slow(&o2, &t);
1398f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst}
1399f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1400f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorststatic void ww_test_edeadlk_acquire_more(void)
1401f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst{
1402f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	int ret;
1403f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1404f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_lock(&o2.base);
1405f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_release(&o2.base.dep_map, 1, _THIS_IP_);
1406f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o2.ctx = &t2;
1407f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1408f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWAI(&t);
1409f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2 = t;
1410f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2.stamp--;
1411f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1412f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o, &t);
1413f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret);
1414f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1415f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o2, &t);
1416f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret != -EDEADLK);
1417f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1418f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o3, &t);
1419f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst}
1420f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1421f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorststatic void ww_test_edeadlk_acquire_more_slow(void)
1422f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst{
1423f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	int ret;
1424f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1425f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_lock(&o2.base);
1426f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_release(&o2.base.dep_map, 1, _THIS_IP_);
1427f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o2.ctx = &t2;
1428f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1429f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWAI(&t);
1430f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2 = t;
1431f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2.stamp--;
1432f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1433f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o, &t);
1434f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret);
1435f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1436f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o2, &t);
1437f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret != -EDEADLK);
1438f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1439f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ww_mutex_lock_slow(&o3, &t);
1440f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst}
1441f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1442f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorststatic void ww_test_edeadlk_acquire_more_edeadlk(void)
1443f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst{
1444f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	int ret;
1445f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1446f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_lock(&o2.base);
1447f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_release(&o2.base.dep_map, 1, _THIS_IP_);
1448f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o2.ctx = &t2;
1449f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1450f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_lock(&o3.base);
1451f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_release(&o3.base.dep_map, 1, _THIS_IP_);
1452f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o3.ctx = &t2;
1453f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1454f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWAI(&t);
1455f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2 = t;
1456f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2.stamp--;
1457f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1458f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o, &t);
1459f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret);
1460f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1461f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o2, &t);
1462f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret != -EDEADLK);
1463f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1464f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o3, &t);
1465f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret != -EDEADLK);
1466f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst}
1467f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1468f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorststatic void ww_test_edeadlk_acquire_more_edeadlk_slow(void)
1469f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst{
1470f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	int ret;
1471f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1472f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_lock(&o2.base);
1473f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_release(&o2.base.dep_map, 1, _THIS_IP_);
1474f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o2.ctx = &t2;
1475f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1476f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_lock(&o3.base);
1477f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_release(&o3.base.dep_map, 1, _THIS_IP_);
1478f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o3.ctx = &t2;
1479f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1480f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWAI(&t);
1481f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2 = t;
1482f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2.stamp--;
1483f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1484f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o, &t);
1485f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret);
1486f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1487f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o2, &t);
1488f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret != -EDEADLK);
1489f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1490f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ww_mutex_lock_slow(&o3, &t);
1491f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst}
1492f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1493f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorststatic void ww_test_edeadlk_acquire_wrong(void)
1494f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst{
1495f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	int ret;
1496f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1497f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_lock(&o2.base);
1498f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_release(&o2.base.dep_map, 1, _THIS_IP_);
1499f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o2.ctx = &t2;
1500f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1501f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWAI(&t);
1502f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2 = t;
1503f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2.stamp--;
1504f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1505f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o, &t);
1506f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret);
1507f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1508f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o2, &t);
1509f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret != -EDEADLK);
1510f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	if (!ret)
1511f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst		WWU(&o2);
1512f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1513f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWU(&o);
1514f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1515f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o3, &t);
1516f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst}
1517f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1518f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorststatic void ww_test_edeadlk_acquire_wrong_slow(void)
1519f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst{
1520f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	int ret;
1521f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1522f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_lock(&o2.base);
1523f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	mutex_release(&o2.base.dep_map, 1, _THIS_IP_);
1524f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	o2.ctx = &t2;
1525f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1526f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWAI(&t);
1527f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2 = t;
1528f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	t2.stamp--;
1529f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1530f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o, &t);
1531f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret);
1532f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1533f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ret = WWL(&o2, &t);
1534f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WARN_ON(ret != -EDEADLK);
1535f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	if (!ret)
1536f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst		WWU(&o2);
1537f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1538f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	WWU(&o);
1539f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
1540f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	ww_mutex_lock_slow(&o3, &t);
1541f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst}
1542f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
15431de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_spin_nest_unlocked(void)
15441de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
15451de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	raw_spin_lock_nest_lock(&lock_A, &o.base);
15461de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	U(A);
15471de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
15481de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
15491de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_unneeded_slow(void)
15501de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
15511de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
15521de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
15531de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ww_mutex_lock_slow(&o, &t);
15541de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
15551de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
15561de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_context_block(void)
15571de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
15581de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	int ret;
15591de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
15601de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
15611de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
15621de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWL(&o, &t);
15631de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(ret);
15641de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWL1(&o2);
15651de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
15661de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
15671de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_context_try(void)
15681de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
15691de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	int ret;
15701de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
15711de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
15721de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
15731de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWL(&o, &t);
15741de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(ret);
15751de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
15761de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWT(&o2);
15771de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(!ret);
15781de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o2);
15791de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o);
15801de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
15811de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
15821de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_context_context(void)
15831de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
15841de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	int ret;
15851de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
15861de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
15871de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
15881de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWL(&o, &t);
15891de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(ret);
15901de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
15911de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWL(&o2, &t);
15921de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(ret);
15931de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
15941de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o2);
15951de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o);
15961de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
15971de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
15981de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_try_block(void)
15991de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
16001de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	bool ret;
16011de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16021de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWT(&o);
16031de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(!ret);
16041de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16051de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWL1(&o2);
16061de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o2);
16071de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o);
16081de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
16091de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16101de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_try_try(void)
16111de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
16121de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	bool ret;
16131de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16141de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWT(&o);
16151de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(!ret);
16161de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWT(&o2);
16171de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(!ret);
16181de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o2);
16191de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o);
16201de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
16211de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16221de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_try_context(void)
16231de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
16241de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	int ret;
16251de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16261de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWT(&o);
16271de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(!ret);
16281de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16291de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
16301de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16311de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWL(&o2, &t);
16321de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(ret);
16331de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
16341de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16351de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_block_block(void)
16361de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
16371de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWL1(&o);
16381de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWL1(&o2);
16391de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
16401de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16411de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_block_try(void)
16421de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
16431de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	bool ret;
16441de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16451de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWL1(&o);
16461de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWT(&o2);
16471de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(!ret);
16481de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
16491de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16501de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_block_context(void)
16511de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
16521de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	int ret;
16531de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16541de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWL1(&o);
16551de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
16561de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16571de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWL(&o2, &t);
16581de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(ret);
16591de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
16601de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16611de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_spin_block(void)
16621de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
16631de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	L(A);
16641de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	U(A);
16651de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16661de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWL1(&o);
16671de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	L(A);
16681de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	U(A);
16691de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o);
16701de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16711de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	L(A);
16721de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWL1(&o);
16731de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o);
16741de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	U(A);
16751de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
16761de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16771de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_spin_try(void)
16781de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
16791de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	bool ret;
16801de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16811de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	L(A);
16821de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	U(A);
16831de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16841de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWT(&o);
16851de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(!ret);
16861de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	L(A);
16871de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	U(A);
16881de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o);
16891de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16901de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	L(A);
16911de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWT(&o);
16921de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(!ret);
16931de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o);
16941de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	U(A);
16951de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
16961de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
16971de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_test_spin_context(void)
16981de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
16991de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	int ret;
17001de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
17011de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	L(A);
17021de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	U(A);
17031de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
17041de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWAI(&t);
17051de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
17061de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWL(&o, &t);
17071de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(ret);
17081de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	L(A);
17091de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	U(A);
17101de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o);
17111de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
17121de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	L(A);
17131de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ret = WWL(&o, &t);
17141de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WARN_ON(ret);
17151de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	WWU(&o);
17161de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	U(A);
17171de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
17181de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
17191de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorststatic void ww_tests(void)
17201de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst{
17211de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	printk("  --------------------------------------------------------------------------\n");
17221de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	printk("  | Wound/wait tests |\n");
17231de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	printk("  ---------------------\n");
17241de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
17251de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	print_testname("ww api failures");
17261de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_fail_acquire, SUCCESS, LOCKTYPE_WW);
17272fe3d4b149ccebbb384062fbbe6634439f2bf120Maarten Lankhorst	dotest(ww_test_normal, SUCCESS, LOCKTYPE_WW);
17281de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_unneeded_slow, FAILURE, LOCKTYPE_WW);
17291de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	printk("\n");
17301de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
17311de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	print_testname("ww contexts mixing");
17321de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_two_contexts, FAILURE, LOCKTYPE_WW);
17331de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_diff_class, FAILURE, LOCKTYPE_WW);
17341de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	printk("\n");
17351de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
17361de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	print_testname("finishing ww context");
17371de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_context_done_twice, FAILURE, LOCKTYPE_WW);
17381de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_context_unlock_twice, FAILURE, LOCKTYPE_WW);
17391de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_context_fini_early, FAILURE, LOCKTYPE_WW);
17401de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_context_lock_after_done, FAILURE, LOCKTYPE_WW);
17411de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	printk("\n");
17421de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
17431de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	print_testname("locking mismatches");
17441de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_object_unlock_twice, FAILURE, LOCKTYPE_WW);
17451de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_object_lock_unbalanced, FAILURE, LOCKTYPE_WW);
17461de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_object_lock_stale_context, FAILURE, LOCKTYPE_WW);
17471de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	printk("\n");
17481de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
1749f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	print_testname("EDEADLK handling");
1750f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	dotest(ww_test_edeadlk_normal, SUCCESS, LOCKTYPE_WW);
1751f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	dotest(ww_test_edeadlk_normal_slow, SUCCESS, LOCKTYPE_WW);
1752f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	dotest(ww_test_edeadlk_no_unlock, FAILURE, LOCKTYPE_WW);
1753f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	dotest(ww_test_edeadlk_no_unlock_slow, FAILURE, LOCKTYPE_WW);
1754f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	dotest(ww_test_edeadlk_acquire_more, FAILURE, LOCKTYPE_WW);
1755f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	dotest(ww_test_edeadlk_acquire_more_slow, FAILURE, LOCKTYPE_WW);
1756f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	dotest(ww_test_edeadlk_acquire_more_edeadlk, FAILURE, LOCKTYPE_WW);
1757f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	dotest(ww_test_edeadlk_acquire_more_edeadlk_slow, FAILURE, LOCKTYPE_WW);
1758f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	dotest(ww_test_edeadlk_acquire_wrong, FAILURE, LOCKTYPE_WW);
1759f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	dotest(ww_test_edeadlk_acquire_wrong_slow, FAILURE, LOCKTYPE_WW);
1760f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst	printk("\n");
1761f3cf139efa4bc0fe4f032af6ca3e49e38a5d9ae5Maarten Lankhorst
17621de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	print_testname("spinlock nest unlocked");
17631de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_spin_nest_unlocked, FAILURE, LOCKTYPE_WW);
17641de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	printk("\n");
17651de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
17661de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	printk("  -----------------------------------------------------\n");
17671de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	printk("                                 |block | try  |context|\n");
17681de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	printk("  -----------------------------------------------------\n");
17691de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
17701de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	print_testname("context");
17711de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_context_block, FAILURE, LOCKTYPE_WW);
17721de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_context_try, SUCCESS, LOCKTYPE_WW);
17731de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_context_context, SUCCESS, LOCKTYPE_WW);
17741de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	printk("\n");
17751de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
17761de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	print_testname("try");
17771de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_try_block, FAILURE, LOCKTYPE_WW);
17781de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_try_try, SUCCESS, LOCKTYPE_WW);
17791de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_try_context, FAILURE, LOCKTYPE_WW);
17801de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	printk("\n");
17811de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
17821de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	print_testname("block");
17831de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_block_block, FAILURE, LOCKTYPE_WW);
17841de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_block_try, SUCCESS, LOCKTYPE_WW);
17851de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_block_context, FAILURE, LOCKTYPE_WW);
17861de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	printk("\n");
17871de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
17881de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	print_testname("spinlock");
17891de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_spin_block, FAILURE, LOCKTYPE_WW);
17901de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_spin_try, SUCCESS, LOCKTYPE_WW);
17911de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	dotest(ww_test_spin_context, FAILURE, LOCKTYPE_WW);
17921de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	printk("\n");
17931de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst}
1794cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1795cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnarvoid locking_selftest(void)
1796cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar{
1797cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	/*
1798cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	 * Got a locking failure before the selftest ran?
1799cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	 */
1800cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	if (!debug_locks) {
1801cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("----------------------------------\n");
1802cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("| Locking API testsuite disabled |\n");
1803cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("----------------------------------\n");
1804cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		return;
1805cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	}
1806cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1807cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	/*
1808cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	 * Run the testsuite:
1809cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	 */
1810cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("------------------------\n");
1811cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("| Locking API testsuite:\n");
1812cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("----------------------------------------------------------------------------\n");
1813cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("                                 | spin |wlock |rlock |mutex | wsem | rsem |\n");
1814cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("  --------------------------------------------------------------------------\n");
1815cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1816cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	init_shared_classes();
1817cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	debug_locks_silent = !debug_locks_verbose;
1818cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
18196c9076ec9cd448f43bbda871352a7067f456ee26Ingo Molnar	DO_TESTCASE_6R("A-A deadlock", AA);
1820cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6R("A-B-B-A deadlock", ABBA);
1821cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6R("A-B-B-C-C-A deadlock", ABBCCA);
1822cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6R("A-B-C-A-B-C deadlock", ABCABC);
1823cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6R("A-B-B-C-C-D-D-A deadlock", ABBCCDDA);
1824cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6R("A-B-C-D-B-D-D-A deadlock", ABCDBDDA);
1825cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6R("A-B-C-D-B-C-D-A deadlock", ABCDBCDA);
1826cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6("double unlock", double_unlock);
1827cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6("initialize held", init_held);
1828cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6_SUCCESS("bad unlock order", bad_unlock_order);
1829cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1830cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("  --------------------------------------------------------------------------\n");
1831cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	print_testname("recursive read-lock");
1832cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("             |");
1833cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(rlock_AA1, SUCCESS, LOCKTYPE_RWLOCK);
1834cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("             |");
1835cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(rsem_AA1, FAILURE, LOCKTYPE_RWSEM);
1836cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("\n");
1837cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1838cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	print_testname("recursive read-lock #2");
1839cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("             |");
18406c9076ec9cd448f43bbda871352a7067f456ee26Ingo Molnar	dotest(rlock_AA1B, SUCCESS, LOCKTYPE_RWLOCK);
1841cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("             |");
1842cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(rsem_AA1B, FAILURE, LOCKTYPE_RWSEM);
1843cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("\n");
1844cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1845cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	print_testname("mixed read-write-lock");
1846cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("             |");
1847cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(rlock_AA2, FAILURE, LOCKTYPE_RWLOCK);
1848cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("             |");
1849cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(rsem_AA2, FAILURE, LOCKTYPE_RWSEM);
1850cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("\n");
1851cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1852cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	print_testname("mixed write-read-lock");
1853cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("             |");
1854cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(rlock_AA3, FAILURE, LOCKTYPE_RWLOCK);
1855cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("             |");
1856cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	dotest(rsem_AA3, FAILURE, LOCKTYPE_RWSEM);
1857cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("\n");
1858cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1859cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	printk("  --------------------------------------------------------------------------\n");
1860cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1861cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	/*
1862cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	 * irq-context testcases:
1863cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	 */
1864cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_2x6("irqs-on + irq-safe-A", irqsafe1);
1865cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_2x3("sirq-safe-A => hirqs-on", irqsafe2A);
1866cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_2x6("safe-A + irqs-on", irqsafe2B);
1867cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6x6("safe-A + unsafe-B #1", irqsafe3);
1868cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6x6("safe-A + unsafe-B #2", irqsafe4);
1869cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6x6RW("irq lock-inversion", irq_inversion);
1870cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
1871cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	DO_TESTCASE_6x2("irq read-recursion", irq_read_recursion);
1872cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar//	DO_TESTCASE_6x2B("irq read-recursion #2", irq_read_recursion2);
1873cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar
18741de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst	ww_tests();
18751de994452f44005e4b1f5c6c77eae4a26f86d484Maarten Lankhorst
1876cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	if (unexpected_testcase_failures) {
1877cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("-----------------------------------------------------------------\n");
1878cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		debug_locks = 0;
1879cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("BUG: %3d unexpected failures (out of %3d) - debugging disabled! |\n",
1880cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar			unexpected_testcase_failures, testcase_total);
1881cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("-----------------------------------------------------------------\n");
1882cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	} else if (expected_testcase_failures && testcase_successes) {
1883cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("--------------------------------------------------------\n");
1884cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("%3d out of %3d testcases failed, as expected. |\n",
1885cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar			expected_testcase_failures, testcase_total);
1886cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("----------------------------------------------------\n");
1887cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		debug_locks = 1;
1888cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	} else if (expected_testcase_failures && !testcase_successes) {
1889cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("--------------------------------------------------------\n");
1890cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("All %3d testcases failed, as expected. |\n",
1891cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar			expected_testcase_failures);
1892cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("----------------------------------------\n");
1893cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		debug_locks = 1;
1894cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	} else {
1895cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("-------------------------------------------------------\n");
1896cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("Good, all %3d testcases passed! |\n",
1897cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar			testcase_successes);
1898cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		printk("---------------------------------\n");
1899cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar		debug_locks = 1;
1900cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	}
1901cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar	debug_locks_silent = 0;
1902cae2ed9aa573415c6e5de9a09b7ff0d74af793bcIngo Molnar}
1903