Merge tag 'upstream-3.18-rc1-v2' of git://git.infradead.org/linux-ubifs
[firefly-linux-kernel-4.4.55.git] / kernel / locking / locktorture.c
index 9e9cd111fb0fbc3b7a8039928f716a208a57c6fe..ec8cce259779061dd863e6a48ff1dcfa1a7a131c 100644 (file)
  * Author: Paul E. McKenney <paulmck@us.ibm.com>
  *     Based on kernel/rcu/torture.c.
  */
-#include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/init.h>
 #include <linux/module.h>
 #include <linux/kthread.h>
-#include <linux/err.h>
 #include <linux/spinlock.h>
 #include <linux/rwlock.h>
 #include <linux/mutex.h>
+#include <linux/rwsem.h>
 #include <linux/smp.h>
 #include <linux/interrupt.h>
 #include <linux/sched.h>
 #include <linux/atomic.h>
-#include <linux/bitops.h>
-#include <linux/completion.h>
 #include <linux/moduleparam.h>
-#include <linux/percpu.h>
-#include <linux/notifier.h>
-#include <linux/reboot.h>
-#include <linux/freezer.h>
-#include <linux/cpu.h>
 #include <linux/delay.h>
-#include <linux/stat.h>
 #include <linux/slab.h>
-#include <linux/trace_clock.h>
-#include <asm/byteorder.h>
 #include <linux/torture.h>
 
 MODULE_LICENSE("GPL");
@@ -453,14 +441,19 @@ static int lock_torture_writer(void *arg)
        do {
                if ((torture_random(&rand) & 0xfffff) == 0)
                        schedule_timeout_uninterruptible(1);
+
                cxt.cur_ops->writelock();
                if (WARN_ON_ONCE(lock_is_write_held))
                        lwsp->n_lock_fail++;
                lock_is_write_held = 1;
+               if (WARN_ON_ONCE(lock_is_read_held))
+                       lwsp->n_lock_fail++; /* rare, but... */
+
                lwsp->n_lock_acquired++;
                cxt.cur_ops->write_delay(&rand);
                lock_is_write_held = 0;
                cxt.cur_ops->writeunlock();
+
                stutter_wait("lock_torture_writer");
        } while (!torture_must_stop());
        torture_kthread_stopping("lock_torture_writer");
@@ -482,12 +475,17 @@ static int lock_torture_reader(void *arg)
        do {
                if ((torture_random(&rand) & 0xfffff) == 0)
                        schedule_timeout_uninterruptible(1);
+
                cxt.cur_ops->readlock();
                lock_is_read_held = 1;
+               if (WARN_ON_ONCE(lock_is_write_held))
+                       lrsp->n_lock_fail++; /* rare, but... */
+
                lrsp->n_lock_acquired++;
                cxt.cur_ops->read_delay(&rand);
                lock_is_read_held = 0;
                cxt.cur_ops->readunlock();
+
                stutter_wait("lock_torture_reader");
        } while (!torture_must_stop());
        torture_kthread_stopping("lock_torture_reader");