[PATCH] VMSPLIT config options

Enable selection of different user/kernel VM splits for i386, including an
optimized mode for 1GB physical RAM, which gives the kernel a direct (non
HIGHMEM) mapping to the entire 1GB rather than just the first 896MB.

There is a similarly a similarly optimized mode for machines with exactly 2GB
of physical RAM.

This can speed up the kernel by avoiding having to create/destroy temporary
HIGHMEM mappings, and by not having to include HIGHMEM support at all on such
machines.  The flip side is that there's less virtual addressing left for
userspace in these alternatives, and some binary-only kernel modules may
misbehave unless rebuilt with the same VMSPLIT option as the main kernel
image.

Original idea/patch from Jens Axboe, modified based on suggestions from Linus
et al.

Signed-off-by: Mark Lord <mlord@pobox.com>
Signed-off-by: Jens Axboe <axboe@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Mark Lord 2006-02-01 03:06:11 -08:00 committed by Linus Torvalds
parent 4940fb4412
commit 975b3d3d5b
2 changed files with 39 additions and 2 deletions

View File

@ -448,6 +448,43 @@ config HIGHMEM64G
endchoice endchoice
choice
depends on EXPERIMENTAL && !X86_PAE
prompt "Memory split"
default VMSPLIT_3G
help
Select the desired split between kernel and user memory.
If the address range available to the kernel is less than the
physical memory installed, the remaining memory will be available
as "high memory". Accessing high memory is a little more costly
than low memory, as it needs to be mapped into the kernel first.
Note that increasing the kernel address space limits the range
available to user programs, making the address space there
tighter. Selecting anything other than the default 3G/1G split
will also likely make your kernel incompatible with binary-only
kernel modules.
If you are not absolutely sure what you are doing, leave this
option alone!
config VMSPLIT_3G
bool "3G/1G user/kernel split"
config VMSPLIT_3G_OPT
bool "3G/1G user/kernel split (for full 1G low memory)"
config VMSPLIT_2G
bool "2G/2G user/kernel split"
config VMSPLIT_1G
bool "1G/3G user/kernel split"
endchoice
config PAGE_OFFSET
hex
default 0xB0000000 if VMSPLIT_3G_OPT
default 0x78000000 if VMSPLIT_2G
default 0x40000000 if VMSPLIT_1G
default 0xC0000000
config HIGHMEM config HIGHMEM
bool bool
depends on HIGHMEM64G || HIGHMEM4G depends on HIGHMEM64G || HIGHMEM4G

View File

@ -110,10 +110,10 @@ extern int page_is_ram(unsigned long pagenr);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#ifdef __ASSEMBLY__ #ifdef __ASSEMBLY__
#define __PAGE_OFFSET (0xC0000000) #define __PAGE_OFFSET CONFIG_PAGE_OFFSET
#define __PHYSICAL_START CONFIG_PHYSICAL_START #define __PHYSICAL_START CONFIG_PHYSICAL_START
#else #else
#define __PAGE_OFFSET (0xC0000000UL) #define __PAGE_OFFSET ((unsigned long)CONFIG_PAGE_OFFSET)
#define __PHYSICAL_START ((unsigned long)CONFIG_PHYSICAL_START) #define __PHYSICAL_START ((unsigned long)CONFIG_PHYSICAL_START)
#endif #endif
#define __KERNEL_START (__PAGE_OFFSET + __PHYSICAL_START) #define __KERNEL_START (__PAGE_OFFSET + __PHYSICAL_START)