You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ma...@apache.org on 2020/11/21 22:48:08 UTC
[incubator-nuttx] 05/06: arch: xtensa: Fix the pause handler for SMP
This is an automated email from the ASF dual-hosted git repository.
masayuki pushed a commit to branch releases/10.0
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit d1a6f7969c06625981077ac623d042b14944ea48
Author: Masayuki Ishikawa <ma...@gmail.com>
AuthorDate: Fri Nov 20 13:47:56 2020 +0900
arch: xtensa: Fix the pause handler for SMP
Summary:
- Apply the same logic added to cxd56_cpupause.c
Impact:
- SMP only
Testing:
- Tested with esp32-core:smp (QEMU)
- Run smp and ostest
Signed-off-by: Masayuki Ishikawa <Ma...@jp.sony.com>
---
arch/xtensa/src/common/xtensa_cpupause.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/arch/xtensa/src/common/xtensa_cpupause.c b/arch/xtensa/src/common/xtensa_cpupause.c
index 5b59200..0d7c486 100644
--- a/arch/xtensa/src/common/xtensa_cpupause.c
+++ b/arch/xtensa/src/common/xtensa_cpupause.c
@@ -192,7 +192,18 @@ void xtensa_pause_handler(void)
if (spin_islocked(&g_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();
+
up_cpu_paused(cpu);
+
+ leave_critical_section(flags);
}
}