From 3b6f463ce2b54d1934e4357b4ea1d81635161c95 Mon Sep 17 00:00:00 2001 From: chenrun1 Date: Tue, 31 Dec 2024 14:31:46 +0800 Subject: [PATCH] syslog_inbuffer:Fixed the lock reentry issue in single core + spinlock scenario Summary: When spinlock.h is enabled in a single-core scenario, spinlock reentry and exceptions may occur when spin_lock_irqsave_wo_note is used in syslog_add_intbuffer Signed-off-by: chenrun1 --- drivers/syslog/syslog_intbuffer.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/syslog/syslog_intbuffer.c b/drivers/syslog/syslog_intbuffer.c index d874819d4e2..beaef2b1074 100644 --- a/drivers/syslog/syslog_intbuffer.c +++ b/drivers/syslog/syslog_intbuffer.c @@ -104,8 +104,6 @@ static void syslog_flush_internal(bool force, size_t buflen) * concurrent modification by other tasks. */ - flags = spin_lock_irqsave_wo_note(&g_syslog_intbuffer.splock); - do { buffer = circbuf_get_readptr(&g_syslog_intbuffer.circ, &size); @@ -118,8 +116,6 @@ static void syslog_flush_internal(bool force, size_t buflen) } } while (size > 0 && buflen > 0); - - spin_unlock_irqrestore_wo_note(&g_syslog_intbuffer.splock, flags); } /**************************************************************************** @@ -201,7 +197,11 @@ void syslog_add_intbuffer(FAR const char *buffer, size_t buflen) void syslog_flush_intbuffer(bool force) { + irqstate_t flags; + + flags = spin_lock_irqsave_wo_note(&g_syslog_intbuffer.splock); syslog_flush_internal(force, sizeof(g_syslog_intbuffer.buffer)); + spin_unlock_irqrestore_wo_note(&g_syslog_intbuffer.splock, flags); } #endif /* CONFIG_SYSLOG_INTBUFFER */