Commit a6884f6f authored by Kumar Kartikeya Dwivedi's avatar Kumar Kartikeya Dwivedi Committed by Alexei Starovoitov
Browse files

rqspinlock: Add locktorture support



Introduce locktorture support for rqspinlock using the newly added
macros as the first in-kernel user and consumer. Guard the code with
CONFIG_BPF_SYSCALL ifdef since rqspinlock is not available otherwise.

Signed-off-by: default avatarKumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20250316040541.108729-19-memxor@gmail.com


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent e2082e32
Loading
Loading
Loading
Loading
+57 −0
Original line number Diff line number Diff line
@@ -362,6 +362,60 @@ static struct lock_torture_ops raw_spin_lock_irq_ops = {
	.name		= "raw_spin_lock_irq"
};

#ifdef CONFIG_BPF_SYSCALL

#include <asm/rqspinlock.h>
static rqspinlock_t rqspinlock;

static int torture_raw_res_spin_write_lock(int tid __maybe_unused)
{
	raw_res_spin_lock(&rqspinlock);
	return 0;
}

static void torture_raw_res_spin_write_unlock(int tid __maybe_unused)
{
	raw_res_spin_unlock(&rqspinlock);
}

static struct lock_torture_ops raw_res_spin_lock_ops = {
	.writelock	= torture_raw_res_spin_write_lock,
	.write_delay	= torture_spin_lock_write_delay,
	.task_boost     = torture_rt_boost,
	.writeunlock	= torture_raw_res_spin_write_unlock,
	.readlock       = NULL,
	.read_delay     = NULL,
	.readunlock     = NULL,
	.name		= "raw_res_spin_lock"
};

static int torture_raw_res_spin_write_lock_irq(int tid __maybe_unused)
{
	unsigned long flags;

	raw_res_spin_lock_irqsave(&rqspinlock, flags);
	cxt.cur_ops->flags = flags;
	return 0;
}

static void torture_raw_res_spin_write_unlock_irq(int tid __maybe_unused)
{
	raw_res_spin_unlock_irqrestore(&rqspinlock, cxt.cur_ops->flags);
}

static struct lock_torture_ops raw_res_spin_lock_irq_ops = {
	.writelock	= torture_raw_res_spin_write_lock_irq,
	.write_delay	= torture_spin_lock_write_delay,
	.task_boost     = torture_rt_boost,
	.writeunlock	= torture_raw_res_spin_write_unlock_irq,
	.readlock       = NULL,
	.read_delay     = NULL,
	.readunlock     = NULL,
	.name		= "raw_res_spin_lock_irq"
};

#endif

static DEFINE_RWLOCK(torture_rwlock);

static int torture_rwlock_write_lock(int tid __maybe_unused)
@@ -1168,6 +1222,9 @@ static int __init lock_torture_init(void)
		&lock_busted_ops,
		&spin_lock_ops, &spin_lock_irq_ops,
		&raw_spin_lock_ops, &raw_spin_lock_irq_ops,
#ifdef CONFIG_BPF_SYSCALL
		&raw_res_spin_lock_ops, &raw_res_spin_lock_irq_ops,
#endif
		&rw_lock_ops, &rw_lock_irq_ops,
		&mutex_lock_ops,
		&ww_mutex_lock_ops,