SMP: Fix a error introduced in 36b676eea6
and fully decouple disabling of pre-emption from critical sections.
This commit is contained in:
parent
ea7b673174
commit
9aedf1bdec
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue