Add a stack-size argument to the LWKT threading code so threads can be
authorMatthew Dillon <dillon@dragonflybsd.org>
Thu, 29 Jul 2004 08:55:02 +0000 (08:55 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Thu, 29 Jul 2004 08:55:02 +0000 (08:55 +0000)
created with different-sized stacks.  Adjust libcaps to match.

This is a pre-requisit to adding NDIS support.  NDIS threads need larger
stacks because microsoft drivers expect larger stacks.

12 files changed:
lib/libcaps/globaldata.c
lib/libcaps/i386/td_switch.c
lib/libcaps/sysport.c
lib/libcaps/thread.h
lib/libcaps/uthread.c
sys/i386/i386/machdep.c
sys/i386/i386/pmap.c
sys/kern/lwkt_thread.c
sys/platform/pc32/i386/machdep.c
sys/platform/pc32/i386/pmap.c
sys/sys/thread.h
sys/vm/vm_glue.c

index 213641b..659ba7d 100644 (file)
@@ -25,7 +25,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/lib/libcaps/globaldata.c,v 1.6 2004/04/24 09:26:25 joerg Exp $
+ * $DragonFly: src/lib/libcaps/globaldata.c,v 1.7 2004/07/29 08:55:02 dillon Exp $
  */
 
 #include "defs.h"
@@ -52,7 +52,7 @@ globaldata_init(thread_t td)
      */
     if (td) {
        gdary[0].gd_curthread = td;
-       lwkt_init_thread(td, NULL, TDF_RUNNING|TDF_SYSTHREAD, mycpu);
+       lwkt_init_thread(td, NULL, 0, TDF_RUNNING|TDF_SYSTHREAD, mycpu);
     }
 }
 
index d077726..192e761 100644 (file)
@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/lib/libcaps/i386/td_switch.c,v 1.1 2003/12/04 22:06:22 dillon Exp $
+ * $DragonFly: src/lib/libcaps/i386/td_switch.c,v 1.2 2004/07/29 08:55:02 dillon Exp $
  */
 #include <sys/cdefs.h>                 /* for __dead2 needed by thread.h */
 #include "libcaps/thread.h"
@@ -37,7 +37,7 @@ void cpu_exit_switch(struct thread *);
 void
 cpu_init_thread(struct thread *td)
 {
-    td->td_sp = td->td_kstack + THREAD_STACK - sizeof(void *);
+    td->td_sp = td->td_kstack + td->td_kstack_size - sizeof(void *);
     td->td_switch = cpu_lwkt_switch;
 }
 
index 0fea4e5..34212d1 100644 (file)
@@ -24,7 +24,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/lib/libcaps/sysport.c,v 1.3 2003/12/07 04:21:52 dillon Exp $
+ * $DragonFly: src/lib/libcaps/sysport.c,v 1.4 2004/07/29 08:55:02 dillon Exp $
  */
 #include "defs.h"
 
@@ -49,8 +49,8 @@ lwkt_port_t sysport;
 void
 sysport_init(void)
 {
-    lwkt_init_thread(&sys_td, libcaps_alloc_stack(THREAD_STACK),
-                   TDF_SYSTHREAD, mycpu);
+    lwkt_init_thread(&sys_td, libcaps_alloc_stack(LWKT_THREAD_STACK),
+                   LWKT_THREAD_STACK, TDF_SYSTHREAD, mycpu);
     sysport = &sys_td.td_msgport;
     sysport->mp_putport = sysport_putport;
     sysport->mp_flags = MSGPORTF_WAITING;      /* XXX temporary */
index 0c30474..ca2176c 100644 (file)
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/lib/libcaps/thread.h,v 1.2 2003/12/04 22:06:19 dillon Exp $
+ * $DragonFly: src/lib/libcaps/thread.h,v 1.3 2004/07/29 08:55:02 dillon Exp $
  */
 
 #ifndef _LIBCAPS_THREAD_H_
 #define _LIBCAPS_THREAD_H_
 
-#define THREAD_STACK   65536
+#define LWKT_THREAD_STACK      65536
 
 struct thread;
 
index 07d128b..3ca601c 100644 (file)
@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/lib/libcaps/uthread.c,v 1.4 2004/04/24 09:26:25 joerg Exp $
+ * $DragonFly: src/lib/libcaps/uthread.c,v 1.5 2004/07/29 08:55:02 dillon Exp $
  */
 
 /*
@@ -105,10 +105,12 @@ lwkt_init_thread_remote(void *arg)
 }
 
 void
-lwkt_init_thread(thread_t td, void *stack, int flags, struct globaldata *gd)
+lwkt_init_thread(thread_t td, void *stack, int stksize, int flags,
+               struct globaldata *gd)
 {
     bzero(td, sizeof(struct thread));
     td->td_kstack = stack;
+    td->td_kstack_size = stksize;
     td->td_flags |= flags;
     td->td_gd = gd;
     td->td_pri = TDPRI_KERN_DAEMON + TDPRI_CRIT;
@@ -168,7 +170,9 @@ lwkt_gdinit(struct globaldata *gd)
     TAILQ_INIT(&gd->gd_tdallq);
 
     /* Set up this cpu's idle thread */
-    lwkt_init_thread(&gd->gd_idlethread, libcaps_alloc_stack(THREAD_STACK), 0, gd);
+    lwkt_init_thread(&gd->gd_idlethread, 
+               libcaps_alloc_stack(LWKT_THREAD_STACK), LWKT_THREAD_STACK,
+               0, gd);
     cpu_set_thread_handler(&gd->gd_idlethread, lwkt_exit, lwkt_idleloop, NULL);
 }
 
