Commit db6005a2 authored by Andrew Morton's avatar Andrew Morton Committed by David S. Miller

[PATCH] hugetlb: internalize hugetlb init

Patch from William Lee Irwin III <wli@holomorphy.com>

This patch internalizes hugetlb initialization, implementing a command-line
option in the process.
parent 755643ba
...@@ -12,16 +12,19 @@ ...@@ -12,16 +12,19 @@
#include <linux/pagemap.h> #include <linux/pagemap.h>
#include <linux/smp_lock.h> #include <linux/smp_lock.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/module.h>
#include <asm/mman.h> #include <asm/mman.h>
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/tlb.h> #include <asm/tlb.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
long htlbpagemem = 0;
int htlbpage_max;
long htlbzone_pages;
struct vm_operations_struct hugetlb_vm_ops; struct vm_operations_struct hugetlb_vm_ops;
struct list_head htlbpage_freelist; static LIST_HEAD(htlbpage_freelist);
spinlock_t htlbpage_lock = SPIN_LOCK_UNLOCKED; static spinlock_t htlbpage_lock = SPIN_LOCK_UNLOCKED;
extern long htlbpagemem;
#define MAX_ID 32 #define MAX_ID 32
struct htlbpagekey { struct htlbpagekey {
...@@ -543,6 +546,35 @@ int set_hugetlb_mem_size(int count) ...@@ -543,6 +546,35 @@ int set_hugetlb_mem_size(int count)
return (int) htlbzone_pages; 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) static struct page * hugetlb_nopage(struct vm_area_struct * area, unsigned long address, int unused)
{ {
BUG(); BUG();
......
...@@ -422,13 +422,6 @@ static void __init set_max_mapnr_init(void) ...@@ -422,13 +422,6 @@ static void __init set_max_mapnr_init(void)
extern void set_max_mapnr_init(void); extern void set_max_mapnr_init(void);
#endif /* !CONFIG_DISCONTIGMEM */ #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) void __init mem_init(void)
{ {
extern int ppro_with_ram_bug(void); extern int ppro_with_ram_bug(void);
...@@ -497,30 +490,6 @@ void __init mem_init(void) ...@@ -497,30 +490,6 @@ void __init mem_init(void)
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
zap_low_mappings(); zap_low_mappings();
#endif #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 #if CONFIG_X86_PAE
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment