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 | /* |
