arch/all: in smp pthread_cancel occasionally deadlock except for arm64

please reference the issue here for more information:
https://github.com/apache/nuttx/pull/9065

Signed-off-by: hujun5 <hujun5@xiaomi.com>
This commit is contained in:
hujun5
2023-05-11 12:27:13 +08:00
committed by Masayuki Ishikawa
parent c60d59d825
commit 35b597ec2c
10 changed files with 147 additions and 0 deletions
+13
View File
@@ -58,6 +58,7 @@
volatile spinlock_t g_cpu_wait[CONFIG_SMP_NCPUS];
volatile spinlock_t g_cpu_paused[CONFIG_SMP_NCPUS];
volatile spinlock_t g_cpu_resumed[CONFIG_SMP_NCPUS];
/****************************************************************************
* Public Functions
@@ -133,6 +134,11 @@ int up_cpu_paused(int cpu)
/* Wait for the spinlock to be released */
spin_unlock(&g_cpu_paused[cpu]);
/* Ensure the CPU has been resumed to avoid causing a deadlock */
spin_lock(&g_cpu_resumed[cpu]);
spin_lock(&g_cpu_wait[cpu]);
/* Restore the exception context of the tcb at the (new) head of the
@@ -158,6 +164,7 @@ int up_cpu_paused(int cpu)
sparc_restorestate(tcb->xcp.regs);
spin_unlock(&g_cpu_wait[cpu]);
spin_unlock(&g_cpu_resumed[cpu]);
return OK;
}
@@ -320,5 +327,11 @@ int up_cpu_resume(int cpu)
spin_unlock(&g_cpu_wait[cpu]);
/* Ensure the CPU has been resumed to avoid causing a deadlock */
spin_lock(&g_cpu_resumed[cpu]);
spin_unlock(&g_cpu_resumed[cpu]);
return 0;
}