Config option for kernel stack size (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 12 Jun 2014 19:02:02 +0000 (12:02 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 12 Jun 2014 19:02:02 +0000 (12:02 -0700)
Use the big stacks if you want to play it safe (the default).  I'm using
the small stacks.  If you do use the small stacks, if you have weird
crashes or panics, try toggling this setting.

Technically, this changes a kernel header, though userspace wasn't using
the KSTACK #defines, so don't worry about it.

Kconfig
kern/arch/riscv/entry.S
kern/arch/x86/entry32.S
kern/arch/x86/entry64.S
kern/include/kstack.h [new file with mode: 0644]
kern/include/ros/memlayout.h
kern/src/kthread.c

diff --git a/Kconfig b/Kconfig
index 46805cb..9d3a537 100644 (file)
--- a/Kconfig
+++ b/Kconfig
@@ -141,6 +141,18 @@ config RESET_STACKS
                the top of the stack, abandoning its context.  This is useful so we do
                not run off the end of our stacks, but makes backtracing difficult.
 
+config LARGE_KSTACKS
+       bool "Large (two-page) Kernel Stacks"
+       default y
+       help
+               Ideally, we'd like to use single-page stacks, which are easier on the
+               memory allocator.  Some of the Plan 9 code hogs stack space, and we may
+               run off the end of a single-page stack.
+
+               Say 'y' to play it safe and use the larger, slower stacks.  Say 'n' for
+               higher performance, and mention this setting if you have any weird
+               crashes or panics.
+
 config KTHREAD_POISON
        bool "Kthread Poison Canary"
        default n
index 484beda..63fa295 100644 (file)
@@ -1,6 +1,6 @@
 #include <arch/pcr.h>
 #include <arch/trap.h>
-#include <ros/memlayout.h>
+#include <kstack.h>
 
 #ifdef __riscv64
 # define STORE    sd
index c537e64..260289b 100644 (file)
@@ -4,7 +4,7 @@
 
 #include <arch/mmu.h>
 #include <arch/trap.h>
-#include <ros/memlayout.h>
+#include <kstack.h>
 
 .set CODE_SEL,0x8              # index of code seg within mygdt
 .set DATA_SEL,0x10             # index of data seg within mygdt
index 4ccedc5..f76636c 100644 (file)
@@ -5,7 +5,7 @@
 #include <arch/mmu.h>
 #include <arch/trap.h>
 #include <arch/x86.h>
-#include <ros/memlayout.h>
+#include <kstack.h>
 
 #define MULTIBOOT_PAGE_ALIGN  (1<<0)
 #define MULTIBOOT_MEMORY_INFO (1<<1)
diff --git a/kern/include/kstack.h b/kern/include/kstack.h
new file mode 100644 (file)
index 0000000..f06c727
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef ROS_KERN_KSTACK_H
+#define ROS_KERN_KSTACK_H
+
+#ifdef CONFIG_LARGE_KSTACKS
+#define KSTKSHIFT      (PGSHIFT + 1)           /* KSTKSIZE == 2 * PGSIZE */
+#else
+#define KSTKSHIFT      (PGSHIFT)                       /* KSTKSIZE == PGSIZE */
+#endif
+
+#define KSTKSIZE       (1 << KSTKSHIFT)        /* size of a static kernel stack */
+
+#endif /* ROS_KERN_KSTACK_H */
index b2b81b9..9d5bdaf 100644 (file)
@@ -17,9 +17,6 @@
 #define EXTPHYSMEM     0x100000
 #endif
 
-#define KSTKSHIFT      (PGSHIFT + 1)                   /* KSTKSIZE == PGSIZE */
-#define KSTKSIZE       (1 << KSTKSHIFT)        /* size of a static kernel stack */
-
 /* Read-only, per-process shared info structures */
 #define UINFO                  (UVPT - PTSIZE)
 /* Top of user-writable VM */
index 012c178..3fa7b81 100644 (file)
@@ -11,6 +11,7 @@
 #include <pmap.h>
 #include <smp.h>
 #include <schedule.h>
+#include <kstack.h>
 
 uintptr_t get_kstack(void)
 {