index f2ba475..b2dc7e5 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     from: @(#)machdep.c     7.4 (Berkeley) 6/3/91
  * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.385.2.30 2003/05/31 08:48:05 alc Exp $
- * $DragonFly: src/sys/i386/i386/Attic/machdep.c,v 1.62 2004/07/24 20:21:33 dillon Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/machdep.c,v 1.63 2004/07/29 08:54:58 dillon Exp $
  */
 
 #include "use_apm.h"
@@ -1866,7 +1866,7 @@ init386(int first)
 
        mi_gdinit(&gd->mi, 0);
        cpu_gdinit(gd, 0);
-       lwkt_init_thread(&thread0, proc0paddr, 0, &gd->mi);
+       lwkt_init_thread(&thread0, proc0paddr, LWKT_THREAD_STACK, 0, &gd->mi);
        lwkt_set_comm(&thread0, "thread0");
        proc0.p_addr = (void *)thread0.td_kstack;
        proc0.p_thread = &thread0;
@@ -2030,13 +2030,12 @@ init386(int first)
 void
 cpu_gdinit(struct mdglobaldata *gd, int cpu)
 {
-       char *sp;
-
        if (cpu)
                gd->mi.gd_curthread = &gd->mi.gd_idlethread;
 
-       sp = gd->mi.gd_prvspace->idlestack;
-       lwkt_init_thread(&gd->mi.gd_idlethread, sp, 0, &gd->mi);
+       lwkt_init_thread(&gd->mi.gd_idlethread, 
+                       gd->mi.gd_prvspace->idlestack, 
+                       sizeof(gd->mi.gd_prvspace->idlestack), 0, &gd->mi);
        lwkt_set_comm(&gd->mi.gd_idlethread, "idle_%d", cpu);
        gd->mi.gd_idlethread.td_switch = cpu_lwkt_switch;
        gd->mi.gd_idlethread.td_sp -= sizeof(void *);
index aa0fabf..4d3cc92 100644 (file)
@@ -40,7 +40,7 @@
  *
  *     from:   @(#)pmap.c      7.7 (Berkeley)  5/12/91
  * $FreeBSD: src/sys/i386/i386/pmap.c,v 1.250.2.18 2002/03/06 22:48:53 silby Exp $
- * $DragonFly: src/sys/i386/i386/Attic/pmap.c,v 1.43 2004/06/02 07:34:29 hmp Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/pmap.c,v 1.44 2004/07/29 08:54:58 dillon Exp $
  */
 
 /*
@@ -898,7 +898,9 @@ retry:
 void
 pmap_init_thread(thread_t td)
 {
-       td->td_pcb = (struct pcb *)(td->td_kstack + UPAGES * PAGE_SIZE) - 1;
+       /* enforce pcb placement */
+       KKASSERT(td->td_kstack_size == UPAGES * PAGE_SIZE);
+       td->td_pcb = (struct pcb *)(td->td_kstack + td->td_kstack_size) - 1;
        td->td_savefpu = &td->td_pcb->pcb_save;
        td->td_sp = (char *)td->td_pcb - 16;
 }
index cb656b5..e335c13 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/kern/lwkt_thread.c,v 1.66 2004/07/24 20:21:35 dillon Exp $
+ * $DragonFly: src/sys/kern/lwkt_thread.c,v 1.67 2004/07/29 08:55:00 dillon Exp $
  */
 
 /*
@@ -70,8 +70,6 @@
 #include <machine/ipl.h>
 #include <machine/smp.h>
 
-#define THREAD_STACK   (UPAGES * PAGE_SIZE)
-
 #else
 
 #include <sys/stdint.h>
@@ -227,7 +225,7 @@ lwkt_wait_init(lwkt_wait_t w)
  * does everything except load the startup and switcher function.
  */
 thread_t
-lwkt_alloc_thread(struct thread *td, int cpu)
+lwkt_alloc_thread(struct thread *td, int stksize, int cpu)
 {
     void *stack;
     int flags = 0;
@@ -242,7 +240,6 @@ lwkt_alloc_thread(struct thread *td, int cpu)
                ("lwkt_alloc_thread: unexpected NULL or corrupted td"));
            TAILQ_REMOVE(&gd->gd_tdfreeq, td, td_threadq);
            crit_exit_gd(gd);
-           stack = td->td_kstack;
            flags = td->td_flags & (TDF_ALLOCATED_STACK|TDF_ALLOCATED_THREAD);
        } else {
            crit_exit_gd(gd);
@@ -252,21 +249,28 @@ lwkt_alloc_thread(struct thread *td, int cpu)
            td = malloc(sizeof(struct thread));
 #endif
            td->td_kstack = NULL;
+           td->td_kstack_size = 0;
            flags |= TDF_ALLOCATED_THREAD;
        }
     }
-    if ((stack = td->td_kstack) == NULL) {
+    if ((stack = td->td_kstack) != NULL && td->td_kstack_size != stksize) {
+       if (flags & TDF_ALLOCATED_STACK) {
+           kmem_free(kernel_map, (vm_offset_t)stack, td->td_kstack_size);
+           stack = NULL;
+       }
+    }
+    if (stack == NULL) {
 #ifdef _KERNEL
-       stack = (void *)kmem_alloc(kernel_map, THREAD_STACK);
+       stack = (void *)kmem_alloc(kernel_map, stksize);
 #else
-       stack = libcaps_alloc_stack(THREAD_STACK);
+       stack = libcaps_alloc_stack(stksize);
 #endif
        flags |= TDF_ALLOCATED_STACK;
     }
     if (cpu < 0)
-       lwkt_init_thread(td, stack, flags, mycpu);
+       lwkt_init_thread(td, stack, stksize, flags, mycpu);
     else
-       lwkt_init_thread(td, stack, flags, globaldata_find(cpu));
+       lwkt_init_thread(td, stack, stksize, flags, globaldata_find(cpu));
     return(td);
 }
 
@@ -299,12 +303,14 @@ lwkt_init_thread_remote(void *arg)
 #endif
 
 void
