From a5ac4463c28a0583df320cd294875a3fa2bea57b Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Thu, 15 Jul 2021 18:25:48 +0800 Subject: [PATCH] sched/init: initialize all idle thread's tl_task since this patch forget to initialize the idle tls info: commit 50c08bf45b1adcafc409480f300ac49a4b2c689c Author: Huang Qi Date: Tue Jun 29 16:01:02 2021 +0800 libc: Move pthread_key_destructor to task_info_s Signed-off-by: Xiang Xiao Change-Id: If7d0c0118323fa3dcf44081d675cd57b14eba75a --- sched/init/nx_smpstart.c | 27 +----------------- sched/init/nx_start.c | 61 ++++++++++++++++++++++++---------------- 2 files changed, 38 insertions(+), 50 deletions(-) diff --git a/sched/init/nx_smpstart.c b/sched/init/nx_smpstart.c index 4bcb7125b00..bb7675dbf04 100644 --- a/sched/init/nx_smpstart.c +++ b/sched/init/nx_smpstart.c @@ -34,7 +34,6 @@ #include #include #include -#include #include "group/group.h" #include "sched/sched.h" @@ -113,31 +112,7 @@ int nx_smp_start(void) int ret; int cpu; - /* Create a stack for all CPU IDLE threads (except CPU0 which already has - * a stack). - */ - - for (cpu = 1; cpu < CONFIG_SMP_NCPUS; cpu++) - { - FAR struct tcb_s *tcb = current_task(cpu); - DEBUGASSERT(tcb != NULL); - - ret = up_cpu_idlestack(cpu, tcb, CONFIG_IDLETHREAD_STACKSIZE); - if (ret < 0) - { - serr("ERROR: Failed to allocate stack for CPU%d\n", cpu); - return ret; - } - - /* Initialize the processor-specific portion of the TCB */ - - up_initial_state(tcb); - up_stack_frame(tcb, sizeof(struct task_info_s)); - } - - /* Then start all of the other CPUs after we have completed the memory - * allocations. CPU0 is already running. - */ + /* Start all of the other CPUs. CPU0 is already running. */ for (cpu = 1; cpu < CONFIG_SMP_NCPUS; cpu++) { diff --git a/sched/init/nx_start.c b/sched/init/nx_start.c index eff067d6b8e..f54095f3dcb 100644 --- a/sched/init/nx_start.c +++ b/sched/init/nx_start.c @@ -475,16 +475,6 @@ void nx_start(void) /* Mark the idle task as the running task */ g_running_tasks[i] = &g_idletcb[i].cmn; - - /* Initialize the 1st processor-specific portion of the TCB - * Note: other idle thread get initialized in nx_smpstart - */ - - if (i == 0) - { - up_initial_state(&g_idletcb[i].cmn); - up_stack_frame(&g_idletcb[i].cmn, sizeof(struct task_info_s)); - } } /* Task lists are initialized */ @@ -566,8 +556,11 @@ void nx_start(void) g_pidhash[i].pid = INVALID_PROCESS_ID; } + /* IDLE Group Initialization **********************************************/ + for (i = 0; i < CONFIG_SMP_NCPUS; i++) { + FAR struct tls_info_s *info; int hashndx; /* Assign the process ID(s) of ZERO to the idle task(s) */ @@ -575,6 +568,39 @@ void nx_start(void) hashndx = PIDHASH(i); g_pidhash[hashndx].tcb = &g_idletcb[i].cmn; g_pidhash[hashndx].pid = i; + + /* Allocate the IDLE group */ + + DEBUGVERIFY(group_allocate(&g_idletcb[i], g_idletcb[i].cmn.flags)); + +#ifdef CONFIG_SMP + /* Create a stack for all CPU IDLE threads (except CPU0 which already + * has a stack). + */ + + if (i > 0) + { + DEBUGVERIFY(up_cpu_idlestack(i, &g_idletcb[i].cmn, + CONFIG_IDLETHREAD_STACKSIZE)); + } +#endif + + /* Initialize the processor-specific portion of the TCB */ + + up_initial_state(&g_idletcb[i].cmn); + + /* Initialize the thread local storage */ + + info = up_stack_frame(&g_idletcb[i].cmn, sizeof(struct tls_info_s)); + DEBUGASSERT(info == g_idletcb[i].cmn.stack_alloc_ptr); + info->tl_task = g_idletcb[i].cmn.group->tg_info; + + /* Complete initialization of the IDLE group. Suppress retention + * of child status in the IDLE group. + */ + + DEBUGVERIFY(group_initialize(&g_idletcb[i])); + g_idletcb[i].cmn.group->tg_flags = GROUP_FLAG_NOCLDWAIT; } g_lastpid = CONFIG_SMP_NCPUS - 1; @@ -703,20 +729,14 @@ void nx_start(void) binfmt_initialize(); #endif - /* IDLE Group Initialization **********************************************/ - /* Announce that the CPU0 IDLE task has started */ sched_note_start(&g_idletcb[0].cmn); - /* Initialize the IDLE group for the IDLE task of each CPU */ + /* Initialize stdio for the IDLE task of each CPU */ for (i = 0; i < CONFIG_SMP_NCPUS; i++) { - /* Allocate the IDLE group */ - - DEBUGVERIFY(group_allocate(&g_idletcb[i], g_idletcb[i].cmn.flags)); - if (i > 0) { /* Clone stdout, stderr, stdin from the CPU0 IDLE task. */ @@ -732,13 +752,6 @@ void nx_start(void) DEBUGVERIFY(group_setupidlefiles(&g_idletcb[i])); } - - /* Complete initialization of the IDLE group. Suppress retention - * of child status in the IDLE group. - */ - - DEBUGVERIFY(group_initialize(&g_idletcb[i])); - g_idletcb[i].cmn.group->tg_flags = GROUP_FLAG_NOCLDWAIT; } /* Start SYSLOG ***********************************************************/