If shmem_insert_page() is called to insert a page that was preserved
using PKRAM on the current boot (i.e. preserved page is restored without
an intervening kexec boot), the page will still be charged to a memory
cgroup because it is never freed. Don't try to charge it again.

Signed-off-by: Anthony Yznaga <[email protected]>
---
 mm/shmem.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/mm/shmem.c b/mm/shmem.c
index 13475073fb52..1f3b43b8fa34 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -693,6 +693,7 @@ int shmem_insert_page(struct mm_struct *mm, struct inode 
*inode, pgoff_t index,
        struct mem_cgroup *memcg;
        pgoff_t hindex = index;
        bool on_lru = PageLRU(page);
+       bool has_memcg = page->mem_cgroup ? true : false;
 
        if (index > (MAX_LFS_FILESIZE >> PAGE_SHIFT))
                return -EFBIG;
@@ -738,20 +739,24 @@ int shmem_insert_page(struct mm_struct *mm, struct inode 
*inode, pgoff_t index,
 
        __SetPageReferenced(page);
 
-       err = mem_cgroup_try_charge_delay(page, mm, gfp, &memcg,
-                                       PageTransHuge(page));
-       if (err)
-               goto out_unlock;
+       if (!has_memcg) {
+               err = mem_cgroup_try_charge_delay(page, mm, gfp, &memcg,
+                                               PageTransHuge(page));
+               if (err)
+                       goto out_unlock;
+       }
 
        err = shmem_add_to_page_cache(page, mapping, hindex,
                                        NULL, gfp & GFP_RECLAIM_MASK);
        if (err) {
-               mem_cgroup_cancel_charge(page, memcg,
-                       PageTransHuge(page));
+               if (!has_memcg)
+                       mem_cgroup_cancel_charge(page, memcg,
+                                               PageTransHuge(page));
                goto out_unlock;
        }
-       mem_cgroup_commit_charge(page, memcg, on_lru,
-                       PageTransHuge(page));
+       if (!has_memcg)
+               mem_cgroup_commit_charge(page, memcg, on_lru,
+                                       PageTransHuge(page));
 
        if (!on_lru)
                lru_cache_add_anon(page);
-- 
2.13.3

Reply via email to