diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/filemap.c | 12 | ||||
-rw-r--r-- | mm/memcontrol.c | 34 | ||||
-rw-r--r-- | mm/page-writeback.c | 28 | ||||
-rw-r--r-- | mm/rmap.c | 8 | ||||
-rw-r--r-- | mm/truncate.c | 6 | ||||
-rw-r--r-- | mm/vmscan.c | 8 |
6 files changed, 45 insertions, 51 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 4a0f5fa79dbd..ee8140cf935d 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -101,7 +101,7 @@ | |||
101 | * ->tree_lock (page_remove_rmap->set_page_dirty) | 101 | * ->tree_lock (page_remove_rmap->set_page_dirty) |
102 | * bdi.wb->list_lock (page_remove_rmap->set_page_dirty) | 102 | * bdi.wb->list_lock (page_remove_rmap->set_page_dirty) |
103 | * ->inode->i_lock (page_remove_rmap->set_page_dirty) | 103 | * ->inode->i_lock (page_remove_rmap->set_page_dirty) |
104 | * ->memcg->move_lock (page_remove_rmap->mem_cgroup_begin_page_stat) | 104 | * ->memcg->move_lock (page_remove_rmap->lock_page_memcg) |
105 | * bdi.wb->list_lock (zap_pte_range->set_page_dirty) | 105 | * bdi.wb->list_lock (zap_pte_range->set_page_dirty) |
106 | * ->inode->i_lock (zap_pte_range->set_page_dirty) | 106 | * ->inode->i_lock (zap_pte_range->set_page_dirty) |
107 | * ->private_lock (zap_pte_range->__set_page_dirty_buffers) | 107 | * ->private_lock (zap_pte_range->__set_page_dirty_buffers) |
@@ -177,7 +177,7 @@ static void page_cache_tree_delete(struct address_space *mapping, | |||
177 | * Delete a page from the page cache and free it. Caller has to make | 177 | * Delete a page from the page cache and free it. Caller has to make |
178 | * sure the page is locked and that nobody else uses it - or that usage | 178 | * sure the page is locked and that nobody else uses it - or that usage |
179 | * is safe. The caller must hold the mapping's tree_lock and | 179 | * is safe. The caller must hold the mapping's tree_lock and |
180 | * mem_cgroup_begin_page_stat(). | 180 | * lock_page_memcg(). |
181 | */ | 181 | */ |
182 | void __delete_from_page_cache(struct page *page, void *shadow, | 182 | void __delete_from_page_cache(struct page *page, void *shadow, |
183 | struct mem_cgroup *memcg) | 183 | struct mem_cgroup *memcg) |
@@ -263,11 +263,11 @@ void delete_from_page_cache(struct page *page) | |||
263 | 263 | ||
264 | freepage = mapping->a_ops->freepage; | 264 | freepage = mapping->a_ops->freepage; |
265 | 265 | ||
266 | memcg = mem_cgroup_begin_page_stat(page); | 266 | memcg = lock_page_memcg(page); |
267 | spin_lock_irqsave(&mapping->tree_lock, flags); | 267 | spin_lock_irqsave(&mapping->tree_lock, flags); |
268 | __delete_from_page_cache(page, NULL, memcg); | 268 | __delete_from_page_cache(page, NULL, memcg); |
269 | spin_unlock_irqrestore(&mapping->tree_lock, flags); | 269 | spin_unlock_irqrestore(&mapping->tree_lock, flags); |
270 | mem_cgroup_end_page_stat(memcg); | 270 | unlock_page_memcg(memcg); |
271 | 271 | ||
272 | if (freepage) | 272 | if (freepage) |
273 | freepage(page); | 273 | freepage(page); |
@@ -561,7 +561,7 @@ int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask) | |||
561 | new->mapping = mapping; | 561 | new->mapping = mapping; |
562 | new->index = offset; | 562 | new->index = offset; |
563 | 563 | ||
564 | memcg = mem_cgroup_begin_page_stat(old); | 564 | memcg = lock_page_memcg(old); |
565 | spin_lock_irqsave(&mapping->tree_lock, flags); | 565 | spin_lock_irqsave(&mapping->tree_lock, flags); |
566 | __delete_from_page_cache(old, NULL, memcg); | 566 | __delete_from_page_cache(old, NULL, memcg); |
567 | error = radix_tree_insert(&mapping->page_tree, offset, new); | 567 | error = radix_tree_insert(&mapping->page_tree, offset, new); |
@@ -576,7 +576,7 @@ int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask) | |||
576 | if (PageSwapBacked(new)) | 576 | if (PageSwapBacked(new)) |
577 | __inc_zone_page_state(new, NR_SHMEM); | 577 | __inc_zone_page_state(new, NR_SHMEM); |
578 | spin_unlock_irqrestore(&mapping->tree_lock, flags); | 578 | spin_unlock_irqrestore(&mapping->tree_lock, flags); |
579 | mem_cgroup_end_page_stat(memcg); | 579 | unlock_page_memcg(memcg); |
580 | mem_cgroup_replace_page(old, new); | 580 | mem_cgroup_replace_page(old, new); |
581 | radix_tree_preload_end(); | 581 | radix_tree_preload_end(); |
582 | if (freepage) | 582 | if (freepage) |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index d06cae2de783..953f0f984392 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -1709,19 +1709,13 @@ cleanup: | |||
1709 | } | 1709 | } |
1710 | 1710 | ||
1711 | /** | 1711 | /** |
1712 | * mem_cgroup_begin_page_stat - begin a page state statistics transaction | 1712 | * lock_page_memcg - lock a page->mem_cgroup binding |
1713 | * @page: page that is going to change accounted state | 1713 | * @page: the page |
1714 | * | ||
1715 | * This function must mark the beginning of an accounted page state | ||
1716 | * change to prevent double accounting when the page is concurrently | ||
1717 | * being moved to another memcg: | ||
1718 | * | 1714 | * |
1719 | * memcg = mem_cgroup_begin_page_stat(page); | 1715 | * This function protects unlocked LRU pages from being moved to |
1720 | * if (TestClearPageState(page)) | 1716 | * another cgroup and stabilizes their page->mem_cgroup binding. |
1721 | * mem_cgroup_update_page_stat(memcg, state, -1); | ||
1722 | * mem_cgroup_end_page_stat(memcg); | ||
1723 | */ | 1717 | */ |
1724 | struct mem_cgroup *mem_cgroup_begin_page_stat(struct page *page) | 1718 | struct mem_cgroup *lock_page_memcg(struct page *page) |
1725 | { | 1719 | { |
1726 | struct mem_cgroup *memcg; | 1720 | struct mem_cgroup *memcg; |
1727 | unsigned long flags; | 1721 | unsigned long flags; |
@@ -1759,20 +1753,20 @@ again: | |||
1759 | /* | 1753 | /* |
1760 | * When charge migration first begins, we can have locked and | 1754 | * When charge migration first begins, we can have locked and |
1761 | * unlocked page stat updates happening concurrently. Track | 1755 | * unlocked page stat updates happening concurrently. Track |
1762 | * the task who has the lock for mem_cgroup_end_page_stat(). | 1756 | * the task who has the lock for unlock_page_memcg(). |
1763 | */ | 1757 | */ |
1764 | memcg->move_lock_task = current; | 1758 | memcg->move_lock_task = current; |
1765 | memcg->move_lock_flags = flags; | 1759 | memcg->move_lock_flags = flags; |
1766 | 1760 | ||
1767 | return memcg; | 1761 | return memcg; |
1768 | } | 1762 | } |
1769 | EXPORT_SYMBOL(mem_cgroup_begin_page_stat); | 1763 | EXPORT_SYMBOL(lock_page_memcg); |
1770 | 1764 | ||
1771 | /** | 1765 | /** |
1772 | * mem_cgroup_end_page_stat - finish a page state statistics transaction | 1766 | * unlock_page_memcg - unlock a page->mem_cgroup binding |
1773 | * @memcg: the memcg that was accounted against | 1767 | * @memcg: the memcg returned by lock_page_memcg() |
1774 | */ | 1768 | */ |
1775 | void mem_cgroup_end_page_stat(struct mem_cgroup *memcg) | 1769 | void unlock_page_memcg(struct mem_cgroup *memcg) |
1776 | { | 1770 | { |
1777 | if (memcg && memcg->move_lock_task == current) { | 1771 | if (memcg && memcg->move_lock_task == current) { |
1778 | unsigned long flags = memcg->move_lock_flags; | 1772 | unsigned long flags = memcg->move_lock_flags; |
@@ -1785,7 +1779,7 @@ void mem_cgroup_end_page_stat(struct mem_cgroup *memcg) | |||
1785 | 1779 | ||
1786 | rcu_read_unlock(); | 1780 | rcu_read_unlock(); |
1787 | } | 1781 | } |
1788 | EXPORT_SYMBOL(mem_cgroup_end_page_stat); | 1782 | EXPORT_SYMBOL(unlock_page_memcg); |
1789 | 1783 | ||
1790 | /* | 1784 | /* |
1791 | * size of first charge trial. "32" comes from vmscan.c's magic value. | 1785 | * size of first charge trial. "32" comes from vmscan.c's magic value. |
@@ -4923,9 +4917,9 @@ static void mem_cgroup_move_charge(struct mm_struct *mm) | |||
4923 | 4917 | ||
4924 | lru_add_drain_all(); | 4918 | lru_add_drain_all(); |
4925 | /* | 4919 | /* |
4926 | * Signal mem_cgroup_begin_page_stat() to take the memcg's | 4920 | * Signal lock_page_memcg() to take the memcg's move_lock |
4927 | * move_lock while we're moving its pages to another memcg. | 4921 | * while we're moving its pages to another memcg. Then wait |
4928 | * Then wait for already started RCU-only updates to finish. | 4922 | * for already started RCU-only updates to finish. |
4929 | */ | 4923 | */ |
4930 | atomic_inc(&mc.from->moving_account); | 4924 | atomic_inc(&mc.from->moving_account); |
4931 | synchronize_rcu(); | 4925 | synchronize_rcu(); |
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index d782cbab735a..2b5ea1271e32 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c | |||
@@ -2410,7 +2410,7 @@ int __set_page_dirty_no_writeback(struct page *page) | |||
2410 | /* | 2410 | /* |
2411 | * Helper function for set_page_dirty family. | 2411 | * Helper function for set_page_dirty family. |
2412 | * | 2412 | * |
2413 | * Caller must hold mem_cgroup_begin_page_stat(). | 2413 | * Caller must hold lock_page_memcg(). |
2414 | * | 2414 | * |
2415 | * NOTE: This relies on being atomic wrt interrupts. | 2415 | * NOTE: This relies on being atomic wrt interrupts. |
2416 | */ | 2416 | */ |
@@ -2442,7 +2442,7 @@ EXPORT_SYMBOL(account_page_dirtied); | |||
2442 | /* | 2442 | /* |
2443 | * Helper function for deaccounting dirty page without writeback. | 2443 | * Helper function for deaccounting dirty page without writeback. |
2444 | * | 2444 | * |
2445 | * Caller must hold mem_cgroup_begin_page_stat(). | 2445 | * Caller must hold lock_page_memcg(). |
2446 | */ | 2446 | */ |
2447 | void account_page_cleaned(struct page *page, struct address_space *mapping, | 2447 | void account_page_cleaned(struct page *page, struct address_space *mapping, |
2448 | struct mem_cgroup *memcg, struct bdi_writeback *wb) | 2448 | struct mem_cgroup *memcg, struct bdi_writeback *wb) |
@@ -2471,13 +2471,13 @@ int __set_page_dirty_nobuffers(struct page *page) | |||
2471 | { | 2471 | { |
2472 | struct mem_cgroup *memcg; | 2472 | struct mem_cgroup *memcg; |
2473 | 2473 | ||
2474 | memcg = mem_cgroup_begin_page_stat(page); | 2474 | memcg = lock_page_memcg(page); |
2475 | if (!TestSetPageDirty(page)) { | 2475 | if (!TestSetPageDirty(page)) { |
2476 | struct address_space *mapping = page_mapping(page); | 2476 | struct address_space *mapping = page_mapping(page); |
2477 | unsigned long flags; | 2477 | unsigned long flags; |
2478 | 2478 | ||
2479 | if (!mapping) { | 2479 | if (!mapping) { |
2480 | mem_cgroup_end_page_stat(memcg); | 2480 | unlock_page_memcg(memcg); |
2481 | return 1; | 2481 | return 1; |
2482 | } | 2482 | } |
2483 | 2483 | ||
@@ -2488,7 +2488,7 @@ int __set_page_dirty_nobuffers(struct page *page) | |||
2488 | radix_tree_tag_set(&mapping->page_tree, page_index(page), | 2488 | radix_tree_tag_set(&mapping->page_tree, page_index(page), |
2489 | PAGECACHE_TAG_DIRTY); | 2489 | PAGECACHE_TAG_DIRTY); |
2490 | spin_unlock_irqrestore(&mapping->tree_lock, flags); | 2490 | spin_unlock_irqrestore(&mapping->tree_lock, flags); |
2491 | mem_cgroup_end_page_stat(memcg); | 2491 | unlock_page_memcg(memcg); |
2492 | 2492 | ||
2493 | if (mapping->host) { | 2493 | if (mapping->host) { |
2494 | /* !PageAnon && !swapper_space */ | 2494 | /* !PageAnon && !swapper_space */ |
@@ -2496,7 +2496,7 @@ int __set_page_dirty_nobuffers(struct page *page) | |||
2496 | } | 2496 | } |
2497 | return 1; | 2497 | return 1; |
2498 | } | 2498 | } |
2499 | mem_cgroup_end_page_stat(memcg); | 2499 | unlock_page_memcg(memcg); |
2500 | return 0; | 2500 | return 0; |
2501 | } | 2501 | } |
2502 | EXPORT_SYMBOL(__set_page_dirty_nobuffers); | 2502 | EXPORT_SYMBOL(__set_page_dirty_nobuffers); |
@@ -2629,14 +2629,14 @@ void cancel_dirty_page(struct page *page) | |||
2629 | struct mem_cgroup *memcg; | 2629 | struct mem_cgroup *memcg; |
2630 | bool locked; | 2630 | bool locked; |
2631 | 2631 | ||
2632 | memcg = mem_cgroup_begin_page_stat(page); | 2632 | memcg = lock_page_memcg(page); |
2633 | wb = unlocked_inode_to_wb_begin(inode, &locked); | 2633 | wb = unlocked_inode_to_wb_begin(inode, &locked); |
2634 | 2634 | ||
2635 | if (TestClearPageDirty(page)) | 2635 | if (TestClearPageDirty(page)) |
2636 | account_page_cleaned(page, mapping, memcg, wb); | 2636 | account_page_cleaned(page, mapping, memcg, wb); |
2637 | 2637 | ||
2638 | unlocked_inode_to_wb_end(inode, locked); | 2638 | unlocked_inode_to_wb_end(inode, locked); |
2639 | mem_cgroup_end_page_stat(memcg); | 2639 | unlock_page_memcg(memcg); |
2640 | } else { | 2640 | } else { |
2641 | ClearPageDirty(page); | 2641 | ClearPageDirty(page); |
2642 | } | 2642 | } |
@@ -2705,7 +2705,7 @@ int clear_page_dirty_for_io(struct page *page) | |||
2705 | * always locked coming in here, so we get the desired | 2705 | * always locked coming in here, so we get the desired |
2706 | * exclusion. | 2706 | * exclusion. |
2707 | */ | 2707 | */ |
2708 | memcg = mem_cgroup_begin_page_stat(page); | 2708 | memcg = lock_page_memcg(page); |
2709 | wb = unlocked_inode_to_wb_begin(inode, &locked); | 2709 | wb = unlocked_inode_to_wb_begin(inode, &locked); |
2710 | if (TestClearPageDirty(page)) { | 2710 | if (TestClearPageDirty(page)) { |
2711 | mem_cgroup_dec_page_stat(memcg, MEM_CGROUP_STAT_DIRTY); | 2711 | mem_cgroup_dec_page_stat(memcg, MEM_CGROUP_STAT_DIRTY); |
@@ -2714,7 +2714,7 @@ int clear_page_dirty_for_io(struct page *page) | |||
2714 | ret = 1; | 2714 | ret = 1; |
2715 | } | 2715 | } |
2716 | unlocked_inode_to_wb_end(inode, locked); | 2716 | unlocked_inode_to_wb_end(inode, locked); |
2717 | mem_cgroup_end_page_stat(memcg); | 2717 | unlock_page_memcg(memcg); |
2718 | return ret; | 2718 | return ret; |
2719 | } | 2719 | } |
2720 | return TestClearPageDirty(page); | 2720 | return TestClearPageDirty(page); |
@@ -2727,7 +2727,7 @@ int test_clear_page_writeback(struct page *page) | |||
2727 | struct mem_cgroup *memcg; | 2727 | struct mem_cgroup *memcg; |
2728 | int ret; | 2728 | int ret; |
2729 | 2729 | ||
2730 | memcg = mem_cgroup_begin_page_stat(page); | 2730 | memcg = lock_page_memcg(page); |
2731 | if (mapping) { | 2731 | if (mapping) { |
2732 | struct inode *inode = mapping->host; | 2732 | struct inode *inode = mapping->host; |
2733 | struct backing_dev_info *bdi = inode_to_bdi(inode); | 2733 | struct backing_dev_info *bdi = inode_to_bdi(inode); |
@@ -2755,7 +2755,7 @@ int test_clear_page_writeback(struct page *page) | |||
2755 | dec_zone_page_state(page, NR_WRITEBACK); | 2755 | dec_zone_page_state(page, NR_WRITEBACK); |
2756 | inc_zone_page_state(page, NR_WRITTEN); | 2756 | inc_zone_page_state(page, NR_WRITTEN); |
2757 | } | 2757 | } |
2758 | mem_cgroup_end_page_stat(memcg); | 2758 | unlock_page_memcg(memcg); |
2759 | return ret; | 2759 | return ret; |
2760 | } | 2760 | } |
2761 | 2761 | ||
@@ -2765,7 +2765,7 @@ int __test_set_page_writeback(struct page *page, bool keep_write) | |||
2765 | struct mem_cgroup *memcg; | 2765 | struct mem_cgroup *memcg; |
2766 | int ret; | 2766 | int ret; |
2767 | 2767 | ||
2768 | memcg = mem_cgroup_begin_page_stat(page); | 2768 | memcg = lock_page_memcg(page); |
2769 | if (mapping) { | 2769 | if (mapping) { |
2770 | struct inode *inode = mapping->host; | 2770 | struct inode *inode = mapping->host; |
2771 | struct backing_dev_info *bdi = inode_to_bdi(inode); | 2771 | struct backing_dev_info *bdi = inode_to_bdi(inode); |
@@ -2796,7 +2796,7 @@ int __test_set_page_writeback(struct page *page, bool keep_write) | |||
2796 | mem_cgroup_inc_page_stat(memcg, MEM_CGROUP_STAT_WRITEBACK); | 2796 | mem_cgroup_inc_page_stat(memcg, MEM_CGROUP_STAT_WRITEBACK); |
2797 | inc_zone_page_state(page, NR_WRITEBACK); | 2797 | inc_zone_page_state(page, NR_WRITEBACK); |
2798 | } | 2798 | } |
2799 | mem_cgroup_end_page_stat(memcg); | 2799 | unlock_page_memcg(memcg); |
2800 | return ret; | 2800 | return ret; |
2801 | 2801 | ||
2802 | } | 2802 | } |
@@ -1289,19 +1289,19 @@ void page_add_file_rmap(struct page *page) | |||
1289 | { | 1289 | { |
1290 | struct mem_cgroup *memcg; | 1290 | struct mem_cgroup *memcg; |
1291 | 1291 | ||
1292 | memcg = mem_cgroup_begin_page_stat(page); | 1292 | memcg = lock_page_memcg(page); |
1293 | if (atomic_inc_and_test(&page->_mapcount)) { | 1293 | if (atomic_inc_and_test(&page->_mapcount)) { |
1294 | __inc_zone_page_state(page, NR_FILE_MAPPED); | 1294 | __inc_zone_page_state(page, NR_FILE_MAPPED); |
1295 | mem_cgroup_inc_page_stat(memcg, MEM_CGROUP_STAT_FILE_MAPPED); | 1295 | mem_cgroup_inc_page_stat(memcg, MEM_CGROUP_STAT_FILE_MAPPED); |
1296 | } | 1296 | } |
1297 | mem_cgroup_end_page_stat(memcg); | 1297 | unlock_page_memcg(memcg); |
1298 | } | 1298 | } |
1299 | 1299 | ||
1300 | static void page_remove_file_rmap(struct page *page) | 1300 | static void page_remove_file_rmap(struct page *page) |
1301 | { | 1301 | { |
1302 | struct mem_cgroup *memcg; | 1302 | struct mem_cgroup *memcg; |
1303 | 1303 | ||
1304 | memcg = mem_cgroup_begin_page_stat(page); | 1304 | memcg = lock_page_memcg(page); |
1305 | 1305 | ||
1306 | /* Hugepages are not counted in NR_FILE_MAPPED for now. */ | 1306 | /* Hugepages are not counted in NR_FILE_MAPPED for now. */ |
1307 | if (unlikely(PageHuge(page))) { | 1307 | if (unlikely(PageHuge(page))) { |
@@ -1325,7 +1325,7 @@ static void page_remove_file_rmap(struct page *page) | |||
1325 | if (unlikely(PageMlocked(page))) | 1325 | if (unlikely(PageMlocked(page))) |
1326 | clear_page_mlock(page); | 1326 | clear_page_mlock(page); |
1327 | out: | 1327 | out: |
1328 | mem_cgroup_end_page_stat(memcg); | 1328 | unlock_page_memcg(memcg); |
1329 | } | 1329 | } |
1330 | 1330 | ||
1331 | static void page_remove_anon_compound_rmap(struct page *page) | 1331 | static void page_remove_anon_compound_rmap(struct page *page) |
diff --git a/mm/truncate.c b/mm/truncate.c index e3ee0e27cd17..51a24f6a555d 100644 --- a/mm/truncate.c +++ b/mm/truncate.c | |||
@@ -528,7 +528,7 @@ invalidate_complete_page2(struct address_space *mapping, struct page *page) | |||
528 | if (page_has_private(page) && !try_to_release_page(page, GFP_KERNEL)) | 528 | if (page_has_private(page) && !try_to_release_page(page, GFP_KERNEL)) |
529 | return 0; | 529 | return 0; |
530 | 530 | ||
531 | memcg = mem_cgroup_begin_page_stat(page); | 531 | memcg = lock_page_memcg(page); |
532 | spin_lock_irqsave(&mapping->tree_lock, flags); | 532 | spin_lock_irqsave(&mapping->tree_lock, flags); |
533 | if (PageDirty(page)) | 533 | if (PageDirty(page)) |
534 | goto failed; | 534 | goto failed; |
@@ -536,7 +536,7 @@ invalidate_complete_page2(struct address_space *mapping, struct page *page) | |||
536 | BUG_ON(page_has_private(page)); | 536 | BUG_ON(page_has_private(page)); |
537 | __delete_from_page_cache(page, NULL, memcg); | 537 | __delete_from_page_cache(page, NULL, memcg); |
538 | spin_unlock_irqrestore(&mapping->tree_lock, flags); | 538 | spin_unlock_irqrestore(&mapping->tree_lock, flags); |
539 | mem_cgroup_end_page_stat(memcg); | 539 | unlock_page_memcg(memcg); |
540 | 540 | ||
541 | if (mapping->a_ops->freepage) | 541 | if (mapping->a_ops->freepage) |
542 | mapping->a_ops->freepage(page); | 542 | mapping->a_ops->freepage(page); |
@@ -545,7 +545,7 @@ invalidate_complete_page2(struct address_space *mapping, struct page *page) | |||
545 | return 1; | 545 | return 1; |
546 | failed: | 546 | failed: |
547 | spin_unlock_irqrestore(&mapping->tree_lock, flags); | 547 | spin_unlock_irqrestore(&mapping->tree_lock, flags); |
548 | mem_cgroup_end_page_stat(memcg); | 548 | unlock_page_memcg(memcg); |
549 | return 0; | 549 | return 0; |
550 | } | 550 | } |
551 | 551 | ||
diff --git a/mm/vmscan.c b/mm/vmscan.c index 039f08d369a5..08547a7136d3 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -608,7 +608,7 @@ static int __remove_mapping(struct address_space *mapping, struct page *page, | |||
608 | BUG_ON(!PageLocked(page)); | 608 | BUG_ON(!PageLocked(page)); |
609 | BUG_ON(mapping != page_mapping(page)); | 609 | BUG_ON(mapping != page_mapping(page)); |
610 | 610 | ||
611 | memcg = mem_cgroup_begin_page_stat(page); | 611 | memcg = lock_page_memcg(page); |
612 | spin_lock_irqsave(&mapping->tree_lock, flags); | 612 | spin_lock_irqsave(&mapping->tree_lock, flags); |
613 | /* | 613 | /* |
614 | * The non racy check for a busy page. | 614 | * The non racy check for a busy page. |
@@ -648,7 +648,7 @@ static int __remove_mapping(struct address_space *mapping, struct page *page, | |||
648 | mem_cgroup_swapout(page, swap); | 648 | mem_cgroup_swapout(page, swap); |
649 | __delete_from_swap_cache(page); | 649 | __delete_from_swap_cache(page); |
650 | spin_unlock_irqrestore(&mapping->tree_lock, flags); | 650 | spin_unlock_irqrestore(&mapping->tree_lock, flags); |
651 | mem_cgroup_end_page_stat(memcg); | 651 | unlock_page_memcg(memcg); |
652 | swapcache_free(swap); | 652 | swapcache_free(swap); |
653 | } else { | 653 | } else { |
654 | void (*freepage)(struct page *); | 654 | void (*freepage)(struct page *); |
@@ -676,7 +676,7 @@ static int __remove_mapping(struct address_space *mapping, struct page *page, | |||
676 | shadow = workingset_eviction(mapping, page); | 676 | shadow = workingset_eviction(mapping, page); |
677 | __delete_from_page_cache(page, shadow, memcg); | 677 | __delete_from_page_cache(page, shadow, memcg); |
678 | spin_unlock_irqrestore(&mapping->tree_lock, flags); | 678 | spin_unlock_irqrestore(&mapping->tree_lock, flags); |
679 | mem_cgroup_end_page_stat(memcg); | 679 | unlock_page_memcg(memcg); |
680 | 680 | ||
681 | if (freepage != NULL) | 681 | if (freepage != NULL) |
682 | freepage(page); | 682 | freepage(page); |
@@ -686,7 +686,7 @@ static int __remove_mapping(struct address_space *mapping, struct page *page, | |||
686 | 686 | ||
687 | cannot_free: | 687 | cannot_free: |
688 | spin_unlock_irqrestore(&mapping->tree_lock, flags); | 688 | spin_unlock_irqrestore(&mapping->tree_lock, flags); |
689 | mem_cgroup_end_page_stat(memcg); | 689 | unlock_page_memcg(memcg); |
690 | return 0; | 690 | return 0; |
691 | } | 691 | } |
692 | 692 | ||