From dfcae8d1f14b24d1ee6e2e2a12977dbcd63b45a0 Mon Sep 17 00:00:00 2001 From: hujun5 Date: Wed, 11 Dec 2024 16:40:52 +0800 Subject: [PATCH] clock_adjtime: use small lock to protect g_adjtime_ppb g_adjtime_wdog reason: We would like to replace the critical section with a small lock. Signed-off-by: hujun5 --- sched/clock/clock_adjtime.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/sched/clock/clock_adjtime.c b/sched/clock/clock_adjtime.c index 3244ad59d6..f55767fb5a 100644 --- a/sched/clock/clock_adjtime.c +++ b/sched/clock/clock_adjtime.c @@ -49,6 +49,7 @@ static struct wdog_s g_adjtime_wdog; static long g_adjtime_ppb; +static spinlock_t g_adjtime_lock = SP_UNLOCKED; /**************************************************************************** * Private Functions @@ -58,8 +59,12 @@ static long g_adjtime_ppb; static void adjtime_wdog_callback(wdparm_t arg) { + irqstate_t flags; + UNUSED(arg); + flags = spin_lock_irqsave(&g_adjtime_lock); + #ifdef CONFIG_ARCH_HAVE_ADJTIME up_adjtime(0); #endif @@ -69,6 +74,7 @@ static void adjtime_wdog_callback(wdparm_t arg) #endif g_adjtime_ppb = 0; + spin_unlock_irqrestore(&g_adjtime_lock, flags); } /* Query remaining adjustment in microseconds */ @@ -108,7 +114,8 @@ static int adjtime_start(long long adjust_usec) ppb = -ppb_limit; } - flags = enter_critical_section(); + flags = spin_lock_irqsave(&g_adjtime_lock); + sched_lock(); /* Set new adjustment */ @@ -134,7 +141,8 @@ static int adjtime_start(long long adjust_usec) wd_cancel(&g_adjtime_wdog); } - leave_critical_section(flags); + spin_unlock_irqrestore(&g_adjtime_lock, flags); + sched_unlock(); return ret; }