arch: lc823450: Fix the pause handler for SMP

Summary:
- Apply the same logic added to cxd56_cpupause.c

Impact:
- SMP only

Testing:
- Tested with lc823450-xgevk:rndis
- Run smp and ostest

Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
This commit is contained in:
Masayuki Ishikawa 2020-11-20 13:36:17 +09:00 committed by Xiang Xiao
parent 1978dcc9a9
commit 42dea9edf9

View File

@ -190,6 +190,7 @@ int up_cpu_paused(int cpu)
int lc823450_pause_handler(int irq, void *c, FAR void *arg) int lc823450_pause_handler(int irq, void *c, FAR void *arg)
{ {
int cpu = up_cpu_index(); int cpu = up_cpu_index();
int ret = OK;
/* Clear : Pause IRQ */ /* Clear : Pause IRQ */
@ -211,10 +212,21 @@ int lc823450_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;
} }
/**************************************************************************** /****************************************************************************