From 81448b5021d79867dcbd3443efa0ad04c2a74f20 Mon Sep 17 00:00:00 2001 From: yinshengkai <yinshengkai@xiaomi.com> Date: Wed, 28 Dec 2022 14:30:38 +0800 Subject: [PATCH] sched/irq: add spin_unlock_irqsave/irqrestore_wo_note Signed-off-by: yinshengkai <yinshengkai@xiaomi.com> --- include/nuttx/spinlock.h | 20 +++++++++++++++ sched/irq/irq_spinlock.c | 53 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/include/nuttx/spinlock.h b/include/nuttx/spinlock.h index 544352ef53..4d77b8611f 100644 --- a/include/nuttx/spinlock.h +++ b/include/nuttx/spinlock.h @@ -390,6 +390,16 @@ irqstate_t spin_lock_irqsave(spinlock_t *lock); # define spin_lock_irqsave(l) ((void)(l), up_irq_save()) #endif +/**************************************************************************** + * Name: spin_lock_irqsave_wo_note + ****************************************************************************/ + +#if defined(CONFIG_SMP) +irqstate_t spin_lock_irqsave_wo_note(spinlock_t *lock); +#else +# define spin_lock_irqsave_wo_note(l) ((void)(l), up_irq_save()) +#endif + /**************************************************************************** * Name: spin_unlock_irqrestore * @@ -425,4 +435,14 @@ void spin_unlock_irqrestore(spinlock_t *lock, irqstate_t flags); # define spin_unlock_irqrestore(l, f) up_irq_restore(f) #endif +/**************************************************************************** + * Name: spin_unlock_irqrestore_wo_note + ****************************************************************************/ + +#if defined(CONFIG_SMP) +void spin_unlock_irqrestore_wo_note(spinlock_t *lock, irqstate_t flags); +#else +# define spin_unlock_irqrestore_wo_note(l, f) up_irq_restore(f) +#endif + #endif /* __INCLUDE_NUTTX_SPINLOCK_H */ diff --git a/sched/irq/irq_spinlock.c b/sched/irq/irq_spinlock.c index c828b57ca5..8c4f11eb68 100644 --- a/sched/irq/irq_spinlock.c +++ b/sched/irq/irq_spinlock.c @@ -106,6 +106,34 @@ irqstate_t spin_lock_irqsave(spinlock_t *lock) return ret; } +/**************************************************************************** + * Name: spin_lock_irqsave_wo_note + ****************************************************************************/ + +irqstate_t spin_lock_irqsave_wo_note(spinlock_t *lock) +{ + irqstate_t ret; + ret = up_irq_save(); + + if (NULL == lock) + { + int me = this_cpu(); + if (0 == g_irq_spin_count[me]) + { + spin_lock_wo_note(&g_irq_spin); + } + + g_irq_spin_count[me]++; + DEBUGASSERT(0 != g_irq_spin_count[me]); + } + else + { + spin_lock_wo_note(lock); + } + + return ret; +} + /**************************************************************************** * Name: spin_unlock_irqrestore * @@ -156,4 +184,29 @@ void spin_unlock_irqrestore(spinlock_t *lock, irqstate_t flags) up_irq_restore(flags); } +/**************************************************************************** + * Name: spin_lock_irqsave_wo_note + ****************************************************************************/ + +void spin_unlock_irqrestore_wo_note(spinlock_t *lock, irqstate_t flags) +{ + if (NULL == lock) + { + int me = this_cpu(); + DEBUGASSERT(0 < g_irq_spin_count[me]); + g_irq_spin_count[me]--; + + if (0 == g_irq_spin_count[me]) + { + spin_unlock_wo_note(&g_irq_spin); + } + } + else + { + spin_unlock_wo_note(lock); + } + + up_irq_restore(flags); +} + #endif /* CONFIG_SMP */