arch: k210: Fix the pause handler for SMP
Summary: - Apply the same logic added to cxd56_cpupause.c Impact: - SMP only Testing: - Tested with maix-bit:smp (QEMU) - Run smp and ostest Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
This commit is contained in:
parent
42dea9edf9
commit
a500bd0238
@ -205,6 +205,7 @@ int up_cpu_paused(int cpu)
|
|||||||
int riscv_pause_handler(int irq, void *c, FAR void *arg)
|
int riscv_pause_handler(int irq, void *c, FAR void *arg)
|
||||||
{
|
{
|
||||||
int cpu = up_cpu_index();
|
int cpu = up_cpu_index();
|
||||||
|
int ret = OK;
|
||||||
|
|
||||||
/* Clear machine software interrupt */
|
/* Clear machine software interrupt */
|
||||||
|
|
||||||
@ -217,10 +218,21 @@ int riscv_pause_handler(int irq, void *c, FAR void *arg)
|
|||||||
|
|
||||||
if (spin_islocked(&g_cpu_paused[cpu]))
|
if (spin_islocked(&g_cpu_paused[cpu]))
|
||||||
{
|
{
|
||||||
return up_cpu_paused(cpu);
|
/* NOTE: up_cpu_paused() needs to be executed in a critical section
|
||||||
|
* to ensure that this CPU holds g_cpu_irqlock. However, adding
|
||||||
|
* a critical section in up_cpu_paused() is not a good idea,
|
||||||
|
* because it is also called in enter_critical_section() to break
|
||||||
|
* a deadlock
|
||||||
|
*/
|
||||||
|
|
||||||
|
irqstate_t flags = enter_critical_section();
|
||||||
|
|
||||||
|
ret = up_cpu_paused(cpu);
|
||||||
|
|
||||||
|
leave_critical_section(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
Loading…
Reference in New Issue
Block a user