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: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20250316040541.108729-19-memxor@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
Kumar Kartikeya Dwivedi
2025-03-15 21:05:34 -07:00
committed by Alexei Starovoitov
parent e2082e32fd
commit a6884f6f1d

View File

@@ -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,