Merge branch 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm
[linux-2.6-microblaze.git] / kernel / locking / locktorture.c
1 /*
2  * Module-based torture test facility for locking
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, you can access it online at
16  * http://www.gnu.org/licenses/gpl-2.0.html.
17  *
18  * Copyright (C) IBM Corporation, 2014
19  *
20  * Authors: Paul E. McKenney <paulmck@us.ibm.com>
21  *          Davidlohr Bueso <dave@stgolabs.net>
22  *      Based on kernel/rcu/torture.c.
23  */
24 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/kthread.h>
27 #include <linux/sched/rt.h>
28 #include <linux/spinlock.h>
29 #include <linux/rwlock.h>
30 #include <linux/mutex.h>
31 #include <linux/rwsem.h>
32 #include <linux/smp.h>
33 #include <linux/interrupt.h>
34 #include <linux/sched.h>
35 #include <linux/atomic.h>
36 #include <linux/moduleparam.h>
37 #include <linux/delay.h>
38 #include <linux/slab.h>
39 #include <linux/percpu-rwsem.h>
40 #include <linux/torture.h>
41
42 MODULE_LICENSE("GPL");
43 MODULE_AUTHOR("Paul E. McKenney <paulmck@us.ibm.com>");
44
45 torture_param(int, nwriters_stress, -1,
46              "Number of write-locking stress-test threads");
47 torture_param(int, nreaders_stress, -1,
48              "Number of read-locking stress-test threads");
49 torture_param(int, onoff_holdoff, 0, "Time after boot before CPU hotplugs (s)");
50 torture_param(int, onoff_interval, 0,
51              "Time between CPU hotplugs (s), 0=disable");
52 torture_param(int, shuffle_interval, 3,
53              "Number of jiffies between shuffles, 0=disable");
54 torture_param(int, shutdown_secs, 0, "Shutdown time (j), <= zero to disable.");
55 torture_param(int, stat_interval, 60,
56              "Number of seconds between stats printk()s");
57 torture_param(int, stutter, 5, "Number of jiffies to run/halt test, 0=disable");
58 torture_param(bool, verbose, true,
59              "Enable verbose debugging printk()s");
60
61 static char *torture_type = "spin_lock";
62 module_param(torture_type, charp, 0444);
63 MODULE_PARM_DESC(torture_type,
64                  "Type of lock to torture (spin_lock, spin_lock_irq, mutex_lock, ...)");
65
66 static struct task_struct *stats_task;
67 static struct task_struct **writer_tasks;
68 static struct task_struct **reader_tasks;
69
70 static bool lock_is_write_held;
71 static bool lock_is_read_held;
72
73 struct lock_stress_stats {
74         long n_lock_fail;
75         long n_lock_acquired;
76 };
77
78 int torture_runnable = IS_ENABLED(MODULE);
79 module_param(torture_runnable, int, 0444);
80 MODULE_PARM_DESC(torture_runnable, "Start locktorture at module init");
81
82 /* Forward reference. */
83 static void lock_torture_cleanup(void);
84
85 /*
86  * Operations vector for selecting different types of tests.
87  */
88 struct lock_torture_ops {
89         void (*init)(void);
90         int (*writelock)(void);
91         void (*write_delay)(struct torture_random_state *trsp);
92         void (*task_boost)(struct torture_random_state *trsp);
93         void (*writeunlock)(void);
94         int (*readlock)(void);
95         void (*read_delay)(struct torture_random_state *trsp);
96         void (*readunlock)(void);
97
98         unsigned long flags; /* for irq spinlocks */
99         const char *name;
100 };
101
102 struct lock_torture_cxt {
103         int nrealwriters_stress;
104         int nrealreaders_stress;
105         bool debug_lock;
106         atomic_t n_lock_torture_errors;
107         struct lock_torture_ops *cur_ops;
108         struct lock_stress_stats *lwsa; /* writer statistics */
109         struct lock_stress_stats *lrsa; /* reader statistics */
110 };
111 static struct lock_torture_cxt cxt = { 0, 0, false,
112                                        ATOMIC_INIT(0),
113                                        NULL, NULL};
114 /*
115  * Definitions for lock torture testing.
116  */
117
118 static int torture_lock_busted_write_lock(void)
119 {
120         return 0;  /* BUGGY, do not use in real life!!! */
121 }
122
123 static void torture_lock_busted_write_delay(struct torture_random_state *trsp)
124 {
125         const unsigned long longdelay_ms = 100;
126
127         /* We want a long delay occasionally to force massive contention.  */
128         if (!(torture_random(trsp) %
129               (cxt.nrealwriters_stress * 2000 * longdelay_ms)))
130                 mdelay(longdelay_ms);
131 #ifdef CONFIG_PREEMPT
132         if (!(torture_random(trsp) % (cxt.nrealwriters_stress * 20000)))
133                 preempt_schedule();  /* Allow test to be preempted. */
134 #endif
135 }
136
137 static void torture_lock_busted_write_unlock(void)
138 {
139           /* BUGGY, do not use in real life!!! */
140 }
141
142 static void torture_boost_dummy(struct torture_random_state *trsp)
143 {
144         /* Only rtmutexes care about priority */
145 }
146
147 static struct lock_torture_ops lock_busted_ops = {
148         .writelock      = torture_lock_busted_write_lock,
149         .write_delay    = torture_lock_busted_write_delay,
150         .task_boost     = torture_boost_dummy,
151         .writeunlock    = torture_lock_busted_write_unlock,
152         .readlock       = NULL,
153         .read_delay     = NULL,
154         .readunlock     = NULL,
155         .name           = "lock_busted"
156 };
157
158 static DEFINE_SPINLOCK(torture_spinlock);
159
160 static int torture_spin_lock_write_lock(void) __acquires(torture_spinlock)
161 {
162         spin_lock(&torture_spinlock);
163         return 0;
164 }
165
166 static void torture_spin_lock_write_delay(struct torture_random_state *trsp)
167 {
168         const unsigned long shortdelay_us = 2;
169         const unsigned long longdelay_ms = 100;
170
171         /* We want a short delay mostly to emulate likely code, and
172          * we want a long delay occasionally to force massive contention.
173          */
174         if (!(torture_random(trsp) %
175               (cxt.nrealwriters_stress * 2000 * longdelay_ms)))
176                 mdelay(longdelay_ms);
177         if (!(torture_random(trsp) %
178               (cxt.nrealwriters_stress * 2 * shortdelay_us)))
179                 udelay(shortdelay_us);
180 #ifdef CONFIG_PREEMPT
181         if (!(torture_random(trsp) % (cxt.nrealwriters_stress * 20000)))
182                 preempt_schedule();  /* Allow test to be preempted. */
183 #endif
184 }
185
186 static void torture_spin_lock_write_unlock(void) __releases(torture_spinlock)
187 {
188         spin_unlock(&torture_spinlock);
189 }
190
191 static struct lock_torture_ops spin_lock_ops = {
192         .writelock      = torture_spin_lock_write_lock,
193         .write_delay    = torture_spin_lock_write_delay,
194         .task_boost     = torture_boost_dummy,
195         .writeunlock    = torture_spin_lock_write_unlock,
196         .readlock       = NULL,
197         .read_delay     = NULL,
198         .readunlock     = NULL,
199         .name           = "spin_lock"
200 };
201
202 static int torture_spin_lock_write_lock_irq(void)
203 __acquires(torture_spinlock)
204 {
205         unsigned long flags;
206
207         spin_lock_irqsave(&torture_spinlock, flags);
208         cxt.cur_ops->flags = flags;
209         return 0;
210 }
211
212 static void torture_lock_spin_write_unlock_irq(void)
213 __releases(torture_spinlock)
214 {
215         spin_unlock_irqrestore(&torture_spinlock, cxt.cur_ops->flags);
216 }
217
218 static struct lock_torture_ops spin_lock_irq_ops = {
219         .writelock      = torture_spin_lock_write_lock_irq,
220         .write_delay    = torture_spin_lock_write_delay,
221         .task_boost     = torture_boost_dummy,
222         .writeunlock    = torture_lock_spin_write_unlock_irq,
223         .readlock       = NULL,
224         .read_delay     = NULL,
225         .readunlock     = NULL,
226         .name           = "spin_lock_irq"
227 };
228
229 static DEFINE_RWLOCK(torture_rwlock);
230
231 static int torture_rwlock_write_lock(void) __acquires(torture_rwlock)
232 {
233         write_lock(&torture_rwlock);
234         return 0;
235 }
236
237 static void torture_rwlock_write_delay(struct torture_random_state *trsp)
238 {
239         const unsigned long shortdelay_us = 2;
240         const unsigned long longdelay_ms = 100;
241
242         /* We want a short delay mostly to emulate likely code, and
243          * we want a long delay occasionally to force massive contention.
244          */
245         if (!(torture_random(trsp) %
246               (cxt.nrealwriters_stress * 2000 * longdelay_ms)))
247                 mdelay(longdelay_ms);
248         else
249                 udelay(shortdelay_us);
250 }
251
252 static void torture_rwlock_write_unlock(void) __releases(torture_rwlock)
253 {
254         write_unlock(&torture_rwlock);
255 }
256
257 static int torture_rwlock_read_lock(void) __acquires(torture_rwlock)
258 {
259         read_lock(&torture_rwlock);
260         return 0;
261 }
262
263 static void torture_rwlock_read_delay(struct torture_random_state *trsp)
264 {
265         const unsigned long shortdelay_us = 10;
266         const unsigned long longdelay_ms = 100;
267
268         /* We want a short delay mostly to emulate likely code, and
269          * we want a long delay occasionally to force massive contention.
270          */
271         if (!(torture_random(trsp) %
272               (cxt.nrealreaders_stress * 2000 * longdelay_ms)))
273                 mdelay(longdelay_ms);
274         else
275                 udelay(shortdelay_us);
276 }
277
278 static void torture_rwlock_read_unlock(void) __releases(torture_rwlock)
279 {
280         read_unlock(&torture_rwlock);
281 }
282
283 static struct lock_torture_ops rw_lock_ops = {
284         .writelock      = torture_rwlock_write_lock,
285         .write_delay    = torture_rwlock_write_delay,
286         .task_boost     = torture_boost_dummy,
287         .writeunlock    = torture_rwlock_write_unlock,
288         .readlock       = torture_rwlock_read_lock,
289         .read_delay     = torture_rwlock_read_delay,
290         .readunlock     = torture_rwlock_read_unlock,
291         .name           = "rw_lock"
292 };
293
294 static int torture_rwlock_write_lock_irq(void) __acquires(torture_rwlock)
295 {
296         unsigned long flags;
297
298         write_lock_irqsave(&torture_rwlock, flags);
299         cxt.cur_ops->flags = flags;
300         return 0;
301 }
302
303 static void torture_rwlock_write_unlock_irq(void)
304 __releases(torture_rwlock)
305 {
306         write_unlock_irqrestore(&torture_rwlock, cxt.cur_ops->flags);
307 }
308
309 static int torture_rwlock_read_lock_irq(void) __acquires(torture_rwlock)
310 {
311         unsigned long flags;
312
313         read_lock_irqsave(&torture_rwlock, flags);
314         cxt.cur_ops->flags = flags;
315         return 0;
316 }
317
318 static void torture_rwlock_read_unlock_irq(void)
319 __releases(torture_rwlock)
320 {
321         read_unlock_irqrestore(&torture_rwlock, cxt.cur_ops->flags);
322 }
323
324 static struct lock_torture_ops rw_lock_irq_ops = {
325         .writelock      = torture_rwlock_write_lock_irq,
326         .write_delay    = torture_rwlock_write_delay,
327         .task_boost     = torture_boost_dummy,
328         .writeunlock    = torture_rwlock_write_unlock_irq,
329         .readlock       = torture_rwlock_read_lock_irq,
330         .read_delay     = torture_rwlock_read_delay,
331         .readunlock     = torture_rwlock_read_unlock_irq,
332         .name           = "rw_lock_irq"
333 };
334
335 static DEFINE_MUTEX(torture_mutex);
336
337 static int torture_mutex_lock(void) __acquires(torture_mutex)
338 {
339         mutex_lock(&torture_mutex);
340         return 0;
341 }
342
343 static void torture_mutex_delay(struct torture_random_state *trsp)
344 {
345         const unsigned long longdelay_ms = 100;
346
347         /* We want a long delay occasionally to force massive contention.  */
348         if (!(torture_random(trsp) %
349               (cxt.nrealwriters_stress * 2000 * longdelay_ms)))
350                 mdelay(longdelay_ms * 5);
351         else
352                 mdelay(longdelay_ms / 5);
353 #ifdef CONFIG_PREEMPT
354         if (!(torture_random(trsp) % (cxt.nrealwriters_stress * 20000)))
355                 preempt_schedule();  /* Allow test to be preempted. */
356 #endif
357 }
358
359 static void torture_mutex_unlock(void) __releases(torture_mutex)
360 {
361         mutex_unlock(&torture_mutex);
362 }
363
364 static struct lock_torture_ops mutex_lock_ops = {
365         .writelock      = torture_mutex_lock,
366         .write_delay    = torture_mutex_delay,
367         .task_boost     = torture_boost_dummy,
368         .writeunlock    = torture_mutex_unlock,
369         .readlock       = NULL,
370         .read_delay     = NULL,
371         .readunlock     = NULL,
372         .name           = "mutex_lock"
373 };
374
375 #include <linux/ww_mutex.h>
376 static DEFINE_WW_CLASS(torture_ww_class);
377 static DEFINE_WW_MUTEX(torture_ww_mutex_0, &torture_ww_class);
378 static DEFINE_WW_MUTEX(torture_ww_mutex_1, &torture_ww_class);
379 static DEFINE_WW_MUTEX(torture_ww_mutex_2, &torture_ww_class);
380
381 static int torture_ww_mutex_lock(void)
382 __acquires(torture_ww_mutex_0)
383 __acquires(torture_ww_mutex_1)
384 __acquires(torture_ww_mutex_2)
385 {
386         LIST_HEAD(list);
387         struct reorder_lock {
388                 struct list_head link;
389                 struct ww_mutex *lock;
390         } locks[3], *ll, *ln;
391         struct ww_acquire_ctx ctx;
392
393         locks[0].lock = &torture_ww_mutex_0;
394         list_add(&locks[0].link, &list);
395
396         locks[1].lock = &torture_ww_mutex_1;
397         list_add(&locks[1].link, &list);
398
399         locks[2].lock = &torture_ww_mutex_2;
400         list_add(&locks[2].link, &list);
401
402         ww_acquire_init(&ctx, &torture_ww_class);
403
404         list_for_each_entry(ll, &list, link) {
405                 int err;
406
407                 err = ww_mutex_lock(ll->lock, &ctx);
408                 if (!err)
409                         continue;
410
411                 ln = ll;
412                 list_for_each_entry_continue_reverse(ln, &list, link)
413                         ww_mutex_unlock(ln->lock);
414
415                 if (err != -EDEADLK)
416                         return err;
417
418                 ww_mutex_lock_slow(ll->lock, &ctx);
419                 list_move(&ll->link, &list);
420         }
421
422         ww_acquire_fini(&ctx);
423         return 0;
424 }
425
426 static void torture_ww_mutex_unlock(void)
427 __releases(torture_ww_mutex_0)
428 __releases(torture_ww_mutex_1)
429 __releases(torture_ww_mutex_2)
430 {
431         ww_mutex_unlock(&torture_ww_mutex_0);
432         ww_mutex_unlock(&torture_ww_mutex_1);
433         ww_mutex_unlock(&torture_ww_mutex_2);
434 }
435
436 static struct lock_torture_ops ww_mutex_lock_ops = {
437         .writelock      = torture_ww_mutex_lock,
438         .write_delay    = torture_mutex_delay,
439         .task_boost     = torture_boost_dummy,
440         .writeunlock    = torture_ww_mutex_unlock,
441         .readlock       = NULL,
442         .read_delay     = NULL,
443         .readunlock     = NULL,
444         .name           = "ww_mutex_lock"
445 };
446
447 #ifdef CONFIG_RT_MUTEXES
448 static DEFINE_RT_MUTEX(torture_rtmutex);
449
450 static int torture_rtmutex_lock(void) __acquires(torture_rtmutex)
451 {
452         rt_mutex_lock(&torture_rtmutex);
453         return 0;
454 }
455
456 static void torture_rtmutex_boost(struct torture_random_state *trsp)
457 {
458         int policy;
459         struct sched_param param;
460         const unsigned int factor = 50000; /* yes, quite arbitrary */
461
462         if (!rt_task(current)) {
463                 /*
464                  * Boost priority once every ~50k operations. When the
465                  * task tries to take the lock, the rtmutex it will account
466                  * for the new priority, and do any corresponding pi-dance.
467                  */
468                 if (trsp && !(torture_random(trsp) %
469                               (cxt.nrealwriters_stress * factor))) {
470                         policy = SCHED_FIFO;
471                         param.sched_priority = MAX_RT_PRIO - 1;
472                 } else /* common case, do nothing */
473                         return;
474         } else {
475                 /*
476                  * The task will remain boosted for another ~500k operations,
477                  * then restored back to its original prio, and so forth.
478                  *
479                  * When @trsp is nil, we want to force-reset the task for
480                  * stopping the kthread.
481                  */
482                 if (!trsp || !(torture_random(trsp) %
483                                (cxt.nrealwriters_stress * factor * 2))) {
484                         policy = SCHED_NORMAL;
485                         param.sched_priority = 0;
486                 } else /* common case, do nothing */
487                         return;
488         }
489
490         sched_setscheduler_nocheck(current, policy, &param);
491 }
492
493 static void torture_rtmutex_delay(struct torture_random_state *trsp)
494 {
495         const unsigned long shortdelay_us = 2;
496         const unsigned long longdelay_ms = 100;
497
498         /*
499          * We want a short delay mostly to emulate likely code, and
500          * we want a long delay occasionally to force massive contention.
501          */
502         if (!(torture_random(trsp) %
503               (cxt.nrealwriters_stress * 2000 * longdelay_ms)))
504                 mdelay(longdelay_ms);
505         if (!(torture_random(trsp) %
506               (cxt.nrealwriters_stress * 2 * shortdelay_us)))
507                 udelay(shortdelay_us);
508 #ifdef CONFIG_PREEMPT
509         if (!(torture_random(trsp) % (cxt.nrealwriters_stress * 20000)))
510                 preempt_schedule();  /* Allow test to be preempted. */
511 #endif
512 }
513
514 static void torture_rtmutex_unlock(void) __releases(torture_rtmutex)
515 {
516         rt_mutex_unlock(&torture_rtmutex);
517 }
518
519 static struct lock_torture_ops rtmutex_lock_ops = {
520         .writelock      = torture_rtmutex_lock,
521         .write_delay    = torture_rtmutex_delay,
522         .task_boost     = torture_rtmutex_boost,
523         .writeunlock    = torture_rtmutex_unlock,
524         .readlock       = NULL,
525         .read_delay     = NULL,
526         .readunlock     = NULL,
527         .name           = "rtmutex_lock"
528 };
529 #endif
530
531 static DECLARE_RWSEM(torture_rwsem);
532 static int torture_rwsem_down_write(void) __acquires(torture_rwsem)
533 {
534         down_write(&torture_rwsem);
535         return 0;
536 }
537
538 static void torture_rwsem_write_delay(struct torture_random_state *trsp)
539 {
540         const unsigned long longdelay_ms = 100;
541
542         /* We want a long delay occasionally to force massive contention.  */
543         if (!(torture_random(trsp) %
544               (cxt.nrealwriters_stress * 2000 * longdelay_ms)))
545                 mdelay(longdelay_ms * 10);
546         else
547                 mdelay(longdelay_ms / 10);
548 #ifdef CONFIG_PREEMPT
549         if (!(torture_random(trsp) % (cxt.nrealwriters_stress * 20000)))
550                 preempt_schedule();  /* Allow test to be preempted. */
551 #endif
552 }
553
554 static void torture_rwsem_up_write(void) __releases(torture_rwsem)
555 {
556         up_write(&torture_rwsem);
557 }
558
559 static int torture_rwsem_down_read(void) __acquires(torture_rwsem)
560 {
561         down_read(&torture_rwsem);
562         return 0;
563 }
564
565 static void torture_rwsem_read_delay(struct torture_random_state *trsp)
566 {
567         const unsigned long longdelay_ms = 100;
568
569         /* We want a long delay occasionally to force massive contention.  */
570         if (!(torture_random(trsp) %
571               (cxt.nrealwriters_stress * 2000 * longdelay_ms)))
572                 mdelay(longdelay_ms * 2);
573         else
574                 mdelay(longdelay_ms / 2);
575 #ifdef CONFIG_PREEMPT
576         if (!(torture_random(trsp) % (cxt.nrealreaders_stress * 20000)))
577                 preempt_schedule();  /* Allow test to be preempted. */
578 #endif
579 }
580
581 static void torture_rwsem_up_read(void) __releases(torture_rwsem)
582 {
583         up_read(&torture_rwsem);
584 }
585
586 static struct lock_torture_ops rwsem_lock_ops = {
587         .writelock      = torture_rwsem_down_write,
588         .write_delay    = torture_rwsem_write_delay,
589         .task_boost     = torture_boost_dummy,
590         .writeunlock    = torture_rwsem_up_write,
591         .readlock       = torture_rwsem_down_read,
592         .read_delay     = torture_rwsem_read_delay,
593         .readunlock     = torture_rwsem_up_read,
594         .name           = "rwsem_lock"
595 };
596
597 #include <linux/percpu-rwsem.h>
598 static struct percpu_rw_semaphore pcpu_rwsem;
599
600 void torture_percpu_rwsem_init(void)
601 {
602         BUG_ON(percpu_init_rwsem(&pcpu_rwsem));
603 }
604
605 static int torture_percpu_rwsem_down_write(void) __acquires(pcpu_rwsem)
606 {
607         percpu_down_write(&pcpu_rwsem);
608         return 0;
609 }
610
611 static void torture_percpu_rwsem_up_write(void) __releases(pcpu_rwsem)
612 {
613         percpu_up_write(&pcpu_rwsem);
614 }
615
616 static int torture_percpu_rwsem_down_read(void) __acquires(pcpu_rwsem)
617 {
618         percpu_down_read(&pcpu_rwsem);
619         return 0;
620 }
621
622 static void torture_percpu_rwsem_up_read(void) __releases(pcpu_rwsem)
623 {
624         percpu_up_read(&pcpu_rwsem);
625 }
626
627 static struct lock_torture_ops percpu_rwsem_lock_ops = {
628         .init           = torture_percpu_rwsem_init,
629         .writelock      = torture_percpu_rwsem_down_write,
630         .write_delay    = torture_rwsem_write_delay,
631         .task_boost     = torture_boost_dummy,
632         .writeunlock    = torture_percpu_rwsem_up_write,
633         .readlock       = torture_percpu_rwsem_down_read,
634         .read_delay     = torture_rwsem_read_delay,
635         .readunlock     = torture_percpu_rwsem_up_read,
636         .name           = "percpu_rwsem_lock"
637 };
638
639 /*
640  * Lock torture writer kthread.  Repeatedly acquires and releases
641  * the lock, checking for duplicate acquisitions.
642  */
643 static int lock_torture_writer(void *arg)
644 {
645         struct lock_stress_stats *lwsp = arg;
646         static DEFINE_TORTURE_RANDOM(rand);
647
648         VERBOSE_TOROUT_STRING("lock_torture_writer task started");
649         set_user_nice(current, MAX_NICE);
650
651         do {
652                 if ((torture_random(&rand) & 0xfffff) == 0)
653                         schedule_timeout_uninterruptible(1);
654
655                 cxt.cur_ops->task_boost(&rand);
656                 cxt.cur_ops->writelock();
657                 if (WARN_ON_ONCE(lock_is_write_held))
658                         lwsp->n_lock_fail++;
659                 lock_is_write_held = 1;
660                 if (WARN_ON_ONCE(lock_is_read_held))
661                         lwsp->n_lock_fail++; /* rare, but... */
662
663                 lwsp->n_lock_acquired++;
664                 cxt.cur_ops->write_delay(&rand);
665                 lock_is_write_held = 0;
666                 cxt.cur_ops->writeunlock();
667
668                 stutter_wait("lock_torture_writer");
669         } while (!torture_must_stop());
670
671         cxt.cur_ops->task_boost(NULL); /* reset prio */
672         torture_kthread_stopping("lock_torture_writer");
673         return 0;
674 }
675
676 /*
677  * Lock torture reader kthread.  Repeatedly acquires and releases
678  * the reader lock.
679  */
680 static int lock_torture_reader(void *arg)
681 {
682         struct lock_stress_stats *lrsp = arg;
683         static DEFINE_TORTURE_RANDOM(rand);
684
685         VERBOSE_TOROUT_STRING("lock_torture_reader task started");
686         set_user_nice(current, MAX_NICE);
687
688         do {
689                 if ((torture_random(&rand) & 0xfffff) == 0)
690                         schedule_timeout_uninterruptible(1);
691
692                 cxt.cur_ops->readlock();
693                 lock_is_read_held = 1;
694                 if (WARN_ON_ONCE(lock_is_write_held))
695                         lrsp->n_lock_fail++; /* rare, but... */
696
697                 lrsp->n_lock_acquired++;
698                 cxt.cur_ops->read_delay(&rand);
699                 lock_is_read_held = 0;
700                 cxt.cur_ops->readunlock();
701
702                 stutter_wait("lock_torture_reader");
703         } while (!torture_must_stop());
704         torture_kthread_stopping("lock_torture_reader");
705         return 0;
706 }
707
708 /*
709  * Create an lock-torture-statistics message in the specified buffer.
710  */
711 static void __torture_print_stats(char *page,
712                                   struct lock_stress_stats *statp, bool write)
713 {
714         bool fail = 0;
715         int i, n_stress;
716         long max = 0;
717         long min = statp[0].n_lock_acquired;
718         long long sum = 0;
719
720         n_stress = write ? cxt.nrealwriters_stress : cxt.nrealreaders_stress;
721         for (i = 0; i < n_stress; i++) {
722                 if (statp[i].n_lock_fail)
723                         fail = true;
724                 sum += statp[i].n_lock_acquired;
725                 if (max < statp[i].n_lock_fail)
726                         max = statp[i].n_lock_fail;
727                 if (min > statp[i].n_lock_fail)
728                         min = statp[i].n_lock_fail;
729         }
730         page += sprintf(page,
731                         "%s:  Total: %lld  Max/Min: %ld/%ld %s  Fail: %d %s\n",
732                         write ? "Writes" : "Reads ",
733                         sum, max, min, max / 2 > min ? "???" : "",
734                         fail, fail ? "!!!" : "");
735         if (fail)
736                 atomic_inc(&cxt.n_lock_torture_errors);
737 }
738
739 /*
740  * Print torture statistics.  Caller must ensure that there is only one
741  * call to this function at a given time!!!  This is normally accomplished
742  * by relying on the module system to only have one copy of the module
743  * loaded, and then by giving the lock_torture_stats kthread full control
744  * (or the init/cleanup functions when lock_torture_stats thread is not
745  * running).
746  */
747 static void lock_torture_stats_print(void)
748 {
749         int size = cxt.nrealwriters_stress * 200 + 8192;
750         char *buf;
751
752         if (cxt.cur_ops->readlock)
753                 size += cxt.nrealreaders_stress * 200 + 8192;
754
755         buf = kmalloc(size, GFP_KERNEL);
756         if (!buf) {
757                 pr_err("lock_torture_stats_print: Out of memory, need: %d",
758                        size);
759                 return;
760         }
761
762         __torture_print_stats(buf, cxt.lwsa, true);
763         pr_alert("%s", buf);
764         kfree(buf);
765
766         if (cxt.cur_ops->readlock) {
767                 buf = kmalloc(size, GFP_KERNEL);
768                 if (!buf) {
769                         pr_err("lock_torture_stats_print: Out of memory, need: %d",
770                                size);
771                         return;
772                 }
773
774                 __torture_print_stats(buf, cxt.lrsa, false);
775                 pr_alert("%s", buf);
776                 kfree(buf);
777         }
778 }
779
780 /*
781  * Periodically prints torture statistics, if periodic statistics printing
782  * was specified via the stat_interval module parameter.
783  *
784  * No need to worry about fullstop here, since this one doesn't reference
785  * volatile state or register callbacks.
786  */
787 static int lock_torture_stats(void *arg)
788 {
789         VERBOSE_TOROUT_STRING("lock_torture_stats task started");
790         do {
791                 schedule_timeout_interruptible(stat_interval * HZ);
792                 lock_torture_stats_print();
793                 torture_shutdown_absorb("lock_torture_stats");
794         } while (!torture_must_stop());
795         torture_kthread_stopping("lock_torture_stats");
796         return 0;
797 }
798
799 static inline void
800 lock_torture_print_module_parms(struct lock_torture_ops *cur_ops,
801                                 const char *tag)
802 {
803         pr_alert("%s" TORTURE_FLAG
804                  "--- %s%s: nwriters_stress=%d nreaders_stress=%d stat_interval=%d verbose=%d shuffle_interval=%d stutter=%d shutdown_secs=%d onoff_interval=%d onoff_holdoff=%d\n",
805                  torture_type, tag, cxt.debug_lock ? " [debug]": "",
806                  cxt.nrealwriters_stress, cxt.nrealreaders_stress, stat_interval,
807                  verbose, shuffle_interval, stutter, shutdown_secs,
808                  onoff_interval, onoff_holdoff);
809 }
810
811 static void lock_torture_cleanup(void)
812 {
813         int i;
814
815         if (torture_cleanup_begin())
816                 return;
817
818         /*
819          * Indicates early cleanup, meaning that the test has not run,
820          * such as when passing bogus args when loading the module. As
821          * such, only perform the underlying torture-specific cleanups,
822          * and avoid anything related to locktorture.
823          */
824         if (!cxt.lwsa)
825                 goto end;
826
827         if (writer_tasks) {
828                 for (i = 0; i < cxt.nrealwriters_stress; i++)
829                         torture_stop_kthread(lock_torture_writer,
830                                              writer_tasks[i]);
831                 kfree(writer_tasks);
832                 writer_tasks = NULL;
833         }
834
835         if (reader_tasks) {
836                 for (i = 0; i < cxt.nrealreaders_stress; i++)
837                         torture_stop_kthread(lock_torture_reader,
838                                              reader_tasks[i]);
839                 kfree(reader_tasks);
840                 reader_tasks = NULL;
841         }
842
843         torture_stop_kthread(lock_torture_stats, stats_task);
844         lock_torture_stats_print();  /* -After- the stats thread is stopped! */
845
846         if (atomic_read(&cxt.n_lock_torture_errors))
847                 lock_torture_print_module_parms(cxt.cur_ops,
848                                                 "End of test: FAILURE");
849         else if (torture_onoff_failures())
850                 lock_torture_print_module_parms(cxt.cur_ops,
851                                                 "End of test: LOCK_HOTPLUG");
852         else
853                 lock_torture_print_module_parms(cxt.cur_ops,
854                                                 "End of test: SUCCESS");
855
856         kfree(cxt.lwsa);
857         kfree(cxt.lrsa);
858
859 end:
860         torture_cleanup_end();
861 }
862
863 static int __init lock_torture_init(void)
864 {
865         int i, j;
866         int firsterr = 0;
867         static struct lock_torture_ops *torture_ops[] = {
868                 &lock_busted_ops,
869                 &spin_lock_ops, &spin_lock_irq_ops,
870                 &rw_lock_ops, &rw_lock_irq_ops,
871                 &mutex_lock_ops,
872                 &ww_mutex_lock_ops,
873 #ifdef CONFIG_RT_MUTEXES
874                 &rtmutex_lock_ops,
875 #endif
876                 &rwsem_lock_ops,
877                 &percpu_rwsem_lock_ops,
878         };
879
880         if (!torture_init_begin(torture_type, verbose, &torture_runnable))
881                 return -EBUSY;
882
883         /* Process args and tell the world that the torturer is on the job. */
884         for (i = 0; i < ARRAY_SIZE(torture_ops); i++) {
885                 cxt.cur_ops = torture_ops[i];
886                 if (strcmp(torture_type, cxt.cur_ops->name) == 0)
887                         break;
888         }
889         if (i == ARRAY_SIZE(torture_ops)) {
890                 pr_alert("lock-torture: invalid torture type: \"%s\"\n",
891                          torture_type);
892                 pr_alert("lock-torture types:");
893                 for (i = 0; i < ARRAY_SIZE(torture_ops); i++)
894                         pr_alert(" %s", torture_ops[i]->name);
895                 pr_alert("\n");
896                 firsterr = -EINVAL;
897                 goto unwind;
898         }
899         if (cxt.cur_ops->init)
900                 cxt.cur_ops->init();
901
902         if (nwriters_stress >= 0)
903                 cxt.nrealwriters_stress = nwriters_stress;
904         else
905                 cxt.nrealwriters_stress = 2 * num_online_cpus();
906
907 #ifdef CONFIG_DEBUG_MUTEXES
908         if (strncmp(torture_type, "mutex", 5) == 0)
909                 cxt.debug_lock = true;
910 #endif
911 #ifdef CONFIG_DEBUG_RT_MUTEXES
912         if (strncmp(torture_type, "rtmutex", 7) == 0)
913                 cxt.debug_lock = true;
914 #endif
915 #ifdef CONFIG_DEBUG_SPINLOCK
916         if ((strncmp(torture_type, "spin", 4) == 0) ||
917             (strncmp(torture_type, "rw_lock", 7) == 0))
918                 cxt.debug_lock = true;
919 #endif
920
921         /* Initialize the statistics so that each run gets its own numbers. */
922
923         lock_is_write_held = 0;
924         cxt.lwsa = kmalloc(sizeof(*cxt.lwsa) * cxt.nrealwriters_stress, GFP_KERNEL);
925         if (cxt.lwsa == NULL) {
926                 VERBOSE_TOROUT_STRING("cxt.lwsa: Out of memory");
927                 firsterr = -ENOMEM;
928                 goto unwind;
929         }
930         for (i = 0; i < cxt.nrealwriters_stress; i++) {
931                 cxt.lwsa[i].n_lock_fail = 0;
932                 cxt.lwsa[i].n_lock_acquired = 0;
933         }
934
935         if (cxt.cur_ops->readlock) {
936                 if (nreaders_stress >= 0)
937                         cxt.nrealreaders_stress = nreaders_stress;
938                 else {
939                         /*
940                          * By default distribute evenly the number of
941                          * readers and writers. We still run the same number
942                          * of threads as the writer-only locks default.
943                          */
944                         if (nwriters_stress < 0) /* user doesn't care */
945                                 cxt.nrealwriters_stress = num_online_cpus();
946                         cxt.nrealreaders_stress = cxt.nrealwriters_stress;
947                 }
948
949                 lock_is_read_held = 0;
950                 cxt.lrsa = kmalloc(sizeof(*cxt.lrsa) * cxt.nrealreaders_stress, GFP_KERNEL);
951                 if (cxt.lrsa == NULL) {
952                         VERBOSE_TOROUT_STRING("cxt.lrsa: Out of memory");
953                         firsterr = -ENOMEM;
954                         kfree(cxt.lwsa);
955                         cxt.lwsa = NULL;
956                         goto unwind;
957                 }
958
959                 for (i = 0; i < cxt.nrealreaders_stress; i++) {
960                         cxt.lrsa[i].n_lock_fail = 0;
961                         cxt.lrsa[i].n_lock_acquired = 0;
962                 }
963         }
964
965         lock_torture_print_module_parms(cxt.cur_ops, "Start of test");
966
967         /* Prepare torture context. */
968         if (onoff_interval > 0) {
969                 firsterr = torture_onoff_init(onoff_holdoff * HZ,
970                                               onoff_interval * HZ);
971                 if (firsterr)
972                         goto unwind;
973         }
974         if (shuffle_interval > 0) {
975                 firsterr = torture_shuffle_init(shuffle_interval);
976                 if (firsterr)
977                         goto unwind;
978         }
979         if (shutdown_secs > 0) {
980                 firsterr = torture_shutdown_init(shutdown_secs,
981                                                  lock_torture_cleanup);
982                 if (firsterr)
983                         goto unwind;
984         }
985         if (stutter > 0) {
986                 firsterr = torture_stutter_init(stutter);
987                 if (firsterr)
988                         goto unwind;
989         }
990
991         writer_tasks = kzalloc(cxt.nrealwriters_stress * sizeof(writer_tasks[0]),
992                                GFP_KERNEL);
993         if (writer_tasks == NULL) {
994                 VERBOSE_TOROUT_ERRSTRING("writer_tasks: Out of memory");
995                 firsterr = -ENOMEM;
996                 goto unwind;
997         }
998
999         if (cxt.cur_ops->readlock) {
1000                 reader_tasks = kzalloc(cxt.nrealreaders_stress * sizeof(reader_tasks[0]),
1001                                        GFP_KERNEL);
1002                 if (reader_tasks == NULL) {
1003                         VERBOSE_TOROUT_ERRSTRING("reader_tasks: Out of memory");
1004                         kfree(writer_tasks);
1005                         writer_tasks = NULL;
1006                         firsterr = -ENOMEM;
1007                         goto unwind;
1008                 }
1009         }
1010
1011         /*
1012          * Create the kthreads and start torturing (oh, those poor little locks).
1013          *
1014          * TODO: Note that we interleave writers with readers, giving writers a
1015          * slight advantage, by creating its kthread first. This can be modified
1016          * for very specific needs, or even let the user choose the policy, if
1017          * ever wanted.
1018          */
1019         for (i = 0, j = 0; i < cxt.nrealwriters_stress ||
1020                     j < cxt.nrealreaders_stress; i++, j++) {
1021                 if (i >= cxt.nrealwriters_stress)
1022                         goto create_reader;
1023
1024                 /* Create writer. */
1025                 firsterr = torture_create_kthread(lock_torture_writer, &cxt.lwsa[i],
1026                                                   writer_tasks[i]);
1027                 if (firsterr)
1028                         goto unwind;
1029
1030         create_reader:
1031                 if (cxt.cur_ops->readlock == NULL || (j >= cxt.nrealreaders_stress))
1032                         continue;
1033                 /* Create reader. */
1034                 firsterr = torture_create_kthread(lock_torture_reader, &cxt.lrsa[j],
1035                                                   reader_tasks[j]);
1036                 if (firsterr)
1037                         goto unwind;
1038         }
1039         if (stat_interval > 0) {
1040                 firsterr = torture_create_kthread(lock_torture_stats, NULL,
1041                                                   stats_task);
1042                 if (firsterr)
1043                         goto unwind;
1044         }
1045         torture_init_end();
1046         return 0;
1047
1048 unwind:
1049         torture_init_end();
1050         lock_torture_cleanup();
1051         return firsterr;
1052 }
1053
1054 module_init(lock_torture_init);
1055 module_exit(lock_torture_cleanup);