Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 105308
b: refs/heads/master
c: 8faa8b0
h: refs/heads/master
v: v3
  • Loading branch information
Andi Kleen authored and Linus Torvalds committed Jul 24, 2008
1 parent fd01ac1 commit 7db2b46
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 10 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: aa888a74977a8f2120ae9332376e179c39a6b07d
refs/heads/master: 8faa8b077b2cdc4e4646842fe50b07840955a013
39 changes: 30 additions & 9 deletions trunk/mm/hugetlb.c
Original file line number Diff line number Diff line change
Expand Up @@ -981,31 +981,28 @@ static void __init gather_bootmem_prealloc(void)
}
}

static void __init hugetlb_init_one_hstate(struct hstate *h)
static void __init hugetlb_hstate_alloc_pages(struct hstate *h)
{
unsigned long i;

for (i = 0; i < MAX_NUMNODES; ++i)
INIT_LIST_HEAD(&h->hugepage_freelists[i]);

h->hugetlb_next_nid = first_node(node_online_map);

for (i = 0; i < h->max_huge_pages; ++i) {
if (h->order >= MAX_ORDER) {
if (!alloc_bootmem_huge_page(h))
break;
} else if (!alloc_fresh_huge_page(h))
break;
}
h->max_huge_pages = h->free_huge_pages = h->nr_huge_pages = i;
h->max_huge_pages = i;
}

static void __init hugetlb_init_hstates(void)
{
struct hstate *h;

for_each_hstate(h) {
hugetlb_init_one_hstate(h);
/* oversize hugepages were init'ed in early boot */
if (h->order < MAX_ORDER)
hugetlb_hstate_alloc_pages(h);
}
}

Expand Down Expand Up @@ -1301,6 +1298,8 @@ module_init(hugetlb_init);
void __init hugetlb_add_hstate(unsigned order)
{
struct hstate *h;
unsigned long i;

if (size_to_hstate(PAGE_SIZE << order)) {
printk(KERN_WARNING "hugepagesz= specified twice, ignoring\n");
return;
Expand All @@ -1310,15 +1309,21 @@ void __init hugetlb_add_hstate(unsigned order)
h = &hstates[max_hstate++];
h->order = order;
h->mask = ~((1ULL << (order + PAGE_SHIFT)) - 1);
h->nr_huge_pages = 0;
h->free_huge_pages = 0;
for (i = 0; i < MAX_NUMNODES; ++i)
INIT_LIST_HEAD(&h->hugepage_freelists[i]);
h->hugetlb_next_nid = first_node(node_online_map);
snprintf(h->name, HSTATE_NAME_LEN, "hugepages-%lukB",
huge_page_size(h)/1024);
hugetlb_init_one_hstate(h);

parsed_hstate = h;
}

static int __init hugetlb_setup(char *s)
{
unsigned long *mhp;
static unsigned long *last_mhp;

/*
* !max_hstate means we haven't parsed a hugepagesz= parameter yet,
Expand All @@ -1329,9 +1334,25 @@ static int __init hugetlb_setup(char *s)
else
mhp = &parsed_hstate->max_huge_pages;

if (mhp == last_mhp) {
printk(KERN_WARNING "hugepages= specified twice without "
"interleaving hugepagesz=, ignoring\n");
return 1;
}

if (sscanf(s, "%lu", mhp) <= 0)
*mhp = 0;

/*
* Global state is always initialized later in hugetlb_init.
* But we need to allocate >= MAX_ORDER hstates here early to still
* use the bootmem allocator.
*/
if (max_hstate && parsed_hstate->order >= MAX_ORDER)
hugetlb_hstate_alloc_pages(parsed_hstate);

last_mhp = mhp;

return 1;
}
__setup("hugepages=", hugetlb_setup);
Expand Down

0 comments on commit 7db2b46

Please sign in to comment.