From 9aedf1bdec85ff067999e89b8d1638cc3703c652 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Sun, 25 Dec 2016 06:54:43 -0600 Subject: [PATCH] SMP: Fix a error introduced in 36b676eea6f132916f806587a8dffe7b3040473d and fully decouple disabling of pre-emption from critical sections. --- sched/irq/irq_csection.c | 30 ------------------------------ sched/sched/sched_unlock.c | 10 +++++----- 2 files changed, 5 insertions(+), 35 deletions(-) diff --git a/sched/irq/irq_csection.c b/sched/irq/irq_csection.c index c9f9f91c18..5b517de8bb 100644 --- a/sched/irq/irq_csection.c +++ b/sched/irq/irq_csection.c @@ -507,36 +507,6 @@ void leave_critical_section(irqstate_t flags) rtcb->irqcount = 0; spin_clrbit(&g_cpu_irqset, cpu, &g_cpu_irqsetlock, &g_cpu_irqlock); - - /* Have all CPUs released the lock? */ - - if (!spin_islocked(&g_cpu_irqlock)) - { - /* Check if there are pending tasks and that pre-emption - * is also enabled. - * - * REVISIT: Is there an issue here? up_release_pending() - * must be called from within a critical section but here - * we have just left the critical section. At least we - * still have interrupts disabled on this CPU. - */ - - if (g_pendingtasks.head != NULL && - !spin_islocked(&g_cpu_schedlock)) - { - /* Release any ready-to-run tasks that have collected - * in g_pendingtasks if the scheduler is not locked. - * - * NOTE: This operation has a very high likelihood of - * causing this task to be switched out! - * - * REVISIT: Should this not be done while we are in the - * critical section. - */ - - up_release_pending(); - } - } } } } diff --git a/sched/sched/sched_unlock.c b/sched/sched/sched_unlock.c index ff676c827a..df783dee7b 100644 --- a/sched/sched/sched_unlock.c +++ b/sched/sched/sched_unlock.c @@ -102,7 +102,8 @@ int sched_unlock(void) #ifdef CONFIG_SMP /* The lockcount has decremented to zero and we need to perform - * release our hold on the lock. + * release our hold on the lock. Pre-emption may still be locked + * from other CPUs. */ DEBUGASSERT(g_cpu_schedlock == SP_LOCKED && @@ -118,13 +119,12 @@ int sched_unlock(void) * * NOTE: This operation has a very high likelihood of causing * this task to be switched out! + * + * NOTE: In SMP mode, pre-emption may still be locked due to + * operations on other CPUs. */ -#ifdef CONFIG_SMP - if (!spin_islocked(&g_cpu_schedlock) && g_pendingtasks.head != NULL) -#else if (g_pendingtasks.head != NULL) -#endif { up_release_pending(); }