diff -purN -X /home/mbligh/.diff.exclude 210-config_hz/arch/i386/Kconfig 212-config_page_offset/arch/i386/Kconfig --- 210-config_hz/arch/i386/Kconfig 2003-12-11 17:15:55.000000000 -0800 +++ 212-config_page_offset/arch/i386/Kconfig 2003-12-11 17:15:58.000000000 -0800 @@ -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 -purN -X /home/mbligh/.diff.exclude 210-config_hz/arch/i386/Makefile 212-config_page_offset/arch/i386/Makefile --- 210-config_hz/arch/i386/Makefile 2003-12-11 17:01:40.000000000 -0800 +++ 212-config_page_offset/arch/i386/Makefile 2003-12-11 17:15:58.000000000 -0800 @@ -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 -purN -X /home/mbligh/.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 2003-12-11 17:05:53.000000000 -0800 +++ 212-config_page_offset/include/asm-i386/page.h 2003-12-11 17:15:58.000000000 -0800 @@ -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 -purN -X /home/mbligh/.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 2003-12-11 17:05:53.000000000 -0800 +++ 212-config_page_offset/include/asm-i386/processor.h 2003-12-11 17:15:58.000000000 -0800 @@ -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 -purN -X /home/mbligh/.diff.exclude 210-config_hz/mm/memory.c 212-config_page_offset/mm/memory.c --- 210-config_hz/mm/memory.c 2003-12-11 17:05:53.000000000 -0800 +++ 212-config_page_offset/mm/memory.c 2003-12-11 17:15:59.000000000 -0800 @@ -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;