diff options
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index a6b7d14812e6..e5245d051647 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -1401,7 +1401,7 @@ static void get_scan_ratio(struct zone *zone, struct scan_control *sc, | |||
1401 | free = zone_page_state(zone, NR_FREE_PAGES); | 1401 | free = zone_page_state(zone, NR_FREE_PAGES); |
1402 | /* If we have very few page cache pages, | 1402 | /* If we have very few page cache pages, |
1403 | force-scan anon pages. */ | 1403 | force-scan anon pages. */ |
1404 | if (unlikely(file + free <= zone->pages_high)) { | 1404 | if (unlikely(file + free <= high_wmark_pages(zone))) { |
1405 | percent[0] = 100; | 1405 | percent[0] = 100; |
1406 | percent[1] = 0; | 1406 | percent[1] = 0; |
1407 | return; | 1407 | return; |
@@ -1533,11 +1533,13 @@ static void shrink_zone(int priority, struct zone *zone, | |||
1533 | * try to reclaim pages from zones which will satisfy the caller's allocation | 1533 | * try to reclaim pages from zones which will satisfy the caller's allocation |
1534 | * request. | 1534 | * request. |
1535 | * | 1535 | * |
1536 | * We reclaim from a zone even if that zone is over pages_high. Because: | 1536 | * We reclaim from a zone even if that zone is over high_wmark_pages(zone). |
1537 | * Because: | ||
1537 | * a) The caller may be trying to free *extra* pages to satisfy a higher-order | 1538 | * a) The caller may be trying to free *extra* pages to satisfy a higher-order |
1538 | * allocation or | 1539 | * allocation or |
1539 | * b) The zones may be over pages_high but they must go *over* pages_high to | 1540 | * b) The target zone may be at high_wmark_pages(zone) but the lower zones |
1540 | * satisfy the `incremental min' zone defense algorithm. | 1541 | * must go *over* high_wmark_pages(zone) to satisfy the `incremental min' |
1542 | * zone defense algorithm. | ||
1541 | * | 1543 | * |
1542 | * If a zone is deemed to be full of pinned pages then just give it a light | 1544 | * If a zone is deemed to be full of pinned pages then just give it a light |
1543 | * scan then give up on it. | 1545 | * scan then give up on it. |
@@ -1743,7 +1745,7 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem_cont, | |||
1743 | 1745 | ||
1744 | /* | 1746 | /* |
1745 | * For kswapd, balance_pgdat() will work across all this node's zones until | 1747 | * For kswapd, balance_pgdat() will work across all this node's zones until |
1746 | * they are all at pages_high. | 1748 | * they are all at high_wmark_pages(zone). |
1747 | * | 1749 | * |
1748 | * Returns the number of pages which were actually freed. | 1750 | * Returns the number of pages which were actually freed. |
1749 | * | 1751 | * |
@@ -1756,11 +1758,11 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem_cont, | |||
1756 | * the zone for when the problem goes away. | 1758 | * the zone for when the problem goes away. |
1757 | * | 1759 | * |
1758 | * kswapd scans the zones in the highmem->normal->dma direction. It skips | 1760 | * kswapd scans the zones in the highmem->normal->dma direction. It skips |
1759 | * zones which have free_pages > pages_high, but once a zone is found to have | 1761 | * zones which have free_pages > high_wmark_pages(zone), but once a zone is |
1760 | * free_pages <= pages_high, we scan that zone and the lower zones regardless | 1762 | * found to have free_pages <= high_wmark_pages(zone), we scan that zone and the |
1761 | * of the number of free pages in the lower zones. This interoperates with | 1763 | * lower zones regardless of the number of free pages in the lower zones. This |
1762 | * the page allocator fallback scheme to ensure that aging of pages is balanced | 1764 | * interoperates with the page allocator fallback scheme to ensure that aging |
1763 | * across the zones. | 1765 | * of pages is balanced across the zones. |
1764 | */ | 1766 | */ |
1765 | static unsigned long balance_pgdat(pg_data_t *pgdat, int order) | 1767 | static unsigned long balance_pgdat(pg_data_t *pgdat, int order) |
1766 | { | 1768 | { |
@@ -1781,7 +1783,8 @@ static unsigned long balance_pgdat(pg_data_t *pgdat, int order) | |||
1781 | }; | 1783 | }; |
1782 | /* | 1784 | /* |
1783 | * temp_priority is used to remember the scanning priority at which | 1785 | * temp_priority is used to remember the scanning priority at which |
1784 | * this zone was successfully refilled to free_pages == pages_high. | 1786 | * this zone was successfully refilled to |
1787 | * free_pages == high_wmark_pages(zone). | ||
1785 | */ | 1788 | */ |
1786 | int temp_priority[MAX_NR_ZONES]; | 1789 | int temp_priority[MAX_NR_ZONES]; |
1787 | 1790 | ||
@@ -1826,8 +1829,8 @@ loop_again: | |||
1826 | shrink_active_list(SWAP_CLUSTER_MAX, zone, | 1829 | shrink_active_list(SWAP_CLUSTER_MAX, zone, |
1827 | &sc, priority, 0); | 1830 | &sc, priority, 0); |
1828 | 1831 | ||
1829 | if (!zone_watermark_ok(zone, order, zone->pages_high, | 1832 | if (!zone_watermark_ok(zone, order, |
1830 | 0, 0)) { | 1833 | high_wmark_pages(zone), 0, 0)) { |
1831 | end_zone = i; | 1834 | end_zone = i; |
1832 | break; | 1835 | break; |
1833 | } | 1836 | } |
@@ -1861,8 +1864,8 @@ loop_again: | |||
1861 | priority != DEF_PRIORITY) | 1864 | priority != DEF_PRIORITY) |
1862 | continue; | 1865 | continue; |
1863 | 1866 | ||
1864 | if (!zone_watermark_ok(zone, order, zone->pages_high, | 1867 | if (!zone_watermark_ok(zone, order, |
1865 | end_zone, 0)) | 1868 | high_wmark_pages(zone), end_zone, 0)) |
1866 | all_zones_ok = 0; | 1869 | all_zones_ok = 0; |
1867 | temp_priority[i] = priority; | 1870 | temp_priority[i] = priority; |
1868 | sc.nr_scanned = 0; | 1871 | sc.nr_scanned = 0; |
@@ -1871,8 +1874,8 @@ loop_again: | |||
1871 | * We put equal pressure on every zone, unless one | 1874 | * We put equal pressure on every zone, unless one |
1872 | * zone has way too many pages free already. | 1875 | * zone has way too many pages free already. |
1873 | */ | 1876 | */ |
1874 | if (!zone_watermark_ok(zone, order, 8*zone->pages_high, | 1877 | if (!zone_watermark_ok(zone, order, |
1875 | end_zone, 0)) | 1878 | 8*high_wmark_pages(zone), end_zone, 0)) |
1876 | shrink_zone(priority, zone, &sc); | 1879 | shrink_zone(priority, zone, &sc); |
1877 | reclaim_state->reclaimed_slab = 0; | 1880 | reclaim_state->reclaimed_slab = 0; |
1878 | nr_slab = shrink_slab(sc.nr_scanned, GFP_KERNEL, | 1881 | nr_slab = shrink_slab(sc.nr_scanned, GFP_KERNEL, |
@@ -2038,7 +2041,7 @@ void wakeup_kswapd(struct zone *zone, int order) | |||
2038 | return; | 2041 | return; |
2039 | 2042 | ||
2040 | pgdat = zone->zone_pgdat; | 2043 | pgdat = zone->zone_pgdat; |
2041 | if (zone_watermark_ok(zone, order, zone->pages_low, 0, 0)) | 2044 | if (zone_watermark_ok(zone, order, low_wmark_pages(zone), 0, 0)) |
2042 | return; | 2045 | return; |
2043 | if (pgdat->kswapd_max_order < order) | 2046 | if (pgdat->kswapd_max_order < order) |
2044 | pgdat->kswapd_max_order = order; | 2047 | pgdat->kswapd_max_order = order; |