lkml.org 
[lkml]   [2015]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v3 11/51] memcg: implement mem_cgroup_css_from_page()
    From b8077b30ce147052a9e55632d80a3c22241a64be Mon Sep 17 00:00:00 2001
    From: Tejun Heo <tj@kernel.org>
    Date: Wed, 27 May 2015 13:54:22 -0400

    Implement mem_cgroup_css_from_page() which returns the
    cgroup_subsys_state of the memcg associated with a given page. This
    will be used by cgroup writeback support.

    This function assumes that page->mem_cgroup association doesn't change
    until the page is released, which is true on the default hierarchy as
    long as replace_page_cache_page() is not used. As the only user of
    replace_page_cache_page() is FUSE which won't support cgroup writeback
    for the time being, this works for now, and replace_page_cache_page()
    will soon be updated so that the invariant actually holds.

    v3: s/mem_cgroup_migrate()/mem_cgroup_css_from_page()/

    v2: Trigger WARN if the function is used on the traditional
    hierarchies and add comment about the assumed invariant.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@suse.cz>
    ---
    include/linux/memcontrol.h | 1 +
    mm/memcontrol.c | 31 +++++++++++++++++++++++++++++++
    2 files changed, 32 insertions(+)

    diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
    index 294498f..637ef62 100644
    --- a/include/linux/memcontrol.h
    +++ b/include/linux/memcontrol.h
    @@ -115,6 +115,7 @@ static inline bool mm_match_cgroup(struct mm_struct *mm,
    }

    extern struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *memcg);
    +extern struct cgroup_subsys_state *mem_cgroup_css_from_page(struct page *page);

    struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *,
    struct mem_cgroup *,
    diff --git a/mm/memcontrol.c b/mm/memcontrol.c
    index b22a92b..c856cec 100644
    --- a/mm/memcontrol.c
    +++ b/mm/memcontrol.c
    @@ -598,6 +598,37 @@ struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *memcg)
    return &memcg->css;
    }

    +/**
    + * mem_cgroup_css_from_page - css of the memcg associated with a page
    + * @page: page of interest
    + *
    + * This function is guaranteed to return a valid cgroup_subsys_state and
    + * the returned css remains associated with @page until it is released.
    + *
    + * This can only be used on the default hierarchy as @page's memcg
    + * association may change on the traditional hierarchies. Use
    + * try_get_mem_cgroup_from_page() instead on the traditional hierarchies.
    + *
    + * XXX: The above comment isn't true yet as replace_page_cache_page() can
    + * modify the association before @page is released even on the default
    + * hierarchy; however, the current and planned usages don't mix the
    + * the two functions and replace_page_cache_page() will soon be
    + * updated to make the invariant actually true.
    + */
    +struct cgroup_subsys_state *mem_cgroup_css_from_page(struct page *page)
    +{
    + struct cgroup_subsys_state *css;
    +
    + if (page->mem_cgroup)
    + css = &page->mem_cgroup->css;
    + else
    + css = &root_mem_cgroup->css;
    +
    + WARN_ON_ONCE(!cgroup_on_dfl(css->cgroup));
    +
    + return css;
    +}
    +
    static struct mem_cgroup_per_zone *
    mem_cgroup_page_zoneinfo(struct mem_cgroup *memcg, struct page *page)
    {
    --
    2.4.0


    \
     
     \ /
      Last update: 2015-05-27 20:41    [W:4.170 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site