mm: memcontrol: rewrite charge API
[cascardo/linux.git] / kernel / events / uprobes.c
index 6f3254e..1d0af8a 100644 (file)
@@ -167,6 +167,11 @@ static int __replace_page(struct vm_area_struct *vma, unsigned long addr,
        /* For mmu_notifiers */
        const unsigned long mmun_start = addr;
        const unsigned long mmun_end   = addr + PAGE_SIZE;
+       struct mem_cgroup *memcg;
+
+       err = mem_cgroup_try_charge(kpage, vma->vm_mm, GFP_KERNEL, &memcg);
+       if (err)
+               return err;
 
        /* For try_to_free_swap() and munlock_vma_page() below */
        lock_page(page);
@@ -179,6 +184,8 @@ static int __replace_page(struct vm_area_struct *vma, unsigned long addr,
 
        get_page(kpage);
        page_add_new_anon_rmap(kpage, vma, addr);
+       mem_cgroup_commit_charge(kpage, memcg, false);
+       lru_cache_add_active_or_unevictable(kpage, vma);
 
        if (!PageAnon(page)) {
                dec_mm_counter(mm, MM_FILEPAGES);
@@ -200,6 +207,7 @@ static int __replace_page(struct vm_area_struct *vma, unsigned long addr,
 
        err = 0;
  unlock:
+       mem_cgroup_cancel_charge(kpage, memcg);
        mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end);
        unlock_page(page);
        return err;
@@ -315,18 +323,11 @@ retry:
        if (!new_page)
                goto put_old;
 
-       if (mem_cgroup_charge_anon(new_page, mm, GFP_KERNEL))
-               goto put_new;
-
        __SetPageUptodate(new_page);
        copy_highpage(new_page, old_page);
        copy_to_page(new_page, vaddr, &opcode, UPROBE_SWBP_INSN_SIZE);
 
        ret = __replace_page(vma, vaddr, old_page, new_page);
-       if (ret)
-               mem_cgroup_uncharge_page(new_page);
-
-put_new:
        page_cache_release(new_page);
 put_old:
        put_page(old_page);