lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 391/757] mm/memcg: fix device private memcg accounting
    Date
    From: Ralph Campbell <rcampbell@nvidia.com>

    [ Upstream commit 9a137153fc8798a89d8fce895cd0a06ea5b8e37c ]

    The code in mc_handle_swap_pte() checks for non_swap_entry() and returns
    NULL before checking is_device_private_entry() so device private pages are
    never handled. Fix this by checking for non_swap_entry() after handling
    device private swap PTEs.

    I assume the memory cgroup accounting would be off somehow when moving
    a process to another memory cgroup. Currently, the device private page
    is charged like a normal anonymous page when allocated and is uncharged
    when the page is freed so I think that path is OK.

    Signed-off-by: Ralph Campbell <rcampbell@nvidia.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Acked-by: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
    Cc: Jerome Glisse <jglisse@redhat.com>
    Cc: Balbir Singh <bsingharora@gmail.com>
    Cc: Ira Weiny <ira.weiny@intel.com>
    Link: https://lkml.kernel.org/r/20201009215952.2726-1-rcampbell@nvidia.com
    xFixes: c733a82874a7 ("mm/memcontrol: support MEMORY_DEVICE_PRIVATE")
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    mm/memcontrol.c | 5 ++++-
    1 file changed, 4 insertions(+), 1 deletion(-)

    diff --git a/mm/memcontrol.c b/mm/memcontrol.c
    index b9688a4b1d550..9eefdb9cc2303 100644
    --- a/mm/memcontrol.c
    +++ b/mm/memcontrol.c
    @@ -5511,7 +5511,7 @@ static struct page *mc_handle_swap_pte(struct vm_area_struct *vma,
    struct page *page = NULL;
    swp_entry_t ent = pte_to_swp_entry(ptent);

    - if (!(mc.flags & MOVE_ANON) || non_swap_entry(ent))
    + if (!(mc.flags & MOVE_ANON))
    return NULL;

    /*
    @@ -5530,6 +5530,9 @@ static struct page *mc_handle_swap_pte(struct vm_area_struct *vma,
    return page;
    }

    + if (non_swap_entry(ent))
    + return NULL;
    +
    /*
    * Because lookup_swap_cache() updates some statistics counter,
    * we call find_get_page() with swapper_space directly.
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 16:48    [W:4.166 / U:0.168 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site