You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2021/07/15 15:23:58 UTC

[incubator-nuttx] 02/02: sched/init: initialize all idle thread's tl_task

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch init
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit 2883234a0dee7aa69680f44dfb377bbe55cfc444
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Thu Jul 15 18:25:48 2021 +0800

    sched/init: initialize all idle thread's tl_task
    
    commit 50c08bf45b1adcafc409480f300ac49a4b2c689c
    Author: Huang Qi <hu...@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 <xi...@xiaomi.com>
    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 4bcb712..bb7675d 100644
--- a/sched/init/nx_smpstart.c
+++ b/sched/init/nx_smpstart.c
@@ -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++)
     {
diff --git a/sched/init/nx_start.c b/sched/init/nx_start.c
index eff067d..97d11ad 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 tdout, stderr, stdin 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 ***********************************************************/