]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
kernel: uprobes: switch to new memcg charge protocol
authorJohannes Weiner <hannes@cmpxchg.org>
Thu, 26 Jun 2014 00:42:38 +0000 (10:42 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Thu, 26 Jun 2014 00:42:38 +0000 (10:42 +1000)
Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
kernel/events/uprobes.c

index d17f27c69bfcc77047fceb4cccd1237dbb57beb4..46b7c31537eeecb3cc46c060a2140e124bb47485 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,7 @@ 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)) {
@@ -201,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;
@@ -316,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);