hugetlb: internalize hugetlb init
PATCH 4/7 hugetlb: internalize hugetlb init
This patch internalizes hugetlb initialization, implementing a command-line option in the process.
hugetlbpage.c | 40 ++++++++++++++++++++++++++++++++++++---- init.c | 31 ------------------------------- 2 files changed, 36 insertions(+), 35 deletions(-)
arch/i386/mm/hugetlbpage.c +36 -4
@@ -12,16 +12,19 @@#include <linux/pagemap.h> #include <linux/smp_lock.h> #include <linux/slab.h> - +#include <linux/module.h> #include <asm/mman.h> #include <asm/pgalloc.h> #include <asm/tlb.h> #include <asm/tlbflush.h> +long htlbpagemem =0 ; +int htlbpage_max; +long htlbzone_pages; +struct vm_operations_struct hugetlb_vm_ops; -struct list_head htlbpage_freelist; -spinlock_t htlbpage_lock =SPIN_LOCK_UNLOCKED ; -extern long htlbpagemem; +static LIST_HEAD (htlbpage_freelist); +static spinlock_t htlbpage_lock =SPIN_LOCK_UNLOCKED ;#define MAX_ID 32struct htlbpagekey {
@@ -510,6 +513,35 @@ int set_hugetlb_mem_size(int count)return (int ) htlbzone_pages; } +static int __init hugetlb_setup (char *s) +{ +if (sscanf (s,"%d" , &htlbpage_max) <=0 ) + htlbpage_max =0 ; +return 1 ; +} +__setup ("hugepages=" , hugetlb_setup); + +static int __init hugetlb_init (void ) +{ +int i, j; +struct page *page; + +for (i =0 ; i < htlbpage_max; ++i) { + page =alloc_pages (__GFP_HIGHMEM,HUGETLB_PAGE_ORDER ); +if (!page) +break ; +for (j =0 ; j <HPAGE_SIZE /PAGE_SIZE ; ++j) +SetPageReserved (&page[j]); +spin_lock (&htlbpage_lock); +list_add (&page->list, &htlbpage_freelist); +spin_unlock (&htlbpage_lock); + } + htlbpage_max = htlbpagemem = htlbzone_pages = i; +printk ("Total HugeTLB memory allocated, %ld\n" , htlbpagemem); +return 0 ; +} +module_init (hugetlb_init); +static struct page *hugetlb_nopage (struct vm_area_struct * area,unsigned long address,int unused) {BUG ();
arch/i386/mm/init.c +0 -31
@@ -422,13 +422,6 @@ static void __init set_max_mapnr_init(voextern void set_max_mapnr_init (void );#endif /* !CONFIG_DISCONTIGMEM */ -#ifdef CONFIG_HUGETLB_PAGE -long htlbpagemem =0 ; -int htlbpage_max; -long htlbzone_pages; -extern struct list_head htlbpage_freelist; -#endif -void __init mem_init (void ) {extern int ppro_with_ram_bug (void );
@@ -497,30 +490,6 @@ void __init mem_init(void)#ifndef CONFIG_SMP zap_low_mappings ();#endif -#ifdef CONFIG_HUGETLB_PAGE - { -long i, j; -struct page *page, *map; -/*For now reserve quarter for hugetlb_pages.*/ - htlbzone_pages = (max_low_pfn >> ((HPAGE_SHIFT -PAGE_SHIFT ) +2 )) ; -/*Will make this kernel command line. */ -INIT_LIST_HEAD (&htlbpage_freelist); -for (i=0 ; i<htlbzone_pages; i++) { - page =alloc_pages (__GFP_HIGHMEM,HUGETLB_PAGE_ORDER ); -if (page ==NULL ) -break ; - map = page; -for (j=0 ; j<(HPAGE_SIZE /PAGE_SIZE ); j++) { -SetPageReserved (map); - map++; - } -list_add (&page->list, &htlbpage_freelist); - } -printk ("Total Huge_TLB_Page memory pages allocated %ld\n" , i); - htlbzone_pages = htlbpagemem = i; - htlbpage_max = i; - } -#endif }#if CONFIG_X86_PAE