Clean up thread priority and critical section handling during boot. The
authorMatthew Dillon <dillon@dragonflybsd.org>
Wed, 24 Sep 2003 18:37:54 +0000 (18:37 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Wed, 24 Sep 2003 18:37:54 +0000 (18:37 +0000)
initial kernel threads (e.g. thread0/proc0) had a priority lower then userland!
Default them to the minimum kernel thread priority.

Thread0 was also unnecessarily left in a critical section, which prevented
certain device probes, such as the APIC 8254 timer test code, from working.

sys/kern/init_main.c
sys/kern/lwkt_thread.c
sys/sys/kernel.h
sys/sys/thread.h
sys/vm/vm_glue.c

index 0c6a9c1..5ce1e88 100644 (file)
@@ -40,7 +40,7 @@
  *
  *     @(#)init_main.c 8.9 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/init_main.c,v 1.134.2.8 2003/06/06 20:21:32 tegge Exp $
- * $DragonFly: src/sys/kern/init_main.c,v 1.22 2003/08/03 10:07:41 hmp Exp $
+ * $DragonFly: src/sys/kern/init_main.c,v 1.23 2003/09/24 18:37:48 dillon Exp $
  */
 
 #include "opt_init_path.h"
@@ -63,6 +63,7 @@
 #include <sys/unistd.h>
 #include <sys/malloc.h>
 #include <sys/file2.h>
+#include <sys/thread2.h>
 
 #include <machine/cpu.h>
 
@@ -236,6 +237,19 @@ print_caddr_t(void *data __unused)
 }
 SYSINIT(announce, SI_SUB_COPYRIGHT, SI_ORDER_FIRST, print_caddr_t, copyright)
 
+/*
+ * Leave the critical section that protected us from spurious interrupts
+ * so device probes work.
+ */
+static void
+leavecrit(void *dummy __unused)
+{
+       crit_exit();
+       KKASSERT(!IN_CRITICAL_SECT(curthread));
+       if (bootverbose)
+               printf("Leaving critical section, allowing interrupts\n");
+}
+SYSINIT(leavecrit, SI_SUB_LEAVE_CRIT, SI_ORDER_ANY, leavecrit, NULL)
 
 /*
  ***************************************************************************
@@ -445,6 +459,7 @@ start_init(void *dummy)
        VREF(p->p_fd->fd_cdir);
        p->p_fd->fd_rdir = rootvnode;
        VREF(p->p_fd->fd_rdir);
+       vfs_cache_setroot(rootvnode);
        VOP_UNLOCK(rootvnode, 0, curthread);
 
        /*
index f040d02..0a80813 100644 (file)
@@ -28,7 +28,7 @@
  *     to use a critical section to avoid problems.  Foreign thread 
  *     scheduling is queued via (async) IPIs.
  *
- * $DragonFly: src/sys/kern/lwkt_thread.c,v 1.29 2003/08/25 19:50:32 dillon Exp $
+ * $DragonFly: src/sys/kern/lwkt_thread.c,v 1.30 2003/09/24 18:37:48 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -189,6 +189,10 @@ lwkt_alloc_thread(struct thread *td)
  *
  * NOTE!  called from low level boot code, we cannot do anything fancy!
  * Only the low level boot code will call this function with gd != mycpu.
+ *
+ * All threads start out in a critical section at a priority of
+ * TDPRI_KERN_DAEMON.  Higher level code will modify the priority as
+ * appropriate.
  */
 void
 lwkt_init_thread(thread_t td, void *stack, int flags, struct globaldata *gd)
@@ -197,7 +201,7 @@ lwkt_init_thread(thread_t td, void *stack, int flags, struct globaldata *gd)
     td->td_kstack = stack;
     td->td_flags |= flags;
     td->td_gd = gd;
-    td->td_pri = TDPRI_CRIT;
+    td->td_pri = TDPRI_KERN_DAEMON + TDPRI_CRIT;
     lwkt_init_port(&td->td_msgport, td);
     pmap_init_thread(td);
     crit_enter();
index 71c6db3..7b9888a 100644 (file)
@@ -40,7 +40,7 @@
  *
  *     @(#)kernel.h    8.3 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/sys/kernel.h,v 1.63.2.9 2002/07/02 23:00:30 archie Exp $
- * $DragonFly: src/sys/sys/kernel.h,v 1.4 2003/08/20 07:31:21 rob Exp $
+ * $DragonFly: src/sys/sys/kernel.h,v 1.5 2003/09/24 18:37:51 dillon Exp $
  */
 
 #ifndef _SYS_KERNEL_H_
@@ -121,6 +121,7 @@ enum sysinit_sub_id {
        SI_SUB_RUN_QUEUE        = 0x2200000,    /* the run queue*/
        SI_SUB_CREATE_INIT      = 0x2300000,    /* create the init process */
        SI_SUB_MBUF             = 0x2380000,    /* mbuf subsystem */
+       SI_SUB_LEAVE_CRIT       = 0x23c0000,    /* allow interrupt operation */
        SI_SUB_DRIVERS          = 0x2400000,    /* Let Drivers initialize */
        SI_SUB_CONFIGURE        = 0x3800000,    /* Configure devices */
        SI_SUB_VFS              = 0x4000000,    /* virtual file system*/
index 32eaafb..d859cb3 100644 (file)
@@ -4,7 +4,7 @@
  *     Implements the architecture independant portion of the LWKT 
  *     subsystem.
  * 
- * $DragonFly: src/sys/sys/thread.h,v 1.31 2003/08/25 19:50:33 dillon Exp $
+ * $DragonFly: src/sys/sys/thread.h,v 1.32 2003/09/24 18:37:51 dillon Exp $
  */
 
 #ifndef _SYS_THREAD_H_
@@ -214,6 +214,8 @@ struct thread {
 
 #define CACHE_NTHREADS         6
 
+#define IN_CRITICAL_SECT(td)   ((td)->td_pri >= TDPRI_CRIT)
+
 #ifdef _KERNEL
 
 extern struct vm_zone  *thread_zone;
index 7512e75..0738188 100644 (file)
@@ -60,7 +60,7 @@
  * rights to redistribute these changes.
  *
  * $FreeBSD: src/sys/vm/vm_glue.c,v 1.94.2.4 2003/01/13 22:51:17 dillon Exp $
- * $DragonFly: src/sys/vm/vm_glue.c,v 1.15 2003/08/20 08:03:01 rob Exp $
+ * $DragonFly: src/sys/vm/vm_glue.c,v 1.16 2003/09/24 18:37:54 dillon Exp $
  */
 
 #include "opt_vm.h"
@@ -347,6 +347,9 @@ faultin(p)
 }
 
 /*
+ * Kernel initialization eventually falls through to this function,
+ * which is process 0.
+ *
  * This swapin algorithm attempts to swap-in processes only if there
  * is enough space for them.  Of course, if a process waits for a long
  * time, it will be swapped in anyway.
@@ -361,6 +364,7 @@ scheduler(dummy)
        struct proc *pp;
        int ppri;
 
+       KKASSERT(!IN_CRITICAL_SECT(curthread));
 loop:
        if (vm_page_count_min()) {
                VM_WAIT;