vmscan.c (0139aa7b7fa12ceef095d99dc36606a5b10ab83a) | vmscan.c (9d5e6a9f22311b00a20ff9b072760ad3e73f0d99) |
---|---|
1/* 2 * linux/mm/vmscan.c 3 * 4 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds 5 * 6 * Swap reorganised 29.12.95, Stephen Tweedie. 7 * kswapd added: 7.1.96 sct 8 * Removed kswapd_ctl limits, and swap out as many pages as needed --- 1360 unchanged lines hidden (view full) --- 1369{ 1370 struct list_head *src = &lruvec->lists[lru]; 1371 unsigned long nr_taken = 0; 1372 unsigned long scan; 1373 1374 for (scan = 0; scan < nr_to_scan && nr_taken < nr_to_scan && 1375 !list_empty(src); scan++) { 1376 struct page *page; | 1/* 2 * linux/mm/vmscan.c 3 * 4 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds 5 * 6 * Swap reorganised 29.12.95, Stephen Tweedie. 7 * kswapd added: 7.1.96 sct 8 * Removed kswapd_ctl limits, and swap out as many pages as needed --- 1360 unchanged lines hidden (view full) --- 1369{ 1370 struct list_head *src = &lruvec->lists[lru]; 1371 unsigned long nr_taken = 0; 1372 unsigned long scan; 1373 1374 for (scan = 0; scan < nr_to_scan && nr_taken < nr_to_scan && 1375 !list_empty(src); scan++) { 1376 struct page *page; |
1377 int nr_pages; | |
1378 1379 page = lru_to_page(src); 1380 prefetchw_prev_lru_page(page, src, flags); 1381 1382 VM_BUG_ON_PAGE(!PageLRU(page), page); 1383 1384 switch (__isolate_lru_page(page, mode)) { 1385 case 0: | 1377 1378 page = lru_to_page(src); 1379 prefetchw_prev_lru_page(page, src, flags); 1380 1381 VM_BUG_ON_PAGE(!PageLRU(page), page); 1382 1383 switch (__isolate_lru_page(page, mode)) { 1384 case 0: |
1386 nr_pages = hpage_nr_pages(page); 1387 mem_cgroup_update_lru_size(lruvec, lru, -nr_pages); | 1385 nr_taken += hpage_nr_pages(page); |
1388 list_move(&page->lru, dst); | 1386 list_move(&page->lru, dst); |
1389 nr_taken += nr_pages; | |
1390 break; 1391 1392 case -EBUSY: 1393 /* else it is being freed elsewhere */ 1394 list_move(&page->lru, src); 1395 continue; 1396 1397 default: --- 199 unchanged lines hidden (view full) --- 1597 if (!sc->may_writepage) 1598 isolate_mode |= ISOLATE_CLEAN; 1599 1600 spin_lock_irq(&zone->lru_lock); 1601 1602 nr_taken = isolate_lru_pages(nr_to_scan, lruvec, &page_list, 1603 &nr_scanned, sc, isolate_mode, lru); 1604 | 1387 break; 1388 1389 case -EBUSY: 1390 /* else it is being freed elsewhere */ 1391 list_move(&page->lru, src); 1392 continue; 1393 1394 default: --- 199 unchanged lines hidden (view full) --- 1594 if (!sc->may_writepage) 1595 isolate_mode |= ISOLATE_CLEAN; 1596 1597 spin_lock_irq(&zone->lru_lock); 1598 1599 nr_taken = isolate_lru_pages(nr_to_scan, lruvec, &page_list, 1600 &nr_scanned, sc, isolate_mode, lru); 1601 |
1605 __mod_zone_page_state(zone, NR_LRU_BASE + lru, -nr_taken); | 1602 update_lru_size(lruvec, lru, -nr_taken); |
1606 __mod_zone_page_state(zone, NR_ISOLATED_ANON + file, nr_taken); | 1603 __mod_zone_page_state(zone, NR_ISOLATED_ANON + file, nr_taken); |
1604 reclaim_stat->recent_scanned[file] += nr_taken; |
|
1607 1608 if (global_reclaim(sc)) { 1609 __mod_zone_page_state(zone, NR_PAGES_SCANNED, nr_scanned); 1610 if (current_is_kswapd()) 1611 __count_zone_vm_events(PGSCAN_KSWAPD, zone, nr_scanned); 1612 else 1613 __count_zone_vm_events(PGSCAN_DIRECT, zone, nr_scanned); 1614 } --- 4 unchanged lines hidden (view full) --- 1619 1620 nr_reclaimed = shrink_page_list(&page_list, zone, sc, TTU_UNMAP, 1621 &nr_dirty, &nr_unqueued_dirty, &nr_congested, 1622 &nr_writeback, &nr_immediate, 1623 false); 1624 1625 spin_lock_irq(&zone->lru_lock); 1626 | 1605 1606 if (global_reclaim(sc)) { 1607 __mod_zone_page_state(zone, NR_PAGES_SCANNED, nr_scanned); 1608 if (current_is_kswapd()) 1609 __count_zone_vm_events(PGSCAN_KSWAPD, zone, nr_scanned); 1610 else 1611 __count_zone_vm_events(PGSCAN_DIRECT, zone, nr_scanned); 1612 } --- 4 unchanged lines hidden (view full) --- 1617 1618 nr_reclaimed = shrink_page_list(&page_list, zone, sc, TTU_UNMAP, 1619 &nr_dirty, &nr_unqueued_dirty, &nr_congested, 1620 &nr_writeback, &nr_immediate, 1621 false); 1622 1623 spin_lock_irq(&zone->lru_lock); 1624 |
1627 reclaim_stat->recent_scanned[file] += nr_taken; 1628 | |
1629 if (global_reclaim(sc)) { 1630 if (current_is_kswapd()) 1631 __count_zone_vm_events(PGSTEAL_KSWAPD, zone, 1632 nr_reclaimed); 1633 else 1634 __count_zone_vm_events(PGSTEAL_DIRECT, zone, 1635 nr_reclaimed); 1636 } --- 100 unchanged lines hidden (view full) --- 1737 while (!list_empty(list)) { 1738 page = lru_to_page(list); 1739 lruvec = mem_cgroup_page_lruvec(page, zone); 1740 1741 VM_BUG_ON_PAGE(PageLRU(page), page); 1742 SetPageLRU(page); 1743 1744 nr_pages = hpage_nr_pages(page); | 1625 if (global_reclaim(sc)) { 1626 if (current_is_kswapd()) 1627 __count_zone_vm_events(PGSTEAL_KSWAPD, zone, 1628 nr_reclaimed); 1629 else 1630 __count_zone_vm_events(PGSTEAL_DIRECT, zone, 1631 nr_reclaimed); 1632 } --- 100 unchanged lines hidden (view full) --- 1733 while (!list_empty(list)) { 1734 page = lru_to_page(list); 1735 lruvec = mem_cgroup_page_lruvec(page, zone); 1736 1737 VM_BUG_ON_PAGE(PageLRU(page), page); 1738 SetPageLRU(page); 1739 1740 nr_pages = hpage_nr_pages(page); |
1745 mem_cgroup_update_lru_size(lruvec, lru, nr_pages); | 1741 update_lru_size(lruvec, lru, nr_pages); |
1746 list_move(&page->lru, &lruvec->lists[lru]); 1747 pgmoved += nr_pages; 1748 1749 if (put_page_testzero(page)) { 1750 __ClearPageLRU(page); 1751 __ClearPageActive(page); 1752 del_page_from_lru_list(page, lruvec, lru); 1753 1754 if (unlikely(PageCompound(page))) { 1755 spin_unlock_irq(&zone->lru_lock); 1756 mem_cgroup_uncharge(page); 1757 (*get_compound_page_dtor(page))(page); 1758 spin_lock_irq(&zone->lru_lock); 1759 } else 1760 list_add(&page->lru, pages_to_free); 1761 } 1762 } | 1742 list_move(&page->lru, &lruvec->lists[lru]); 1743 pgmoved += nr_pages; 1744 1745 if (put_page_testzero(page)) { 1746 __ClearPageLRU(page); 1747 __ClearPageActive(page); 1748 del_page_from_lru_list(page, lruvec, lru); 1749 1750 if (unlikely(PageCompound(page))) { 1751 spin_unlock_irq(&zone->lru_lock); 1752 mem_cgroup_uncharge(page); 1753 (*get_compound_page_dtor(page))(page); 1754 spin_lock_irq(&zone->lru_lock); 1755 } else 1756 list_add(&page->lru, pages_to_free); 1757 } 1758 } |
1763 __mod_zone_page_state(zone, NR_LRU_BASE + lru, pgmoved); | 1759 |
1764 if (!is_active_lru(lru)) 1765 __count_vm_events(PGDEACTIVATE, pgmoved); 1766} 1767 1768static void shrink_active_list(unsigned long nr_to_scan, 1769 struct lruvec *lruvec, 1770 struct scan_control *sc, 1771 enum lru_list lru) --- 17 unchanged lines hidden (view full) --- 1789 isolate_mode |= ISOLATE_UNMAPPED; 1790 if (!sc->may_writepage) 1791 isolate_mode |= ISOLATE_CLEAN; 1792 1793 spin_lock_irq(&zone->lru_lock); 1794 1795 nr_taken = isolate_lru_pages(nr_to_scan, lruvec, &l_hold, 1796 &nr_scanned, sc, isolate_mode, lru); | 1760 if (!is_active_lru(lru)) 1761 __count_vm_events(PGDEACTIVATE, pgmoved); 1762} 1763 1764static void shrink_active_list(unsigned long nr_to_scan, 1765 struct lruvec *lruvec, 1766 struct scan_control *sc, 1767 enum lru_list lru) --- 17 unchanged lines hidden (view full) --- 1785 isolate_mode |= ISOLATE_UNMAPPED; 1786 if (!sc->may_writepage) 1787 isolate_mode |= ISOLATE_CLEAN; 1788 1789 spin_lock_irq(&zone->lru_lock); 1790 1791 nr_taken = isolate_lru_pages(nr_to_scan, lruvec, &l_hold, 1792 &nr_scanned, sc, isolate_mode, lru); |
1797 if (global_reclaim(sc)) 1798 __mod_zone_page_state(zone, NR_PAGES_SCANNED, nr_scanned); | |
1799 | 1793 |
1794 update_lru_size(lruvec, lru, -nr_taken); 1795 __mod_zone_page_state(zone, NR_ISOLATED_ANON + file, nr_taken); |
|
1800 reclaim_stat->recent_scanned[file] += nr_taken; 1801 | 1796 reclaim_stat->recent_scanned[file] += nr_taken; 1797 |
1798 if (global_reclaim(sc)) 1799 __mod_zone_page_state(zone, NR_PAGES_SCANNED, nr_scanned); |
|
1802 __count_zone_vm_events(PGREFILL, zone, nr_scanned); | 1800 __count_zone_vm_events(PGREFILL, zone, nr_scanned); |
1803 __mod_zone_page_state(zone, NR_LRU_BASE + lru, -nr_taken); 1804 __mod_zone_page_state(zone, NR_ISOLATED_ANON + file, nr_taken); | 1801 |
1805 spin_unlock_irq(&zone->lru_lock); 1806 1807 while (!list_empty(&l_hold)) { 1808 cond_resched(); 1809 page = lru_to_page(&l_hold); 1810 list_del(&page->lru); 1811 1812 if (unlikely(!page_evictable(page))) { --- 2042 unchanged lines hidden --- | 1802 spin_unlock_irq(&zone->lru_lock); 1803 1804 while (!list_empty(&l_hold)) { 1805 cond_resched(); 1806 page = lru_to_page(&l_hold); 1807 list_del(&page->lru); 1808 1809 if (unlikely(!page_evictable(page))) { --- 2042 unchanged lines hidden --- |