sched/init: initialize all idle thread's tl_task
since this patch forget to initialize the idle tls info:
commit 50c08bf45b
Author: Huang Qi <huangqi3@xiaomi.com>
Date: Tue Jun 29 16:01:02 2021 +0800
libc: Move pthread_key_destructor to task_info_s
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
Change-Id: If7d0c0118323fa3dcf44081d675cd57b14eba75a
This commit is contained in:
parent
bd74dc2b88
commit
a5ac4463c2
@ -34,7 +34,6 @@
|
||||
#include <nuttx/kmalloc.h>
|
||||
#include <nuttx/sched.h>
|
||||
#include <nuttx/sched_note.h>
|
||||
#include <nuttx/tls.h>
|
||||
|
||||
#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++)
|
||||
{
|
||||
|
@ -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 ***********************************************************/
|
||||
|
Loading…
Reference in New Issue
Block a user