diff --git a/drivers/note/note_driver.c b/drivers/note/note_driver.c index 8cbcb0c1bb6..d2f4dc3cd80 100644 --- a/drivers/note/note_driver.c +++ b/drivers/note/note_driver.c @@ -171,7 +171,8 @@ FAR static struct note_driver_s * static struct note_taskname_s g_note_taskname; #endif -#if defined(CONFIG_SCHED_INSTRUMENTATION_FILTER) +#if defined(CONFIG_SCHED_INSTRUMENTATION_FILTER) || \ + defined(CONFIG_SCHED_INSTRUMENTATION_PREEMPTION) static spinlock_t g_note_lock; #endif @@ -1056,7 +1057,9 @@ void sched_note_preemption(FAR struct tcb_s *tcb, bool locked) struct note_preempt_s note; FAR struct note_driver_s **driver; bool formatted = false; + irqstate_t flags; + flags = spin_lock_irqsave_notrace(&g_note_lock); for (driver = g_note_drivers; *driver; driver++) { if (!note_isenabled(*driver)) @@ -1088,6 +1091,8 @@ void sched_note_preemption(FAR struct tcb_s *tcb, bool locked) note_add(*driver, ¬e, sizeof(struct note_preempt_s)); } + + spin_unlock_irqrestore_notrace(&g_note_lock, flags); } #endif diff --git a/sched/sched/sched_critmonitor.c b/sched/sched/sched_critmonitor.c index 610b07e35cd..2843d51348b 100644 --- a/sched/sched/sched_critmonitor.c +++ b/sched/sched/sched_critmonitor.c @@ -86,6 +86,14 @@ # define CHECK_THREAD(pid, elapsed) #endif +/**************************************************************************** + * Private Data + ****************************************************************************/ + +#if CONFIG_SCHED_CRITMONITOR_MAXTIME_PREEMPTION >= 0 +static spinlock_t g_crimonitor_lock = SP_UNLOCKED; +#endif + /**************************************************************************** * Public Data ****************************************************************************/ @@ -175,6 +183,9 @@ void nxsched_critmon_preemption(FAR struct tcb_s *tcb, bool state, FAR void *caller) { clock_t current = perf_gettime(); + irqstate_t flags; + + flags = spin_lock_irqsave_notrace(&g_crimonitor_lock); /* Are we enabling or disabling pre-emption */ @@ -206,6 +217,8 @@ void nxsched_critmon_preemption(FAR struct tcb_s *tcb, bool state, g_preemp_max[cpu] = elapsed; } } + + spin_unlock_irqrestore_notrace(&g_crimonitor_lock, flags); } #endif /* CONFIG_SCHED_CRITMONITOR_MAXTIME_PREEMPTION >= 0 */