diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e1d3d77f4aee..94c864eac9c4 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -734,7 +734,7 @@ buffered_rmqueue(struct zone *zone, int order, gfp_t gfp_flags) | |||
734 | * of the allocation. | 734 | * of the allocation. |
735 | */ | 735 | */ |
736 | int zone_watermark_ok(struct zone *z, int order, unsigned long mark, | 736 | int zone_watermark_ok(struct zone *z, int order, unsigned long mark, |
737 | int classzone_idx, int can_try_harder, int gfp_high) | 737 | int classzone_idx, int can_try_harder, gfp_t gfp_high) |
738 | { | 738 | { |
739 | /* free_pages my go negative - that's OK */ | 739 | /* free_pages my go negative - that's OK */ |
740 | long min = mark, free_pages = z->free_pages - (1 << order) + 1; | 740 | long min = mark, free_pages = z->free_pages - (1 << order) + 1; |
@@ -777,7 +777,7 @@ struct page * fastcall | |||
777 | __alloc_pages(gfp_t gfp_mask, unsigned int order, | 777 | __alloc_pages(gfp_t gfp_mask, unsigned int order, |
778 | struct zonelist *zonelist) | 778 | struct zonelist *zonelist) |
779 | { | 779 | { |
780 | const int wait = gfp_mask & __GFP_WAIT; | 780 | const gfp_t wait = gfp_mask & __GFP_WAIT; |
781 | struct zone **zones, *z; | 781 | struct zone **zones, *z; |
782 | struct page *page; | 782 | struct page *page; |
783 | struct reclaim_state reclaim_state; | 783 | struct reclaim_state reclaim_state; |
@@ -996,7 +996,7 @@ fastcall unsigned long get_zeroed_page(gfp_t gfp_mask) | |||
996 | * get_zeroed_page() returns a 32-bit address, which cannot represent | 996 | * get_zeroed_page() returns a 32-bit address, which cannot represent |
997 | * a highmem page | 997 | * a highmem page |
998 | */ | 998 | */ |
999 | BUG_ON(gfp_mask & __GFP_HIGHMEM); | 999 | BUG_ON((gfp_mask & __GFP_HIGHMEM) != 0); |
1000 | 1000 | ||
1001 | page = alloc_pages(gfp_mask | __GFP_ZERO, 0); | 1001 | page = alloc_pages(gfp_mask | __GFP_ZERO, 0); |
1002 | if (page) | 1002 | if (page) |
@@ -1089,7 +1089,7 @@ static unsigned int nr_free_zone_pages(int offset) | |||
1089 | */ | 1089 | */ |
1090 | unsigned int nr_free_buffer_pages(void) | 1090 | unsigned int nr_free_buffer_pages(void) |
1091 | { | 1091 | { |
1092 | return nr_free_zone_pages(GFP_USER & GFP_ZONEMASK); | 1092 | return nr_free_zone_pages(gfp_zone(GFP_USER)); |
1093 | } | 1093 | } |
1094 | 1094 | ||
1095 | /* | 1095 | /* |
@@ -1097,7 +1097,7 @@ unsigned int nr_free_buffer_pages(void) | |||
1097 | */ | 1097 | */ |
1098 | unsigned int nr_free_pagecache_pages(void) | 1098 | unsigned int nr_free_pagecache_pages(void) |
1099 | { | 1099 | { |
1100 | return nr_free_zone_pages(GFP_HIGHUSER & GFP_ZONEMASK); | 1100 | return nr_free_zone_pages(gfp_zone(GFP_HIGHUSER)); |
1101 | } | 1101 | } |
1102 | 1102 | ||
1103 | #ifdef CONFIG_HIGHMEM | 1103 | #ifdef CONFIG_HIGHMEM |
@@ -1428,6 +1428,16 @@ static int __init build_zonelists_node(pg_data_t *pgdat, struct zonelist *zoneli | |||
1428 | return j; | 1428 | return j; |
1429 | } | 1429 | } |
1430 | 1430 | ||
1431 | static inline int highest_zone(int zone_bits) | ||
1432 | { | ||
1433 | int res = ZONE_NORMAL; | ||
1434 | if (zone_bits & (__force int)__GFP_HIGHMEM) | ||
1435 | res = ZONE_HIGHMEM; | ||
1436 | if (zone_bits & (__force int)__GFP_DMA) | ||
1437 | res = ZONE_DMA; | ||
1438 | return res; | ||
1439 | } | ||
1440 | |||
1431 | #ifdef CONFIG_NUMA | 1441 | #ifdef CONFIG_NUMA |
1432 | #define MAX_NODE_LOAD (num_online_nodes()) | 1442 | #define MAX_NODE_LOAD (num_online_nodes()) |
1433 | static int __initdata node_load[MAX_NUMNODES]; | 1443 | static int __initdata node_load[MAX_NUMNODES]; |
@@ -1524,11 +1534,7 @@ static void __init build_zonelists(pg_data_t *pgdat) | |||
1524 | zonelist = pgdat->node_zonelists + i; | 1534 | zonelist = pgdat->node_zonelists + i; |
1525 | for (j = 0; zonelist->zones[j] != NULL; j++); | 1535 | for (j = 0; zonelist->zones[j] != NULL; j++); |
1526 | 1536 | ||
1527 | k = ZONE_NORMAL; | 1537 | k = highest_zone(i); |
1528 | if (i & __GFP_HIGHMEM) | ||
1529 | k = ZONE_HIGHMEM; | ||
1530 | if (i & __GFP_DMA) | ||
1531 | k = ZONE_DMA; | ||
1532 | 1538 | ||
1533 | j = build_zonelists_node(NODE_DATA(node), zonelist, j, k); | 1539 | j = build_zonelists_node(NODE_DATA(node), zonelist, j, k); |
1534 | zonelist->zones[j] = NULL; | 1540 | zonelist->zones[j] = NULL; |
@@ -1549,12 +1555,7 @@ static void __init build_zonelists(pg_data_t *pgdat) | |||
1549 | zonelist = pgdat->node_zonelists + i; | 1555 | zonelist = pgdat->node_zonelists + i; |
1550 | 1556 | ||
1551 | j = 0; | 1557 | j = 0; |
1552 | k = ZONE_NORMAL; | 1558 | k = highest_zone(i); |
1553 | if (i & __GFP_HIGHMEM) | ||
1554 | k = ZONE_HIGHMEM; | ||
1555 | if (i & __GFP_DMA) | ||
1556 | k = ZONE_DMA; | ||
1557 | |||
1558 | j = build_zonelists_node(pgdat, zonelist, j, k); | 1559 | j = build_zonelists_node(pgdat, zonelist, j, k); |
1559 | /* | 1560 | /* |
1560 | * Now we build the zonelist so that it contains the zones | 1561 | * Now we build the zonelist so that it contains the zones |