diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/ksm.c | 11 | ||||
-rw-r--r-- | mm/memcontrol.c | 17 | ||||
-rw-r--r-- | mm/migrate.c | 2 | ||||
-rw-r--r-- | mm/swap_state.c | 10 |
4 files changed, 40 insertions, 0 deletions
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/kthread.h> | 28 | #include <linux/kthread.h> |
29 | #include <linux/wait.h> | 29 | #include <linux/wait.h> |
30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
31 | #include <linux/memcontrol.h> | ||
31 | #include <linux/rbtree.h> | 32 | #include <linux/rbtree.h> |
32 | #include <linux/memory.h> | 33 | #include <linux/memory.h> |
33 | #include <linux/mmu_notifier.h> | 34 | #include <linux/mmu_notifier.h> |
@@ -1571,6 +1572,16 @@ struct page *ksm_does_need_to_copy(struct page *page, | |||
1571 | 1572 | ||
1572 | new_page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, address); | 1573 | new_page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, address); |
1573 | if (new_page) { | 1574 | if (new_page) { |
1575 | /* | ||
1576 | * The memcg-specific accounting when moving | ||
1577 | * pages around the LRU lists relies on the | ||
1578 | * page's owner (memcg) to be valid. Usually, | ||
1579 | * pages are assigned to a new owner before | ||
1580 | * being put on the LRU list, but since this | ||
1581 | * is not the case here, the stale owner from | ||
1582 | * a previous allocation cycle must be reset. | ||
1583 | */ | ||
1584 | mem_cgroup_reset_owner(new_page); | ||
1574 | copy_user_highpage(new_page, page, address, vma); | 1585 | copy_user_highpage(new_page, page, address, vma); |
1575 | 1586 | ||
1576 | SetPageDirty(new_page); | 1587 | SetPageDirty(new_page); |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index d58bb5fa4403..c74102d6eb5a 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -3050,6 +3050,23 @@ void mem_cgroup_uncharge_end(void) | |||
3050 | batch->memcg = NULL; | 3050 | batch->memcg = NULL; |
3051 | } | 3051 | } |
3052 | 3052 | ||
3053 | /* | ||
3054 | * A function for resetting pc->mem_cgroup for newly allocated pages. | ||
3055 | * This function should be called if the newpage will be added to LRU | ||
3056 | * before start accounting. | ||
3057 | */ | ||
3058 | void mem_cgroup_reset_owner(struct page *newpage) | ||
3059 | { | ||
3060 | struct page_cgroup *pc; | ||
3061 | |||
3062 | if (mem_cgroup_disabled()) | ||
3063 | return; | ||
3064 | |||
3065 | pc = lookup_page_cgroup(newpage); | ||
3066 | VM_BUG_ON(PageCgroupUsed(pc)); | ||
3067 | pc->mem_cgroup = root_mem_cgroup; | ||
3068 | } | ||
3069 | |||
3053 | #ifdef CONFIG_SWAP | 3070 | #ifdef CONFIG_SWAP |
3054 | /* | 3071 | /* |
3055 | * called after __delete_from_swap_cache() and drop "page" account. | 3072 | * called after __delete_from_swap_cache() and drop "page" account. |
diff --git a/mm/migrate.c b/mm/migrate.c index 89ea0854332e..fc391985899f 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -777,6 +777,8 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private, | |||
777 | if (!newpage) | 777 | if (!newpage) |
778 | return -ENOMEM; | 778 | return -ENOMEM; |
779 | 779 | ||
780 | mem_cgroup_reset_owner(newpage); | ||
781 | |||
780 | if (page_count(page) == 1) { | 782 | if (page_count(page) == 1) { |
781 | /* page was freed from under us. So we are done. */ | 783 | /* page was freed from under us. So we are done. */ |
782 | goto out; | 784 | goto out; |
diff --git a/mm/swap_state.c b/mm/swap_state.c index ea6b32d61873..470038a91873 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c | |||
@@ -300,6 +300,16 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, | |||
300 | new_page = alloc_page_vma(gfp_mask, vma, addr); | 300 | new_page = alloc_page_vma(gfp_mask, vma, addr); |
301 | if (!new_page) | 301 | if (!new_page) |
302 | break; /* Out of memory */ | 302 | break; /* Out of memory */ |
303 | /* | ||
304 | * The memcg-specific accounting when moving | ||
305 | * pages around the LRU lists relies on the | ||
306 | * page's owner (memcg) to be valid. Usually, | ||
307 | * pages are assigned to a new owner before | ||
308 | * being put on the LRU list, but since this | ||
309 | * is not the case here, the stale owner from | ||
310 | * a previous allocation cycle must be reset. | ||
311 | */ | ||
312 | mem_cgroup_reset_owner(new_page); | ||
303 | } | 313 | } |
304 | 314 | ||
305 | /* | 315 | /* |