aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/memcontrol.h4
-rw-r--r--include/linux/mm.h9
-rw-r--r--mm/filemap.c2
-rw-r--r--mm/memcontrol.c13
-rw-r--r--mm/migrate.c15
-rw-r--r--mm/shmem.c2
6 files changed, 20 insertions, 25 deletions
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index 09b449849369..c45ab3fb6e04 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -300,7 +300,7 @@ void mem_cgroup_cancel_charge(struct page *page, struct mem_cgroup *memcg,
300void mem_cgroup_uncharge(struct page *page); 300void mem_cgroup_uncharge(struct page *page);
301void mem_cgroup_uncharge_list(struct list_head *page_list); 301void mem_cgroup_uncharge_list(struct list_head *page_list);
302 302
303void mem_cgroup_replace_page(struct page *oldpage, struct page *newpage); 303void mem_cgroup_migrate(struct page *oldpage, struct page *newpage);
304 304
305struct lruvec *mem_cgroup_zone_lruvec(struct zone *, struct mem_cgroup *); 305struct lruvec *mem_cgroup_zone_lruvec(struct zone *, struct mem_cgroup *);
306struct lruvec *mem_cgroup_page_lruvec(struct page *, struct zone *); 306struct lruvec *mem_cgroup_page_lruvec(struct page *, struct zone *);
@@ -580,7 +580,7 @@ static inline void mem_cgroup_uncharge_list(struct list_head *page_list)
580{ 580{
581} 581}
582 582
583static inline void mem_cgroup_replace_page(struct page *old, struct page *new) 583static inline void mem_cgroup_migrate(struct page *old, struct page *new)
584{ 584{
585} 585}
586 586
diff --git a/include/linux/mm.h b/include/linux/mm.h
index b97243d6aa49..6b471d1fc8df 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -905,20 +905,11 @@ static inline struct mem_cgroup *page_memcg(struct page *page)
905{ 905{
906 return page->mem_cgroup; 906 return page->mem_cgroup;
907} 907}
908
909static inline void set_page_memcg(struct page *page, struct mem_cgroup *memcg)
910{
911 page->mem_cgroup = memcg;
912}
913#else 908#else
914static inline struct mem_cgroup *page_memcg(struct page *page) 909static inline struct mem_cgroup *page_memcg(struct page *page)
915{ 910{
916 return NULL; 911 return NULL;
917} 912}
918
919static inline void set_page_memcg(struct page *page, struct mem_cgroup *memcg)
920{
921}
922#endif 913#endif
923 914
924/* 915/*
diff --git a/mm/filemap.c b/mm/filemap.c
index ee8140cf935d..d8317caffe85 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -577,7 +577,7 @@ int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask)
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 unlock_page_memcg(memcg); 579 unlock_page_memcg(memcg);
580 mem_cgroup_replace_page(old, new); 580 mem_cgroup_migrate(old, new);
581 radix_tree_preload_end(); 581 radix_tree_preload_end();
582 if (freepage) 582 if (freepage)
583 freepage(old); 583 freepage(old);
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 864e237f32d9..64506b2eef34 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -4457,7 +4457,7 @@ static int mem_cgroup_move_account(struct page *page,
4457 VM_BUG_ON(compound && !PageTransHuge(page)); 4457 VM_BUG_ON(compound && !PageTransHuge(page));
4458 4458
4459 /* 4459 /*
4460 * Prevent mem_cgroup_replace_page() from looking at 4460 * Prevent mem_cgroup_migrate() from looking at
4461 * page->mem_cgroup of its source page while we change it. 4461 * page->mem_cgroup of its source page while we change it.
4462 */ 4462 */
4463 ret = -EBUSY; 4463 ret = -EBUSY;
@@ -5486,16 +5486,17 @@ void mem_cgroup_uncharge_list(struct list_head *page_list)
5486} 5486}
5487 5487
5488/** 5488/**
5489 * mem_cgroup_replace_page - migrate a charge to another page 5489 * mem_cgroup_migrate - charge a page's replacement
5490 * @oldpage: currently charged page 5490 * @oldpage: currently circulating page
5491 * @newpage: page to transfer the charge to 5491 * @newpage: replacement page
5492 * 5492 *
5493 * Migrate the charge from @oldpage to @newpage. 5493 * Charge @newpage as a replacement page for @oldpage. @oldpage will
5494 * be uncharged upon free.
5494 * 5495 *
5495 * Both pages must be locked, @newpage->mapping must be set up. 5496 * Both pages must be locked, @newpage->mapping must be set up.
5496 * Either or both pages might be on the LRU already. 5497 * Either or both pages might be on the LRU already.
5497 */ 5498 */
5498void mem_cgroup_replace_page(struct page *oldpage, struct page *newpage) 5499void mem_cgroup_migrate(struct page *oldpage, struct page *newpage)
5499{ 5500{
5500 struct mem_cgroup *memcg; 5501 struct mem_cgroup *memcg;
5501 unsigned int nr_pages; 5502 unsigned int nr_pages;
diff --git a/mm/migrate.c b/mm/migrate.c
index 432ecd0172cd..848327d4a7ed 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -326,12 +326,13 @@ int migrate_page_move_mapping(struct address_space *mapping,
326 return -EAGAIN; 326 return -EAGAIN;
327 327
328 /* No turning back from here */ 328 /* No turning back from here */
329 set_page_memcg(newpage, page_memcg(page));
330 newpage->index = page->index; 329 newpage->index = page->index;
331 newpage->mapping = page->mapping; 330 newpage->mapping = page->mapping;
332 if (PageSwapBacked(page)) 331 if (PageSwapBacked(page))
333 SetPageSwapBacked(newpage); 332 SetPageSwapBacked(newpage);
334 333
334 mem_cgroup_migrate(page, newpage);
335
335 return MIGRATEPAGE_SUCCESS; 336 return MIGRATEPAGE_SUCCESS;
336 } 337 }
337 338
@@ -373,7 +374,6 @@ int migrate_page_move_mapping(struct address_space *mapping,
373 * Now we know that no one else is looking at the page: 374 * Now we know that no one else is looking at the page:
374 * no turning back from here. 375 * no turning back from here.
375 */ 376 */
376 set_page_memcg(newpage, page_memcg(page));
377 newpage->index = page->index; 377 newpage->index = page->index;
378 newpage->mapping = page->mapping; 378 newpage->mapping = page->mapping;
379 if (PageSwapBacked(page)) 379 if (PageSwapBacked(page))
@@ -428,6 +428,8 @@ int migrate_page_move_mapping(struct address_space *mapping,
428 } 428 }
429 local_irq_enable(); 429 local_irq_enable();
430 430
431 mem_cgroup_migrate(page, newpage);
432
431 return MIGRATEPAGE_SUCCESS; 433 return MIGRATEPAGE_SUCCESS;
432} 434}
433 435
@@ -458,9 +460,9 @@ int migrate_huge_page_move_mapping(struct address_space *mapping,
458 return -EAGAIN; 460 return -EAGAIN;
459 } 461 }
460 462
461 set_page_memcg(newpage, page_memcg(page));
462 newpage->index = page->index; 463 newpage->index = page->index;
463 newpage->mapping = page->mapping; 464 newpage->mapping = page->mapping;
465
464 get_page(newpage); 466 get_page(newpage);
465 467
466 radix_tree_replace_slot(pslot, newpage); 468 radix_tree_replace_slot(pslot, newpage);
@@ -468,6 +470,9 @@ int migrate_huge_page_move_mapping(struct address_space *mapping,
468 page_unfreeze_refs(page, expected_count - 1); 470 page_unfreeze_refs(page, expected_count - 1);
469 471
470 spin_unlock_irq(&mapping->tree_lock); 472 spin_unlock_irq(&mapping->tree_lock);
473
474 mem_cgroup_migrate(page, newpage);
475
471 return MIGRATEPAGE_SUCCESS; 476 return MIGRATEPAGE_SUCCESS;
472} 477}
473 478
@@ -775,7 +780,6 @@ static int move_to_new_page(struct page *newpage, struct page *page,
775 * page is freed; but stats require that PageAnon be left as PageAnon. 780 * page is freed; but stats require that PageAnon be left as PageAnon.
776 */ 781 */
777 if (rc == MIGRATEPAGE_SUCCESS) { 782 if (rc == MIGRATEPAGE_SUCCESS) {
778 set_page_memcg(page, NULL);
779 if (!PageAnon(page)) 783 if (!PageAnon(page))
780 page->mapping = NULL; 784 page->mapping = NULL;
781 } 785 }
@@ -1842,8 +1846,7 @@ fail_putback:
1842 } 1846 }
1843 1847
1844 mlock_migrate_page(new_page, page); 1848 mlock_migrate_page(new_page, page);
1845 set_page_memcg(new_page, page_memcg(page)); 1849 mem_cgroup_migrate(page, new_page);
1846 set_page_memcg(page, NULL);
1847 page_remove_rmap(page, true); 1850 page_remove_rmap(page, true);
1848 set_page_owner_migrate_reason(new_page, MR_NUMA_MISPLACED); 1851 set_page_owner_migrate_reason(new_page, MR_NUMA_MISPLACED);
1849 1852
diff --git a/mm/shmem.c b/mm/shmem.c
index 440e2a7e6c1c..1acfdbc4bd9e 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -1116,7 +1116,7 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp,
1116 */ 1116 */
1117 oldpage = newpage; 1117 oldpage = newpage;
1118 } else { 1118 } else {
1119 mem_cgroup_replace_page(oldpage, newpage); 1119 mem_cgroup_migrate(oldpage, newpage);
1120 lru_cache_add_anon(newpage); 1120 lru_cache_add_anon(newpage);
1121 *pagep = newpage; 1121 *pagep = newpage;
1122 } 1122 }