-lwkt_init_thread(thread_t td, void *stack, int flags, struct globaldata *gd)
+lwkt_init_thread(thread_t td, void *stack, int stksize, int flags,
+               struct globaldata *gd)
 {
     globaldata_t mygd = mycpu;
 
     bzero(td, sizeof(struct thread));
     td->td_kstack = stack;
+    td->td_kstack_size = stksize;
     td->td_flags |= flags;
     td->td_gd = gd;
     td->td_pri = TDPRI_KERN_DAEMON + TDPRI_CRIT;
@@ -387,12 +393,13 @@ lwkt_free_thread(thread_t td)
        crit_exit_gd(gd);
        if (td->td_kstack && (td->td_flags & TDF_ALLOCATED_STACK)) {
 #ifdef _KERNEL
-           kmem_free(kernel_map, (vm_offset_t)td->td_kstack, THREAD_STACK);
+           kmem_free(kernel_map, (vm_offset_t)td->td_kstack, td->td_kstack_size);
 #else
-           libcaps_free_stack(td->td_kstack, THREAD_STACK);
+           libcaps_free_stack(td->td_kstack, td->td_kstack_size);
 #endif
            /* gd invalid */
            td->td_kstack = NULL;
+           td->td_kstack_size = 0;
        }
        if (td->td_flags & TDF_ALLOCATED_THREAD) {
 #ifdef _KERNEL
@@ -1220,7 +1227,7 @@ lwkt_create(void (*func)(void *), void *arg,
     thread_t td;
     __va_list ap;
 
-    td = lwkt_alloc_thread(template, cpu);
+    td = lwkt_alloc_thread(template, LWKT_THREAD_STACK, cpu);
     if (tdp)
        *tdp = td;
     cpu_set_thread_handler(td, lwkt_exit, func, arg);
@@ -1292,7 +1299,7 @@ kthread_create(void (*func)(void *), void *arg,
     thread_t td;
     __va_list ap;
 
-    td = lwkt_alloc_thread(NULL, -1);
+    td = lwkt_alloc_thread(NULL, LWKT_THREAD_STACK, -1);
     if (tdp)
        *tdp = td;
     cpu_set_thread_handler(td, kthread_exit, func, arg);
index 8fcd0b2..9bcac71 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     from: @(#)machdep.c     7.4 (Berkeley) 6/3/91
  * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.385.2.30 2003/05/31 08:48:05 alc Exp $
- * $DragonFly: src/sys/platform/pc32/i386/machdep.c,v 1.62 2004/07/24 20:21:33 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/i386/machdep.c,v 1.63 2004/07/29 08:54:58 dillon Exp $
  */
 
 #include "use_apm.h"
@@ -1866,7 +1866,7 @@ init386(int first)
 
        mi_gdinit(&gd->mi, 0);
        cpu_gdinit(gd, 0);
-       lwkt_init_thread(&thread0, proc0paddr, 0, &gd->mi);
+       lwkt_init_thread(&thread0, proc0paddr, LWKT_THREAD_STACK, 0, &gd->mi);
        lwkt_set_comm(&thread0, "thread0");
        proc0.p_addr = (void *)thread0.td_kstack;
        proc0.p_thread = &thread0;
@@ -2030,13 +2030,12 @@ init386(int first)
 void
 cpu_gdinit(struct mdglobaldata *gd, int cpu)
 {
-       char *sp;
-
        if (cpu)
                gd->mi.gd_curthread = &gd->mi.gd_idlethread;
 
-       sp = gd->mi.gd_prvspace->idlestack;
-       lwkt_init_thread(&gd->mi.gd_idlethread, sp, 0, &gd->mi);
+       lwkt_init_thread(&gd->mi.gd_idlethread, 
+                       gd->mi.gd_prvspace->idlestack, 
+                       sizeof(gd->mi.gd_prvspace->idlestack), 0, &gd->mi);
        lwkt_set_comm(&gd->mi.gd_idlethread, "idle_%d", cpu);
        gd->mi.gd_idlethread.td_switch = cpu_lwkt_switch;
        gd->mi.gd_idlethread.td_sp -= sizeof(void *);
index 33f629f..6ead686 100644 (file)
@@ -40,7 +40,7 @@
  *
  *     from:   @(#)pmap.c      7.7 (Berkeley)  5/12/91
  * $FreeBSD: src/sys/i386/i386/pmap.c,v 1.250.2.18 2002/03/06 22:48:53 silby Exp $
- * $DragonFly: src/sys/platform/pc32/i386/pmap.c,v 1.43 2004/06/02 07:34:29 hmp Exp $
+ * $DragonFly: src/sys/platform/pc32/i386/pmap.c,v 1.44 2004/07/29 08:54:58 dillon Exp $
  */
 
 /*
@@ -898,7 +898,9 @@ retry:
 void
 pmap_init_thread(thread_t td)
 {
-       td->td_pcb = (struct pcb *)(td->td_kstack + UPAGES * PAGE_SIZE) - 1;
+       /* enforce pcb placement */
+       KKASSERT(td->td_kstack_size == UPAGES * PAGE_SIZE);
+       td->td_pcb = (struct pcb *)(td->td_kstack + td->td_kstack_size) - 1;
        td->td_savefpu = &td->td_pcb->pcb_save;
        td->td_sp = (char *)td->td_pcb - 16;
 }
index 1a01070..6c36140 100644 (file)
@@ -7,7 +7,7 @@
  * Types which must already be defined when this header is included by
  * userland:   struct md_thread
  * 
- * $DragonFly: src/sys/sys/thread.h,v 1.56 2004/07/24 20:21:35 dillon Exp $
+ * $DragonFly: src/sys/sys/thread.h,v 1.57 2004/07/29 08:55:02 dillon Exp $
  */
 
 #ifndef _SYS_THREAD_H_
@@ -221,6 +221,7 @@ struct thread {
        struct md_intr_info *intdata;
     } td_info;
     char       *td_kstack;     /* kernel stack */
+    int                td_kstack_size; /* size of kernel stack */
     char       *td_sp;         /* kernel stack pointer for LWKT restore */
     void       (*td_switch)(struct thread *ntd);
     lwkt_wait_t td_wait;       /* thread sitting on wait structure */
@@ -303,6 +304,8 @@ struct thread {
 #define TDPRI_MASK             31
 #define TDPRI_CRIT             32      /* high bits of td_pri used for crit */
 
+#define LWKT_THREAD_STACK      (UPAGES * PAGE_SIZE)
+
 #define CACHE_NTHREADS         6
 
 #define IN_CRITICAL_SECT(td)   ((td)->td_pri >= TDPRI_CRIT)
@@ -316,9 +319,10 @@ extern struct vm_zone      *thread_zone;
 /*
  * Applies both to the kernel and to liblwkt.
  */
-extern struct thread *lwkt_alloc_thread(struct thread *template, int cpu);
-extern void lwkt_init_thread(struct thread *td, void *stack, int flags,
-       struct globaldata *gd);
+extern struct thread *lwkt_alloc_thread(struct thread *template, int stksize,
+       int cpu);
+extern void lwkt_init_thread(struct thread *td, void *stack, int stksize,
+       int flags, struct globaldata *gd);
 extern void lwkt_set_comm(thread_t td, const char *ctl, ...);
 extern void lwkt_wait_free(struct thread *td);
 extern void lwkt_free_thread(struct thread *td);
index 258656d..ed70894 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.25 2004/07/24 20:21:35 dillon Exp $
+ * $DragonFly: src/sys/vm/vm_glue.c,v 1.26 2004/07/29 08:55:02 dillon Exp $
  */
 
 #include "opt_vm.h"
@@ -230,7 +230,7 @@ vm_fork(struct proc *p1, struct proc *p2, int flags)
                        shmfork(p1, p2);
        }
 
-       td2 = lwkt_alloc_thread(NULL, -1);
+       td2 = lwkt_alloc_thread(NULL, LWKT_THREAD_STACK, -1);
        pmap_init_proc(p2, td2);
        lwkt_setpri(td2, TDPRI_KERN_USER);
        lwkt_set_comm(td2, "%s", p1->p_comm);