diff options
Diffstat (limited to 'mm/page_alloc.c')
| -rw-r--r-- | mm/page_alloc.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index cc1fe2672a31..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 |
| @@ -1750,6 +1751,8 @@ inline void setup_pageset(struct per_cpu_pageset *p, unsigned long batch) | |||
| 1750 | { | 1751 | { |
| 1751 | struct per_cpu_pages *pcp; | 1752 | struct per_cpu_pages *pcp; |
| 1752 | 1753 | ||
| 1754 | memset(p, 0, sizeof(*p)); | ||
| 1755 | |||
| 1753 | pcp = &p->pcp[0]; /* hot */ | 1756 | pcp = &p->pcp[0]; /* hot */ |
| 1754 | pcp->count = 0; | 1757 | pcp->count = 0; |
| 1755 | pcp->low = 2 * batch; | 1758 | pcp->low = 2 * batch; |
