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@suse.com>
---
V2:
- new patch
V5:
- avoid MISRA violation (Julien Grall)
- keep wrapper functions (Jan Beulich)
---
xen/common/spinlock.c | 18 +++++++++++++++++-
xen/drivers/char/console.c | 6 ++----
xen/include/xen/spinlock.h | 9 +++++++++
3 files changed, 28 insertions(+), 5 deletions(-)
diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c
index 11e13e1259..5ef0ac7f89 100644
--- a/xen/common/spinlock.c
+++ b/xen/common/spinlock.c
@@ -475,15 +475,31 @@ 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) )
{
lock->recurse_cpu = SPINLOCK_NO_CPU;
- spin_unlock(lock);
+ _spin_unlock(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..afa24c8e29 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__ */
--
2.35.3
rspin_unlock_irqrestore() for the console lock, add those functions
to spinlock handling and use them where needed.
Signed-off-by: Juergen Gross <jgross@suse.com>
---
V2:
- new patch
V5:
- avoid MISRA violation (Julien Grall)
- keep wrapper functions (Jan Beulich)
---
xen/common/spinlock.c | 18 +++++++++++++++++-
xen/drivers/char/console.c | 6 ++----
xen/include/xen/spinlock.h | 9 +++++++++
3 files changed, 28 insertions(+), 5 deletions(-)
diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c
index 11e13e1259..5ef0ac7f89 100644
--- a/xen/common/spinlock.c
+++ b/xen/common/spinlock.c
@@ -475,15 +475,31 @@ 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) )
{
lock->recurse_cpu = SPINLOCK_NO_CPU;
- spin_unlock(lock);
+ _spin_unlock(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..afa24c8e29 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__ */
--
2.35.3