Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e086481b authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

rcutorture: Add a lock_busted to test the test



This commit adds a maximally broken locking primitive in which
lock acquisition and release are both no-ops.

Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: default avatarJosh Triplett <josh@joshtriplett.org>
parent b46f358a
Loading
Loading
Loading
Loading
+32 −1
Original line number Diff line number Diff line
@@ -112,6 +112,37 @@ static struct lock_torture_ops *cur_ops;
 * Definitions for lock torture testing.
 */

static int torture_lock_busted_write_lock(void)
{
	return 0;  /* BUGGY, do not use in real life!!! */
}

static void torture_lock_busted_write_delay(struct torture_random_state *trsp)
{
	const unsigned long longdelay_us = 100;

	/* We want a long delay occasionally to force massive contention.  */
	if (!(torture_random(trsp) %
	      (nrealwriters_stress * 2000 * longdelay_us)))
		mdelay(longdelay_us);
#ifdef CONFIG_PREEMPT
	if (!(torture_random(trsp) % (nrealwriters_stress * 20000)))
		preempt_schedule();  /* Allow test to be preempted. */
#endif
}

static void torture_lock_busted_write_unlock(void)
{
	  /* BUGGY, do not use in real life!!! */
}

static struct lock_torture_ops lock_busted_ops = {
	.writelock	= torture_lock_busted_write_lock,
	.write_delay	= torture_lock_busted_write_delay,
	.writeunlock	= torture_lock_busted_write_unlock,
	.name		= "lock_busted"
};

static DEFINE_SPINLOCK(torture_spinlock);

static int torture_spin_lock_write_lock(void) __acquires(torture_spinlock)
@@ -320,7 +351,7 @@ static int __init lock_torture_init(void)
	int i;
	int firsterr = 0;
	static struct lock_torture_ops *torture_ops[] = {
		&spin_lock_ops, &spin_lock_irq_ops,
		&lock_busted_ops, &spin_lock_ops, &spin_lock_irq_ops,
	};

	torture_init_begin(torture_type, verbose, &locktorture_runnable);