From: Mel Gorman This patch adds the kernelcore= parameter for x86. Once all patches are applied, a new command-line parameter exist and a new sysctl. This patch adds the necessary documentation. From: Yasunori Goto When "kernelcore" boot option is specified, kernel can't boot up on ia64 because of an infinite loop. In addition, the parsing code can be handled in an architecture-independent manner. This patch uses common code to handle the kernelcore= parameter. It is only available to architectures that support arch-independent zone-sizing (i.e. define CONFIG_ARCH_POPULATES_NODE_MAP). Other architectures will ignore the boot parameter. Signed-off-by: Mel Gorman Signed-off-by: Yasunori Goto Acked-by: Andy Whitcroft Signed-off-by: Andrew Morton --- Documentation/filesystems/proc.txt | 15 +++++++++++++++ Documentation/kernel-parameters.txt | 16 ++++++++++++++++ Documentation/sysctl/vm.txt | 3 ++- arch/ia64/kernel/efi.c | 1 + include/linux/mm.h | 1 - mm/page_alloc.c | 3 +++ 6 files changed, 37 insertions(+), 2 deletions(-) diff -puN mm/page_alloc.c~handle-kernelcore=-generic mm/page_alloc.c --- a/mm/page_alloc.c~handle-kernelcore=-generic +++ a/mm/page_alloc.c @@ -3573,6 +3573,9 @@ int __init cmdline_parse_kernelcore(char return 0; } + +early_param("kernelcore", cmdline_parse_kernelcore); + #endif /* CONFIG_ARCH_POPULATES_NODE_MAP */ /** diff -puN arch/i386/kernel/setup.c~handle-kernelcore=-generic arch/i386/kernel/setup.c diff -puN arch/powerpc/kernel/prom.c~handle-kernelcore=-generic arch/powerpc/kernel/prom.c diff -puN arch/ppc/mm/init.c~handle-kernelcore=-generic arch/ppc/mm/init.c diff -puN arch/x86_64/kernel/e820.c~handle-kernelcore=-generic arch/x86_64/kernel/e820.c diff -puN arch/ia64/kernel/efi.c~handle-kernelcore=-generic arch/ia64/kernel/efi.c --- a/arch/ia64/kernel/efi.c~handle-kernelcore=-generic +++ a/arch/ia64/kernel/efi.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include diff -puN Documentation/filesystems/proc.txt~handle-kernelcore=-generic Documentation/filesystems/proc.txt --- a/Documentation/filesystems/proc.txt~handle-kernelcore=-generic +++ a/Documentation/filesystems/proc.txt @@ -1290,6 +1290,21 @@ nr_hugepages configures number of hugetl hugetlb_shm_group contains group id that is allowed to create SysV shared memory segment using hugetlb page. +hugepages_treat_as_movable +-------------------------- + +This parameter is only useful when kernelcore= is specified at boot time to +create ZONE_MOVABLE for pages that may be reclaimed or migrated. Huge pages +are not movable so are not normally allocated from ZONE_MOVABLE. A non-zero +value written to hugepages_treat_as_movable allows huge pages to be allocated +from ZONE_MOVABLE. + +Once enabled, the ZONE_MOVABLE is treated as an area of memory the huge +pages pool can easily grow or shrink within. Assuming that applications are +not running that mlock() a lot of memory, it is likely the huge pages pool +can grow to the size of ZONE_MOVABLE by repeatedly entering the desired value +into nr_hugepages and triggering page reclaim. + laptop_mode ----------- diff -puN Documentation/kernel-parameters.txt~handle-kernelcore=-generic Documentation/kernel-parameters.txt --- a/Documentation/kernel-parameters.txt~handle-kernelcore=-generic +++ a/Documentation/kernel-parameters.txt @@ -800,6 +800,22 @@ and is between 256 and 4096 characters. js= [HW,JOY] Analog joystick See Documentation/input/joystick.txt. + kernelcore=nn[KMG] [KNL,IA-32,IA-64,PPC,X86-64] This parameter + specifies the amount of memory usable by the kernel + for non-movable allocations. The requested amount is + spread evenly throughout all nodes in the system. The + remaining memory in each node is used for Movable + pages. In the event, a node is too small to have both + kernelcore and Movable pages, kernelcore pages will + take priority and other nodes will have a larger number + of kernelcore pages. The Movable zone is used for the + allocation of pages that may be reclaimed or moved + by the page migration subsystem. This means that + HugeTLB pages may not be allocated from this zone. + Note that allocations like PTEs-from-HighMem still + use the HighMem zone if it exists, and the Normal + zone if it does not. + keepinitrd [HW,ARM] kstack=N [IA-32,X86-64] Print N words from the kernel stack diff -puN Documentation/sysctl/vm.txt~handle-kernelcore=-generic Documentation/sysctl/vm.txt --- a/Documentation/sysctl/vm.txt~handle-kernelcore=-generic +++ a/Documentation/sysctl/vm.txt @@ -36,7 +36,8 @@ Currently, these files are in /proc/sys/ dirty_ratio, dirty_background_ratio, dirty_expire_centisecs, dirty_writeback_centisecs, vfs_cache_pressure, laptop_mode, -block_dump, swap_token_timeout, drop-caches: +block_dump, swap_token_timeout, drop-caches, +hugepages_treat_as_movable: See Documentation/filesystems/proc.txt diff -puN include/linux/mm.h~handle-kernelcore=-generic include/linux/mm.h --- a/include/linux/mm.h~handle-kernelcore=-generic +++ a/include/linux/mm.h @@ -1011,7 +1011,6 @@ extern unsigned long find_max_pfn_with_a extern void free_bootmem_with_active_regions(int nid, unsigned long max_low_pfn); extern void sparse_memory_present_with_active_regions(int nid); -extern int cmdline_parse_kernelcore(char *p); #ifndef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID extern int early_pfn_to_nid(unsigned long pfn); #endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */ _