vkernel - Properly initialize pool tokens.
authorAntonio Huete Jimenez <tuxillo@quantumachine.net>
Mon, 8 Oct 2012 14:28:20 +0000 (16:28 +0200)
committerAntonio Huete Jimenez <tuxillo@quantumachine.net>
Mon, 8 Oct 2012 15:30:37 +0000 (17:30 +0200)
 * There was no call to init_locks() in vkernel's initialization
   code, so provide one.

 * As pool tokens weren't initialized, the attempt to copy its
   t_desc in lwkt_getalltokens() resulted in a panic. This should
   be fixed now.

 * Add a KASSERT() so that uninitialized tokens will panic the system.

Suggested by: swildner

sys/kern/lwkt_token.c
sys/platform/vkernel/platform/init.c
sys/platform/vkernel64/platform/init.c

index e56e6c9..83eada4 100644 (file)
@@ -468,6 +468,7 @@ lwkt_getalltokens(thread_t td, int spinning)
                         * Otherwise we failed to acquire all the tokens.
                         * Release whatever we did get.
                         */
+                       KASSERT(tok->t_desc, ("token %p is not initialized", tok));
                        strncpy(td->td_gd->gd_cnt.v_token_name,
                                tok->t_desc,
                                sizeof(td->td_gd->gd_cnt.v_token_name) - 1);
index 6acae97..2091c4a 100644 (file)
@@ -134,6 +134,7 @@ static void cleanpid(void);
 static int unix_connect(const char *path);
 static void usage_err(const char *ctl, ...);
 static void usage_help(_Bool);
+static void init_locks(void);
 
 static int save_ac;
 static char **save_av;
@@ -502,6 +503,26 @@ init_sys_memory(char *imageFile)
 }
 
 /*
+ * Initialize pool tokens and other necessary locks
+ */
+static void
+init_locks(void)
+{
+
+#ifdef SMP
+       /*
+        * Get the initial mplock with a count of 1 for the BSP.
+        * This uses a LOGICAL cpu ID, ie BSP == 0.
+        */
+       cpu_get_initial_mplock();
+#endif
+
+       /* our token pool needs to work early */
+       lwkt_token_pool_init();
+
+}
+
+/*
  * Initialize kernel memory.  This reserves kernel virtual memory by using
  * MAP_VPAGETABLE
  */
@@ -739,14 +760,7 @@ init_vkernel(void)
        mi_proc0init(&gd->mi, proc0paddr);
        lwp0.lwp_md.md_regs = &proc0_tf;
 
-       /*init_locks();*/
-#ifdef SMP
-       /*
-        * Get the initial mplock with a count of 1 for the BSP.
-        * This uses a LOGICAL cpu ID, ie BSP == 0.
-        */
-       cpu_get_initial_mplock();
-#endif
+       init_locks();
        cninit();
        rand_initialize();
 #if 0  /* #ifdef DDB */
index a8c984d..92a1bcd 100644 (file)
@@ -131,6 +131,7 @@ static void cleanpid(void);
 static int unix_connect(const char *path);
 static void usage_err(const char *ctl, ...);
 static void usage_help(_Bool);
+static void init_locks(void);
 
 static int save_ac;
 static char **save_av;
@@ -675,6 +676,28 @@ init_globaldata(void)
        tls_set_gs(&CPU_prvspace[0], sizeof(struct privatespace));
 }
 
+
+/*
+ * Initialize pool tokens and other necessary locks
+ */
+static void
+init_locks(void)
+{
+
+#ifdef SMP
+        /*
+         * Get the initial mplock with a count of 1 for the BSP.
+         * This uses a LOGICAL cpu ID, ie BSP == 0.
+         */
+        cpu_get_initial_mplock();
+#endif
+
+        /* our token pool needs to work early */
+        lwkt_token_pool_init();
+
+}
+
+
 /*
  * Initialize very low level systems including thread0, proc0, etc.
  */
@@ -700,14 +723,7 @@ init_vkernel(void)
        mi_proc0init(&gd->mi, proc0paddr);
        lwp0.lwp_md.md_regs = &proc0_tf;
 
-       /*init_locks();*/
-#ifdef SMP
-       /*
-        * Get the initial mplock with a count of 1 for the BSP.
-        * This uses a LOGICAL cpu ID, ie BSP == 0.
-        */
-       cpu_get_initial_mplock();
-#endif
+       init_locks();
        cninit();
        rand_initialize();
 #if 0  /* #ifdef DDB */