diff options
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 177 |
1 files changed, 108 insertions, 69 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index c26986c85ce0..79c809895fba 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -262,27 +262,6 @@ unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, | |||
262 | return ret; | 262 | return ret; |
263 | } | 263 | } |
264 | 264 | ||
265 | /* Called without lock on whether page is mapped, so answer is unstable */ | ||
266 | static inline int page_mapping_inuse(struct page *page) | ||
267 | { | ||
268 | struct address_space *mapping; | ||
269 | |||
270 | /* Page is in somebody's page tables. */ | ||
271 | if (page_mapped(page)) | ||
272 | return 1; | ||
273 | |||
274 | /* Be more reluctant to reclaim swapcache than pagecache */ | ||
275 | if (PageSwapCache(page)) | ||
276 | return 1; | ||
277 | |||
278 | mapping = page_mapping(page); | ||
279 | if (!mapping) | ||
280 | return 0; | ||
281 | |||
282 | /* File is mmap'd by somebody? */ | ||
283 | return mapping_mapped(mapping); | ||
284 | } | ||
285 | |||
286 | static inline int is_page_cache_freeable(struct page *page) | 265 | static inline int is_page_cache_freeable(struct page *page) |
287 | { | 266 | { |
288 | /* | 267 | /* |
@@ -579,6 +558,65 @@ redo: | |||
579 | put_page(page); /* drop ref from isolate */ | 558 | put_page(page); /* drop ref from isolate */ |
580 | } | 559 | } |
581 | 560 | ||
561 | enum page_references { | ||
562 | PAGEREF_RECLAIM, | ||
563 | PAGEREF_RECLAIM_CLEAN, | ||
564 | PAGEREF_KEEP, | ||
565 | PAGEREF_ACTIVATE, | ||
566 | }; | ||
567 | |||
568 | static enum page_references page_check_references(struct page *page, | ||
569 | struct scan_control *sc) | ||
570 | { | ||
571 | int referenced_ptes, referenced_page; | ||
572 | unsigned long vm_flags; | ||
573 | |||
574 | referenced_ptes = page_referenced(page, 1, sc->mem_cgroup, &vm_flags); | ||
575 | referenced_page = TestClearPageReferenced(page); | ||
576 | |||
577 | /* Lumpy reclaim - ignore references */ | ||
578 | if (sc->order > PAGE_ALLOC_COSTLY_ORDER) | ||
579 | return PAGEREF_RECLAIM; | ||
580 | |||
581 | /* | ||
582 | * Mlock lost the isolation race with us. Let try_to_unmap() | ||
583 | * move the page to the unevictable list. | ||
584 | */ | ||
585 | if (vm_flags & VM_LOCKED) | ||
586 | return PAGEREF_RECLAIM; | ||
587 | |||
588 | if (referenced_ptes) { | ||
589 | if (PageAnon(page)) | ||
590 | return PAGEREF_ACTIVATE; | ||
591 | /* | ||
592 | * All mapped pages start out with page table | ||
593 | * references from the instantiating fault, so we need | ||
594 | * to look twice if a mapped file page is used more | ||
595 | * than once. | ||
596 | * | ||
597 | * Mark it and spare it for another trip around the | ||
598 | * inactive list. Another page table reference will | ||
599 | * lead to its activation. | ||
600 | * | ||
601 | * Note: the mark is set for activated pages as well | ||
602 | * so that recently deactivated but used pages are | ||
603 | * quickly recovered. | ||
604 | */ | ||
605 | SetPageReferenced(page); | ||
606 | |||
607 | if (referenced_page) | ||
608 | return PAGEREF_ACTIVATE; | ||
609 | |||
610 | return PAGEREF_KEEP; | ||
611 | } | ||
612 | |||
613 | /* Reclaim if clean, defer dirty pages to writeback */ | ||
614 | if (referenced_page) | ||
615 | return PAGEREF_RECLAIM_CLEAN; | ||
616 | |||
617 | return PAGEREF_RECLAIM; | ||
618 | } | ||
619 | |||
582 | /* | 620 | /* |
583 | * shrink_page_list() returns the number of reclaimed pages | 621 | * shrink_page_list() returns the number of reclaimed pages |
584 | */ | 622 | */ |
@@ -590,16 +628,15 @@ static unsigned long shrink_page_list(struct list_head *page_list, | |||
590 | struct pagevec freed_pvec; | 628 | struct pagevec freed_pvec; |
591 | int pgactivate = 0; | 629 | int pgactivate = 0; |
592 | unsigned long nr_reclaimed = 0; | 630 | unsigned long nr_reclaimed = 0; |
593 | unsigned long vm_flags; | ||
594 | 631 | ||
595 | cond_resched(); | 632 | cond_resched(); |
596 | 633 | ||
597 | pagevec_init(&freed_pvec, 1); | 634 | pagevec_init(&freed_pvec, 1); |
598 | while (!list_empty(page_list)) { | 635 | while (!list_empty(page_list)) { |
636 | enum page_references references; | ||
599 | struct address_space *mapping; | 637 | struct address_space *mapping; |
600 | struct page *page; | 638 | struct page *page; |
601 | int may_enter_fs; | 639 | int may_enter_fs; |
602 | int referenced; | ||
603 | 640 | ||
604 | cond_resched(); | 641 | cond_resched(); |
605 | 642 | ||
@@ -641,17 +678,16 @@ static unsigned long shrink_page_list(struct list_head *page_list, | |||
641 | goto keep_locked; | 678 | goto keep_locked; |
642 | } | 679 | } |
643 | 680 | ||
644 | referenced = page_referenced(page, 1, | 681 | references = page_check_references(page, sc); |
645 | sc->mem_cgroup, &vm_flags); | 682 | switch (references) { |
646 | /* | 683 | case PAGEREF_ACTIVATE: |
647 | * In active use or really unfreeable? Activate it. | ||
648 | * If page which have PG_mlocked lost isoltation race, | ||
649 | * try_to_unmap moves it to unevictable list | ||
650 | */ | ||
651 | if (sc->order <= PAGE_ALLOC_COSTLY_ORDER && | ||
652 | referenced && page_mapping_inuse(page) | ||
653 | && !(vm_flags & VM_LOCKED)) | ||
654 | goto activate_locked; | 684 | goto activate_locked; |
685 | case PAGEREF_KEEP: | ||
686 | goto keep_locked; | ||
687 | case PAGEREF_RECLAIM: | ||
688 | case PAGEREF_RECLAIM_CLEAN: | ||
689 | ; /* try to reclaim the page below */ | ||
690 | } | ||
655 | 691 | ||
656 | /* | 692 | /* |
657 | * Anonymous process memory has backing store? | 693 | * Anonymous process memory has backing store? |
@@ -685,7 +721,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, | |||
685 | } | 721 | } |
686 | 722 | ||
687 | if (PageDirty(page)) { | 723 | if (PageDirty(page)) { |
688 | if (sc->order <= PAGE_ALLOC_COSTLY_ORDER && referenced) | 724 | if (references == PAGEREF_RECLAIM_CLEAN) |
689 | goto keep_locked; | 725 | goto keep_locked; |
690 | if (!may_enter_fs) | 726 | if (!may_enter_fs) |
691 | goto keep_locked; | 727 | goto keep_locked; |
@@ -1350,9 +1386,7 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, | |||
1350 | continue; | 1386 | continue; |
1351 | } | 1387 | } |
1352 | 1388 | ||
1353 | /* page_referenced clears PageReferenced */ | 1389 | if (page_referenced(page, 0, sc->mem_cgroup, &vm_flags)) { |
1354 | if (page_mapping_inuse(page) && | ||
1355 | page_referenced(page, 0, sc->mem_cgroup, &vm_flags)) { | ||
1356 | nr_rotated++; | 1390 | nr_rotated++; |
1357 | /* | 1391 | /* |
1358 | * Identify referenced, file-backed active pages and | 1392 | * Identify referenced, file-backed active pages and |
@@ -1501,6 +1535,13 @@ static void get_scan_ratio(struct zone *zone, struct scan_control *sc, | |||
1501 | unsigned long ap, fp; | 1535 | unsigned long ap, fp; |
1502 | struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(zone, sc); | 1536 | struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(zone, sc); |
1503 | 1537 | ||
1538 | /* If we have no swap space, do not bother scanning anon pages. */ | ||
1539 | if (!sc->may_swap || (nr_swap_pages <= 0)) { | ||
1540 | percent[0] = 0; | ||
1541 | percent[1] = 100; | ||
1542 | return; | ||
1543 | } | ||
1544 | |||
1504 | anon = zone_nr_lru_pages(zone, sc, LRU_ACTIVE_ANON) + | 1545 | anon = zone_nr_lru_pages(zone, sc, LRU_ACTIVE_ANON) + |
1505 | zone_nr_lru_pages(zone, sc, LRU_INACTIVE_ANON); | 1546 | zone_nr_lru_pages(zone, sc, LRU_INACTIVE_ANON); |
1506 | file = zone_nr_lru_pages(zone, sc, LRU_ACTIVE_FILE) + | 1547 | file = zone_nr_lru_pages(zone, sc, LRU_ACTIVE_FILE) + |
@@ -1598,22 +1639,20 @@ static void shrink_zone(int priority, struct zone *zone, | |||
1598 | unsigned long nr_reclaimed = sc->nr_reclaimed; | 1639 | unsigned long nr_reclaimed = sc->nr_reclaimed; |
1599 | unsigned long nr_to_reclaim = sc->nr_to_reclaim; | 1640 | unsigned long nr_to_reclaim = sc->nr_to_reclaim; |
1600 | struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(zone, sc); | 1641 | struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(zone, sc); |
1601 | int noswap = 0; | ||
1602 | 1642 | ||
1603 | /* If we have no swap space, do not bother scanning anon pages. */ | 1643 | get_scan_ratio(zone, sc, percent); |
1604 | if (!sc->may_swap || (nr_swap_pages <= 0)) { | ||
1605 | noswap = 1; | ||
1606 | percent[0] = 0; | ||
1607 | percent[1] = 100; | ||
1608 | } else | ||
1609 | get_scan_ratio(zone, sc, percent); | ||
1610 | 1644 | ||
1611 | for_each_evictable_lru(l) { | 1645 | for_each_evictable_lru(l) { |
1612 | int file = is_file_lru(l); | 1646 | int file = is_file_lru(l); |
1613 | unsigned long scan; | 1647 | unsigned long scan; |
1614 | 1648 | ||
1649 | if (percent[file] == 0) { | ||
1650 | nr[l] = 0; | ||
1651 | continue; | ||
1652 | } | ||
1653 | |||
1615 | scan = zone_nr_lru_pages(zone, sc, l); | 1654 | scan = zone_nr_lru_pages(zone, sc, l); |
1616 | if (priority || noswap) { | 1655 | if (priority) { |
1617 | scan >>= priority; | 1656 | scan >>= priority; |
1618 | scan = (scan * percent[file]) / 100; | 1657 | scan = (scan * percent[file]) / 100; |
1619 | } | 1658 | } |
@@ -1694,8 +1733,7 @@ static void shrink_zones(int priority, struct zonelist *zonelist, | |||
1694 | continue; | 1733 | continue; |
1695 | note_zone_scanning_priority(zone, priority); | 1734 | note_zone_scanning_priority(zone, priority); |
1696 | 1735 | ||
1697 | if (zone_is_all_unreclaimable(zone) && | 1736 | if (zone->all_unreclaimable && priority != DEF_PRIORITY) |
1698 | priority != DEF_PRIORITY) | ||
1699 | continue; /* Let kswapd poll it */ | 1737 | continue; /* Let kswapd poll it */ |
1700 | sc->all_unreclaimable = 0; | 1738 | sc->all_unreclaimable = 0; |
1701 | } else { | 1739 | } else { |
@@ -1922,7 +1960,7 @@ static int sleeping_prematurely(pg_data_t *pgdat, int order, long remaining) | |||
1922 | if (!populated_zone(zone)) | 1960 | if (!populated_zone(zone)) |
1923 | continue; | 1961 | continue; |
1924 | 1962 | ||
1925 | if (zone_is_all_unreclaimable(zone)) | 1963 | if (zone->all_unreclaimable) |
1926 | continue; | 1964 | continue; |
1927 | 1965 | ||
1928 | if (!zone_watermark_ok(zone, order, high_wmark_pages(zone), | 1966 | if (!zone_watermark_ok(zone, order, high_wmark_pages(zone), |
@@ -2012,8 +2050,7 @@ loop_again: | |||
2012 | if (!populated_zone(zone)) | 2050 | if (!populated_zone(zone)) |
2013 | continue; | 2051 | continue; |
2014 | 2052 | ||
2015 | if (zone_is_all_unreclaimable(zone) && | 2053 | if (zone->all_unreclaimable && priority != DEF_PRIORITY) |
2016 | priority != DEF_PRIORITY) | ||
2017 | continue; | 2054 | continue; |
2018 | 2055 | ||
2019 | /* | 2056 | /* |
@@ -2056,13 +2093,9 @@ loop_again: | |||
2056 | if (!populated_zone(zone)) | 2093 | if (!populated_zone(zone)) |
2057 | continue; | 2094 | continue; |
2058 | 2095 | ||
2059 | if (zone_is_all_unreclaimable(zone) && | 2096 | if (zone->all_unreclaimable && priority != DEF_PRIORITY) |
2060 | priority != DEF_PRIORITY) | ||
2061 | continue; | 2097 | continue; |
2062 | 2098 | ||
2063 | if (!zone_watermark_ok(zone, order, | ||
2064 | high_wmark_pages(zone), end_zone, 0)) | ||
2065 | all_zones_ok = 0; | ||
2066 | temp_priority[i] = priority; | 2099 | temp_priority[i] = priority; |
2067 | sc.nr_scanned = 0; | 2100 | sc.nr_scanned = 0; |
2068 | note_zone_scanning_priority(zone, priority); | 2101 | note_zone_scanning_priority(zone, priority); |
@@ -2087,12 +2120,11 @@ loop_again: | |||
2087 | lru_pages); | 2120 | lru_pages); |
2088 | sc.nr_reclaimed += reclaim_state->reclaimed_slab; | 2121 | sc.nr_reclaimed += reclaim_state->reclaimed_slab; |
2089 | total_scanned += sc.nr_scanned; | 2122 | total_scanned += sc.nr_scanned; |
2090 | if (zone_is_all_unreclaimable(zone)) | 2123 | if (zone->all_unreclaimable) |
2091 | continue; | 2124 | continue; |
2092 | if (nr_slab == 0 && zone->pages_scanned >= | 2125 | if (nr_slab == 0 && |
2093 | (zone_reclaimable_pages(zone) * 6)) | 2126 | zone->pages_scanned >= (zone_reclaimable_pages(zone) * 6)) |
2094 | zone_set_flag(zone, | 2127 | zone->all_unreclaimable = 1; |
2095 | ZONE_ALL_UNRECLAIMABLE); | ||
2096 | /* | 2128 | /* |
2097 | * If we've done a decent amount of scanning and | 2129 | * If we've done a decent amount of scanning and |
2098 | * the reclaim ratio is low, start doing writepage | 2130 | * the reclaim ratio is low, start doing writepage |
@@ -2102,13 +2134,18 @@ loop_again: | |||
2102 | total_scanned > sc.nr_reclaimed + sc.nr_reclaimed / 2) | 2134 | total_scanned > sc.nr_reclaimed + sc.nr_reclaimed / 2) |
2103 | sc.may_writepage = 1; | 2135 | sc.may_writepage = 1; |
2104 | 2136 | ||
2105 | /* | 2137 | if (!zone_watermark_ok(zone, order, |
2106 | * We are still under min water mark. it mean we have | 2138 | high_wmark_pages(zone), end_zone, 0)) { |
2107 | * GFP_ATOMIC allocation failure risk. Hurry up! | 2139 | all_zones_ok = 0; |
2108 | */ | 2140 | /* |
2109 | if (!zone_watermark_ok(zone, order, min_wmark_pages(zone), | 2141 | * We are still under min water mark. This |
2110 | end_zone, 0)) | 2142 | * means that we have a GFP_ATOMIC allocation |
2111 | has_under_min_watermark_zone = 1; | 2143 | * failure risk. Hurry up! |
2144 | */ | ||
2145 | if (!zone_watermark_ok(zone, order, | ||
2146 | min_wmark_pages(zone), end_zone, 0)) | ||
2147 | has_under_min_watermark_zone = 1; | ||
2148 | } | ||
2112 | 2149 | ||
2113 | } | 2150 | } |
2114 | if (all_zones_ok) | 2151 | if (all_zones_ok) |
@@ -2550,6 +2587,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) | |||
2550 | * and RECLAIM_SWAP. | 2587 | * and RECLAIM_SWAP. |
2551 | */ | 2588 | */ |
2552 | p->flags |= PF_MEMALLOC | PF_SWAPWRITE; | 2589 | p->flags |= PF_MEMALLOC | PF_SWAPWRITE; |
2590 | lockdep_set_current_reclaim_state(gfp_mask); | ||
2553 | reclaim_state.reclaimed_slab = 0; | 2591 | reclaim_state.reclaimed_slab = 0; |
2554 | p->reclaim_state = &reclaim_state; | 2592 | p->reclaim_state = &reclaim_state; |
2555 | 2593 | ||
@@ -2593,6 +2631,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) | |||
2593 | 2631 | ||
2594 | p->reclaim_state = NULL; | 2632 | p->reclaim_state = NULL; |
2595 | current->flags &= ~(PF_MEMALLOC | PF_SWAPWRITE); | 2633 | current->flags &= ~(PF_MEMALLOC | PF_SWAPWRITE); |
2634 | lockdep_clear_current_reclaim_state(); | ||
2596 | return sc.nr_reclaimed >= nr_pages; | 2635 | return sc.nr_reclaimed >= nr_pages; |
2597 | } | 2636 | } |
2598 | 2637 | ||
@@ -2615,7 +2654,7 @@ int zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) | |||
2615 | zone_page_state(zone, NR_SLAB_RECLAIMABLE) <= zone->min_slab_pages) | 2654 | zone_page_state(zone, NR_SLAB_RECLAIMABLE) <= zone->min_slab_pages) |
2616 | return ZONE_RECLAIM_FULL; | 2655 | return ZONE_RECLAIM_FULL; |
2617 | 2656 | ||
2618 | if (zone_is_all_unreclaimable(zone)) | 2657 | if (zone->all_unreclaimable) |
2619 | return ZONE_RECLAIM_FULL; | 2658 | return ZONE_RECLAIM_FULL; |
2620 | 2659 | ||
2621 | /* | 2660 | /* |