diff --git a/include/asm-generic/rqspinlock.h b/include/asm-generic/rqspinlock.h index 6d4244d643df3..855c094355060 100644 --- a/include/asm-generic/rqspinlock.h +++ b/include/asm-generic/rqspinlock.h @@ -171,7 +171,7 @@ static __always_inline void release_held_lock_entry(void) * * -EDEADLK - Lock acquisition failed because of AA/ABBA deadlock. * * -ETIMEDOUT - Lock acquisition failed because of timeout. */ -static __always_inline int res_spin_lock(rqspinlock_t *lock) +static __always_inline __must_check int res_spin_lock(rqspinlock_t *lock) { int val = 0; @@ -223,27 +223,36 @@ static __always_inline void res_spin_unlock(rqspinlock_t *lock) #define raw_res_spin_lock_init(lock) ({ *(lock) = (rqspinlock_t){0}; }) #endif -#define raw_res_spin_lock(lock) \ - ({ \ - int __ret; \ - preempt_disable(); \ - __ret = res_spin_lock(lock); \ - if (__ret) \ - preempt_enable(); \ - __ret; \ - }) +static __always_inline __must_check int raw_res_spin_lock(rqspinlock_t *lock) +{ + int ret; + + preempt_disable(); + ret = res_spin_lock(lock); + if (ret) + preempt_enable(); + + return ret; +} #define raw_res_spin_unlock(lock) ({ res_spin_unlock(lock); preempt_enable(); }) -#define raw_res_spin_lock_irqsave(lock, flags) \ - ({ \ - int __ret; \ - local_irq_save(flags); \ - __ret = raw_res_spin_lock(lock); \ - if (__ret) \ - local_irq_restore(flags); \ - __ret; \ - }) +static __always_inline __must_check int +__raw_res_spin_lock_irqsave(rqspinlock_t *lock, unsigned long *flags) +{ + unsigned long __flags; + int ret; + + local_irq_save(__flags); + ret = raw_res_spin_lock(lock); + if (ret) + local_irq_restore(__flags); + + *flags = __flags; + return ret; +} + +#define raw_res_spin_lock_irqsave(lock, flags) __raw_res_spin_lock_irqsave(lock, &flags) #define raw_res_spin_unlock_irqrestore(lock, flags) ({ raw_res_spin_unlock(lock); local_irq_restore(flags); }) diff --git a/kernel/locking/locktorture.c b/kernel/locking/locktorture.c index ce0362f0a8719..2b3686b969071 100644 --- a/kernel/locking/locktorture.c +++ b/kernel/locking/locktorture.c @@ -369,8 +369,7 @@ static rqspinlock_t rqspinlock; static int torture_raw_res_spin_write_lock(int tid __maybe_unused) { - raw_res_spin_lock(&rqspinlock); - return 0; + return raw_res_spin_lock(&rqspinlock); } static void torture_raw_res_spin_write_unlock(int tid __maybe_unused) @@ -392,8 +391,12 @@ static struct lock_torture_ops raw_res_spin_lock_ops = { static int torture_raw_res_spin_write_lock_irq(int tid __maybe_unused) { unsigned long flags; + int err; + + err = raw_res_spin_lock_irqsave(&rqspinlock, flags); + if (err) + return err; - raw_res_spin_lock_irqsave(&rqspinlock, flags); cxt.cur_ops->flags = flags; return 0; }