aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorNick Piggin <npiggin@suse.de>2008-07-24 00:27:52 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-07-24 13:47:19 -0400
commite11bfbfcb08ef4223b863799897c19cdf7c5bc00 (patch)
tree2d66db5a2f92e3ad299e95a09d327f30f306aa24 /mm
parentb4718e628dbf68a2dee23b5709e2aa3190409c56 (diff)
hugetlb: override default huge page size
Allow configurations with the default huge page size which is different to the traditional HPAGE_SIZE size. The default huge page size is the one represented in the legacy /proc ABIs, SHM, and which is defaulted to when mounting hugetlbfs filesystems. This is implemented with a new kernel option default_hugepagesz=, which defaults to HPAGE_SIZE if not specified. Signed-off-by: Nick Piggin <npiggin@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/hugetlb.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 107c1ce223cb..2a2f6e869401 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -34,6 +34,7 @@ struct hstate hstates[HUGE_MAX_HSTATE];
34/* for command line parsing */ 34/* for command line parsing */
35static struct hstate * __initdata parsed_hstate; 35static struct hstate * __initdata parsed_hstate;
36static unsigned long __initdata default_hstate_max_huge_pages; 36static unsigned long __initdata default_hstate_max_huge_pages;
37static unsigned long __initdata default_hstate_size;
37 38
38#define for_each_hstate(h) \ 39#define for_each_hstate(h) \
39 for ((h) = hstates; (h) < &hstates[max_hstate]; (h)++) 40 for ((h) = hstates; (h) < &hstates[max_hstate]; (h)++)
@@ -1288,11 +1289,14 @@ static int __init hugetlb_init(void)
1288{ 1289{
1289 BUILD_BUG_ON(HPAGE_SHIFT == 0); 1290 BUILD_BUG_ON(HPAGE_SHIFT == 0);
1290 1291
1291 if (!size_to_hstate(HPAGE_SIZE)) { 1292 if (!size_to_hstate(default_hstate_size)) {
1292 hugetlb_add_hstate(HUGETLB_PAGE_ORDER); 1293 default_hstate_size = HPAGE_SIZE;
1293 parsed_hstate->max_huge_pages = default_hstate_max_huge_pages; 1294 if (!size_to_hstate(default_hstate_size))
1295 hugetlb_add_hstate(HUGETLB_PAGE_ORDER);
1294 } 1296 }
1295 default_hstate_idx = size_to_hstate(HPAGE_SIZE) - hstates; 1297 default_hstate_idx = size_to_hstate(default_hstate_size) - hstates;
1298 if (default_hstate_max_huge_pages)
1299 default_hstate.max_huge_pages = default_hstate_max_huge_pages;
1296 1300
1297 hugetlb_init_hstates(); 1301 hugetlb_init_hstates();
1298 1302
@@ -1332,7 +1336,7 @@ void __init hugetlb_add_hstate(unsigned order)
1332 parsed_hstate = h; 1336 parsed_hstate = h;
1333} 1337}
1334 1338
1335static int __init hugetlb_setup(char *s) 1339static int __init hugetlb_nrpages_setup(char *s)
1336{ 1340{
1337 unsigned long *mhp; 1341 unsigned long *mhp;
1338 static unsigned long *last_mhp; 1342 static unsigned long *last_mhp;
@@ -1367,7 +1371,14 @@ static int __init hugetlb_setup(char *s)
1367 1371
1368 return 1; 1372 return 1;
1369} 1373}
1370__setup("hugepages=", hugetlb_setup); 1374__setup("hugepages=", hugetlb_nrpages_setup);
1375
1376static int __init hugetlb_default_setup(char *s)
1377{
1378 default_hstate_size = memparse(s, &s);
1379 return 1;
1380}
1381__setup("default_hugepagesz=", hugetlb_default_setup);
1371 1382
1372static unsigned int cpuset_mems_nr(unsigned int *array) 1383static unsigned int cpuset_mems_nr(unsigned int *array)
1373{ 1384{