tests/kernel/smp: current CPU is not atomic
This test was whiteboxing the _current_cpu pointer to extract the CPU ID. That's actually racy: the thread can be preempted and migrated to another CPU between the _current_cpu expression and the read of the ID field. Do it right. Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
This commit is contained in:
parent
0e32f4dab0
commit
4b670bd4f5
1 changed files with 13 additions and 3 deletions
|
@ -45,6 +45,16 @@ static struct k_thread tthread[THREADS_NUM];
|
||||||
static K_THREAD_STACK_ARRAY_DEFINE(tstack, THREADS_NUM, STACK_SIZE);
|
static K_THREAD_STACK_ARRAY_DEFINE(tstack, THREADS_NUM, STACK_SIZE);
|
||||||
|
|
||||||
static volatile int thread_started[THREADS_NUM - 1];
|
static volatile int thread_started[THREADS_NUM - 1];
|
||||||
|
|
||||||
|
static int curr_cpu(void)
|
||||||
|
{
|
||||||
|
unsigned int k = arch_irq_lock();
|
||||||
|
int ret = arch_curr_cpu()->id;
|
||||||
|
|
||||||
|
arch_irq_unlock(k);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Tests for SMP
|
* @brief Tests for SMP
|
||||||
* @defgroup kernel_smp_tests SMP Tests
|
* @defgroup kernel_smp_tests SMP Tests
|
||||||
|
@ -120,7 +130,7 @@ static void child_fn(void *p1, void *p2, void *p3)
|
||||||
ARG_UNUSED(p3);
|
ARG_UNUSED(p3);
|
||||||
int parent_cpu_id = POINTER_TO_INT(p1);
|
int parent_cpu_id = POINTER_TO_INT(p1);
|
||||||
|
|
||||||
zassert_true(parent_cpu_id != arch_curr_cpu()->id,
|
zassert_true(parent_cpu_id != curr_cpu(),
|
||||||
"Parent isn't on other core");
|
"Parent isn't on other core");
|
||||||
|
|
||||||
sync_count++;
|
sync_count++;
|
||||||
|
@ -140,7 +150,7 @@ void test_cpu_id_threads(void)
|
||||||
/* Make sure idle thread runs on each core */
|
/* Make sure idle thread runs on each core */
|
||||||
k_sleep(K_MSEC(1000));
|
k_sleep(K_MSEC(1000));
|
||||||
|
|
||||||
int parent_cpu_id = arch_curr_cpu()->id;
|
int parent_cpu_id = curr_cpu();
|
||||||
|
|
||||||
k_tid_t tid = k_thread_create(&t2, t2_stack, T2_STACK_SIZE, child_fn,
|
k_tid_t tid = k_thread_create(&t2, t2_stack, T2_STACK_SIZE, child_fn,
|
||||||
INT_TO_POINTER(parent_cpu_id), NULL,
|
INT_TO_POINTER(parent_cpu_id), NULL,
|
||||||
|
@ -161,7 +171,7 @@ static void thread_entry(void *p1, void *p2, void *p3)
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
tinfo[thread_num].executed = 1;
|
tinfo[thread_num].executed = 1;
|
||||||
tinfo[thread_num].cpu_id = arch_curr_cpu()->id;
|
tinfo[thread_num].cpu_id = curr_cpu();
|
||||||
|
|
||||||
while (count++ < 5) {
|
while (count++ < 5) {
|
||||||
k_busy_wait(DELAY_US);
|
k_busy_wait(DELAY_US);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue