lkml.org 
[lkml]   [2010]   [Nov]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 39 of 66] memcg huge memory
    Date
    From
    From: Andrea Arcangeli <aarcange@redhat.com>

    Add memcg charge/uncharge to hugepage faults in huge_memory.c.

    Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
    Acked-by: Rik van Riel <riel@redhat.com>
    ---

    diff --git a/mm/huge_memory.c b/mm/huge_memory.c
    --- a/mm/huge_memory.c
    +++ b/mm/huge_memory.c
    @@ -233,6 +233,7 @@ static int __do_huge_pmd_anonymous_page(
    VM_BUG_ON(!PageCompound(page));
    pgtable = pte_alloc_one(mm, haddr);
    if (unlikely(!pgtable)) {
    + mem_cgroup_uncharge_page(page);
    put_page(page);
    return VM_FAULT_OOM;
    }
    @@ -243,6 +244,7 @@ static int __do_huge_pmd_anonymous_page(
    spin_lock(&mm->page_table_lock);
    if (unlikely(!pmd_none(*pmd))) {
    spin_unlock(&mm->page_table_lock);
    + mem_cgroup_uncharge_page(page);
    put_page(page);
    pte_free(mm, pgtable);
    } else {
    @@ -286,6 +288,10 @@ int do_huge_pmd_anonymous_page(struct mm
    page = alloc_hugepage(transparent_hugepage_defrag(vma));
    if (unlikely(!page))
    goto out;
    + if (unlikely(mem_cgroup_newpage_charge(page, mm, GFP_KERNEL))) {
    + put_page(page);
    + goto out;
    + }

    return __do_huge_pmd_anonymous_page(mm, vma, haddr, pmd, page);
    }
    @@ -402,9 +408,15 @@ static int do_huge_pmd_wp_page_fallback(
    for (i = 0; i < HPAGE_PMD_NR; i++) {
    pages[i] = alloc_page_vma(GFP_HIGHUSER_MOVABLE,
    vma, address);
    - if (unlikely(!pages[i])) {
    - while (--i >= 0)
    + if (unlikely(!pages[i] ||
    + mem_cgroup_newpage_charge(pages[i], mm,
    + GFP_KERNEL))) {
    + if (pages[i])
    put_page(pages[i]);
    + while (--i >= 0) {
    + mem_cgroup_uncharge_page(pages[i]);
    + put_page(pages[i]);
    + }
    kfree(pages);
    ret |= VM_FAULT_OOM;
    goto out;
    @@ -455,8 +467,10 @@ out:

    out_free_pages:
    spin_unlock(&mm->page_table_lock);
    - for (i = 0; i < HPAGE_PMD_NR; i++)
    + for (i = 0; i < HPAGE_PMD_NR; i++) {
    + mem_cgroup_uncharge_page(pages[i]);
    put_page(pages[i]);
    + }
    kfree(pages);
    goto out;
    }
    @@ -501,14 +515,22 @@ int do_huge_pmd_wp_page(struct mm_struct
    goto out;
    }

    + if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))) {
    + put_page(new_page);
    + put_page(page);
    + ret |= VM_FAULT_OOM;
    + goto out;
    + }
    +
    copy_user_huge_page(new_page, page, haddr, vma, HPAGE_PMD_NR);
    __SetPageUptodate(new_page);

    spin_lock(&mm->page_table_lock);
    put_page(page);
    - if (unlikely(!pmd_same(*pmd, orig_pmd)))
    + if (unlikely(!pmd_same(*pmd, orig_pmd))) {
    + mem_cgroup_uncharge_page(new_page);
    put_page(new_page);
    - else {
    + } else {
    pmd_t entry;
    VM_BUG_ON(!PageHead(page));
    entry = mk_pmd(new_page, vma->vm_page_prot);

    \
     
     \ /
      Last update: 2010-11-03 16:47    [W:2.713 / U:0.108 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site