diff -urpN -X /home/fletch/.diff.exclude 210-config_hz/arch/i386/Kconfig 212-config_page_offset/arch/i386/Kconfig
--- 210-config_hz/arch/i386/Kconfig	Mon Dec  8 11:06:27 2003
+++ 212-config_page_offset/arch/i386/Kconfig	Mon Dec  8 11:06:51 2003
@@ -730,6 +730,44 @@ config HIGHMEM64G
 
 endchoice
 
+choice
+	help
+	  On i386, a process can only virtually address 4GB of memory.  This
+	  lets you select how much of that virtual space you would like to 
+	  devoted to userspace, and how much to the kernel.
+
+	  Some userspace programs would like to address as much as possible and 
+	  have few demands of the kernel other than it get out of the way.  These
+	  users may opt to use the 3.5GB option to give their userspace program 
+	  as much room as possible.  Due to alignment issues imposed by PAE, 
+	  the "3.5GB" option is unavailable if "64GB" high memory support is 
+	  enabled.
+
+	  Other users (especially those who use PAE) may be running out of
+	  ZONE_NORMAL memory.  Those users may benefit from increasing the
+	  kernel's virtual address space size by taking it away from userspace, 
+	  which may not need all of its space.  An indicator that this is 
+	  happening is when /proc/Meminfo's "LowFree:" is a small percentage of
+	  "LowTotal:" while "HighFree:" is very large.
+
+	  If unsure, say "3GB"
+	prompt "User address space size"
+        default 1GB
+	
+config	05GB
+	bool "3.5 GB"
+	depends on !HIGHMEM64G
+	
+config	1GB
+	bool "3 GB"
+	
+config	2GB
+	bool "2 GB"
+	
+config	3GB
+	bool "1 GB"
+endchoice
+
 config HIGHMEM
 	bool
 	depends on HIGHMEM64G || HIGHMEM4G
diff -urpN -X /home/fletch/.diff.exclude 210-config_hz/arch/i386/Makefile 212-config_page_offset/arch/i386/Makefile
--- 210-config_hz/arch/i386/Makefile	Mon Dec  8 09:58:32 2003
+++ 212-config_page_offset/arch/i386/Makefile	Mon Dec  8 11:06:51 2003
@@ -101,6 +101,7 @@ drivers-$(CONFIG_PM)			+= arch/i386/powe
 
 CFLAGS += $(mflags-y)
 AFLAGS += $(mflags-y)
+AFLAGS_vmlinux.lds.o += -include $(TOPDIR)/include/asm-i386/page.h
 
 boot := arch/i386/boot
 
diff -urpN -X /home/fletch/.diff.exclude 210-config_hz/include/asm-i386/page.h 212-config_page_offset/include/asm-i386/page.h
--- 210-config_hz/include/asm-i386/page.h	Mon Dec  8 10:59:07 2003
+++ 212-config_page_offset/include/asm-i386/page.h	Mon Dec  8 11:15:28 2003
@@ -97,9 +97,20 @@ typedef struct { unsigned long pgprot; }
 #ifdef CONFIG_X86_4G_VM_LAYOUT
 #define __PAGE_OFFSET		(0x02000000)
 #define TASK_SIZE		(0xff000000)
-#else
+#elif defined(CONFIG_05GB)
+#define __PAGE_OFFSET		(0xe0000000)
+#define TASK_SIZE		(0xe0000000)
+#elif defined(CONFIG_1GB)
 #define __PAGE_OFFSET		(0xc0000000)
 #define TASK_SIZE		(0xc0000000)
+#elif defined(CONFIG_2GB)
+#define __PAGE_OFFSET		(0x80000000)
+#define TASK_SIZE		(0x80000000)
+#elif defined(CONFIG_3GB)
+#define __PAGE_OFFSET		(0x40000000)
+#define TASK_SIZE		(0x40000000)
+#else
+#error I have no idea what VM layout to use
 #endif
 
 /*
diff -urpN -X /home/fletch/.diff.exclude 210-config_hz/include/asm-i386/processor.h 212-config_page_offset/include/asm-i386/processor.h
--- 210-config_hz/include/asm-i386/processor.h	Mon Dec  8 10:59:07 2003
+++ 212-config_page_offset/include/asm-i386/processor.h	Mon Dec  8 11:07:42 2003
@@ -294,7 +294,11 @@ extern unsigned int mca_pentium_flag;
 /* This decides where the kernel will search for a free chunk of vm
  * space during mmap's.
  */
+#ifdef CONFIG_05GB
+#define TASK_UNMAPPED_BASE	(PAGE_ALIGN(TASK_SIZE / 16))
+#else
 #define TASK_UNMAPPED_BASE	(PAGE_ALIGN(TASK_SIZE / 3))
+#endif
 
 /*
  * Size of io_bitmap, covering ports 0 to 0x3ff.
diff -urpN -X /home/fletch/.diff.exclude 210-config_hz/mm/memory.c 212-config_page_offset/mm/memory.c
--- 210-config_hz/mm/memory.c	Mon Dec  8 10:59:07 2003
+++ 212-config_page_offset/mm/memory.c	Thu Dec 11 09:38:31 2003
@@ -110,8 +110,8 @@ static inline void free_one_pmd(struct m
 static inline void free_one_pgd(struct mmu_gather *tlb, pgd_t * dir,
 							int pgd_idx)
 {
-	int j;
 	pmd_t * pmd;
+	int j;
 
 	if (pgd_none(*dir))
 		return;
@@ -122,6 +122,7 @@ static inline void free_one_pgd(struct m
 	}
 	pmd = pmd_offset(dir, 0);
 	pgd_clear(dir);
+
 	for (j = 0; j < PTRS_PER_PMD ; j++) {
 		if (pgd_idx * PGDIR_SIZE + j * PMD_SIZE >= TASK_SIZE)
 			break;