diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/page_alloc.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 4ffed1cd158b..b5a58d476c1a 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -3265,6 +3265,16 @@ static void inline setup_usemap(struct pglist_data *pgdat, | |||
3265 | #endif /* CONFIG_SPARSEMEM */ | 3265 | #endif /* CONFIG_SPARSEMEM */ |
3266 | 3266 | ||
3267 | #ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE | 3267 | #ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE |
3268 | |||
3269 | /* Return a sensible default order for the pageblock size. */ | ||
3270 | static inline int pageblock_default_order(void) | ||
3271 | { | ||
3272 | if (HPAGE_SHIFT > PAGE_SHIFT) | ||
3273 | return HUGETLB_PAGE_ORDER; | ||
3274 | |||
3275 | return MAX_ORDER-1; | ||
3276 | } | ||
3277 | |||
3268 | /* Initialise the number of pages represented by NR_PAGEBLOCK_BITS */ | 3278 | /* Initialise the number of pages represented by NR_PAGEBLOCK_BITS */ |
3269 | static inline void __init set_pageblock_order(unsigned int order) | 3279 | static inline void __init set_pageblock_order(unsigned int order) |
3270 | { | 3280 | { |
@@ -3280,7 +3290,16 @@ static inline void __init set_pageblock_order(unsigned int order) | |||
3280 | } | 3290 | } |
3281 | #else /* CONFIG_HUGETLB_PAGE_SIZE_VARIABLE */ | 3291 | #else /* CONFIG_HUGETLB_PAGE_SIZE_VARIABLE */ |
3282 | 3292 | ||
3283 | /* Defined this way to avoid accidently referencing HUGETLB_PAGE_ORDER */ | 3293 | /* |
3294 | * When CONFIG_HUGETLB_PAGE_SIZE_VARIABLE is not set, set_pageblock_order() | ||
3295 | * and pageblock_default_order() are unused as pageblock_order is set | ||
3296 | * at compile-time. See include/linux/pageblock-flags.h for the values of | ||
3297 | * pageblock_order based on the kernel config | ||
3298 | */ | ||
3299 | static inline int pageblock_default_order(unsigned int order) | ||
3300 | { | ||
3301 | return MAX_ORDER-1; | ||
3302 | } | ||
3284 | #define set_pageblock_order(x) do {} while (0) | 3303 | #define set_pageblock_order(x) do {} while (0) |
3285 | 3304 | ||
3286 | #endif /* CONFIG_HUGETLB_PAGE_SIZE_VARIABLE */ | 3305 | #endif /* CONFIG_HUGETLB_PAGE_SIZE_VARIABLE */ |
@@ -3365,7 +3384,7 @@ static void __meminit free_area_init_core(struct pglist_data *pgdat, | |||
3365 | if (!size) | 3384 | if (!size) |
3366 | continue; | 3385 | continue; |
3367 | 3386 | ||
3368 | set_pageblock_order(HUGETLB_PAGE_ORDER); | 3387 | set_pageblock_order(pageblock_default_order()); |
3369 | setup_usemap(pgdat, zone, size); | 3388 | setup_usemap(pgdat, zone, size); |
3370 | ret = init_currently_empty_zone(zone, zone_start_pfn, | 3389 | ret = init_currently_empty_zone(zone, zone_start_pfn, |
3371 | size, MEMMAP_EARLY); | 3390 | size, MEMMAP_EARLY); |