[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] xen/spinlock: add rspin_[un]lock_irq[save|restore]()
commit cc3e8df542ed1edc275a8cedd1e9de43d971eb09 Author: Juergen Gross <jgross@xxxxxxxx> AuthorDate: Tue Mar 19 11:25:59 2024 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Tue Mar 19 11:25:59 2024 +0100 xen/spinlock: add rspin_[un]lock_irq[save|restore]() Instead of special casing rspin_lock_irqsave() and rspin_unlock_irqrestore() for the console lock, add those functions to spinlock handling and use them where needed. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> --- xen/common/spinlock.c | 16 ++++++++++++++++ xen/drivers/char/console.c | 6 ++---- xen/include/xen/spinlock.h | 9 +++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c index 11e13e1259..0e628b3513 100644 --- a/xen/common/spinlock.c +++ b/xen/common/spinlock.c @@ -475,6 +475,16 @@ void _rspin_lock(rspinlock_t *lock) lock->recurse_cnt++; } +unsigned long _rspin_lock_irqsave(rspinlock_t *lock) +{ + unsigned long flags; + + local_irq_save(flags); + _rspin_lock(lock); + + return flags; +} + void _rspin_unlock(rspinlock_t *lock) { if ( likely(--lock->recurse_cnt == 0) ) @@ -484,6 +494,12 @@ void _rspin_unlock(rspinlock_t *lock) } } +void _rspin_unlock_irqrestore(rspinlock_t *lock, unsigned long flags) +{ + _rspin_unlock(lock); + local_irq_restore(flags); +} + #ifdef CONFIG_DEBUG_LOCK_PROFILE struct lock_profile_anc { diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index eca17b55b4..ccd5f8cc14 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -1161,16 +1161,14 @@ unsigned long console_lock_recursive_irqsave(void) { unsigned long flags; - local_irq_save(flags); - rspin_lock(&console_lock); + rspin_lock_irqsave(&console_lock, flags); return flags; } void console_unlock_recursive_irqrestore(unsigned long flags) { - rspin_unlock(&console_lock); - local_irq_restore(flags); + rspin_unlock_irqrestore(&console_lock, flags); } void console_force_unlock(void) diff --git a/xen/include/xen/spinlock.h b/xen/include/xen/spinlock.h index 50f6580f52..89af52b822 100644 --- a/xen/include/xen/spinlock.h +++ b/xen/include/xen/spinlock.h @@ -272,7 +272,15 @@ static always_inline void spin_lock_if(bool condition, spinlock_t *l) */ bool _rspin_trylock(rspinlock_t *lock); void _rspin_lock(rspinlock_t *lock); +#define rspin_lock_irqsave(l, f) \ + ({ \ + BUILD_BUG_ON(sizeof(f) != sizeof(unsigned long)); \ + (f) = _rspin_lock_irqsave(l); \ + block_lock_speculation(); \ + }) +unsigned long _rspin_lock_irqsave(rspinlock_t *lock); void _rspin_unlock(rspinlock_t *lock); +void _rspin_unlock_irqrestore(rspinlock_t *lock, unsigned long flags); static always_inline void rspin_lock(rspinlock_t *lock) { @@ -282,5 +290,6 @@ static always_inline void rspin_lock(rspinlock_t *lock) #define rspin_trylock(l) lock_evaluate_nospec(_rspin_trylock(l)) #define rspin_unlock(l) _rspin_unlock(l) +#define rspin_unlock_irqrestore(l, f) _rspin_unlock_irqrestore(l, f) #endif /* __SPINLOCK_H__ */ -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |