All of lore.kernel.org
 help / color / mirror / Atom feed
From: Shakeel Butt <shakeelb@google.com>
To: Muchun Song <songmuchun@bytedance.com>
Cc: Roman Gushchin <guro@fb.com>,
	Johannes Weiner <hannes@cmpxchg.org>,
	Michal Hocko <mhocko@kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Vladimir Davydov <vdavydov.dev@gmail.com>,
	LKML <linux-kernel@vger.kernel.org>,
	Linux MM <linux-mm@kvack.org>,
	Xiongchun duan <duanxiongchun@bytedance.com>
Subject: Re: [PATCH v4 4/5] mm: memcontrol: use obj_cgroup APIs to charge kmem pages
Date: Thu, 18 Mar 2021 20:39:50 -0700	[thread overview]
Message-ID: <CALvZod5RSXiUHBkW4aaWOnak6LQ6QdSiGWMh9Wk_Q++dz6Y4_Q@mail.gmail.com> (raw)
In-Reply-To: <20210318110658.60892-5-songmuchun@bytedance.com>

On Thu, Mar 18, 2021 at 4:08 AM Muchun Song <songmuchun@bytedance.com> wrote:
>
[...]
>
> +static inline struct mem_cgroup *get_obj_cgroup_memcg(struct obj_cgroup *objcg)

I would prefer get_mem_cgroup_from_objcg().

> +{
> +       struct mem_cgroup *memcg;
> +
> +       rcu_read_lock();
> +retry:
> +       memcg = obj_cgroup_memcg(objcg);
> +       if (unlikely(!css_tryget(&memcg->css)))
> +               goto retry;
> +       rcu_read_unlock();
> +
> +       return memcg;
> +}
> +
>  #ifdef CONFIG_MEMCG_KMEM
>  int memcg_alloc_page_obj_cgroups(struct page *page, struct kmem_cache *s,
>                                  gfp_t gfp, bool new_page)
> @@ -3070,15 +3088,8 @@ static int obj_cgroup_charge_pages(struct obj_cgroup *objcg, gfp_t gfp,
>         struct mem_cgroup *memcg;
>         int ret;
>
> -       rcu_read_lock();
> -retry:
> -       memcg = obj_cgroup_memcg(objcg);
> -       if (unlikely(!css_tryget(&memcg->css)))
> -               goto retry;
> -       rcu_read_unlock();
> -
> +       memcg = get_obj_cgroup_memcg(objcg);
>         ret = __memcg_kmem_charge(memcg, gfp, nr_pages);

Why not manually inline __memcg_kmem_charge() here? This is the only user.

Similarly manually inline __memcg_kmem_uncharge() into
obj_cgroup_uncharge_pages() and call obj_cgroup_uncharge_pages() in
obj_cgroup_release().

> -
>         css_put(&memcg->css);
>
>         return ret;
> @@ -3143,18 +3154,18 @@ static void __memcg_kmem_uncharge(struct mem_cgroup *memcg, unsigned int nr_page
>   */
>  int __memcg_kmem_charge_page(struct page *page, gfp_t gfp, int order)
>  {
> -       struct mem_cgroup *memcg;
> +       struct obj_cgroup *objcg;
>         int ret = 0;
>
> -       memcg = get_mem_cgroup_from_current();

This was the only use of get_mem_cgroup_from_current(). Why not remove it?

> -       if (memcg && !mem_cgroup_is_root(memcg)) {
> -               ret = __memcg_kmem_charge(memcg, gfp, 1 << order);
> +       objcg = get_obj_cgroup_from_current();
> +       if (objcg) {
> +               ret = obj_cgroup_charge_pages(objcg, gfp, 1 << order);
>                 if (!ret) {
> -                       page->memcg_data = (unsigned long)memcg |
> +                       page->memcg_data = (unsigned long)objcg |
>                                 MEMCG_DATA_KMEM;
>                         return 0;
>                 }
> -               css_put(&memcg->css);
> +               obj_cgroup_put(objcg);
>         }
>         return ret;
>  }
[...]
>  static void uncharge_page(struct page *page, struct uncharge_gather *ug)
>  {
>         unsigned long nr_pages;
> +       struct mem_cgroup *memcg;
> +       struct obj_cgroup *objcg;
>
>         VM_BUG_ON_PAGE(PageLRU(page), page);
>
> -       if (!page_memcg(page))
> -               return;
> -
>         /*
>          * Nobody should be changing or seriously looking at
> -        * page_memcg(page) at this point, we have fully
> +        * page memcg or objcg at this point, we have fully
>          * exclusive access to the page.
>          */
> +       if (PageMemcgKmem(page)) {
> +               objcg = __page_objcg(page);
> +               memcg = get_obj_cgroup_memcg(objcg);

Can you add a comment that this get matches the put at the end of the
function and kmem pages do not hold memcg references anymore.

> +       } else {
> +               memcg = __page_memcg(page);
> +       }
> +
> +       if (!memcg)
> +               return;
>
> -       if (ug->memcg != page_memcg(page)) {
> +       if (ug->memcg != memcg) {
>                 if (ug->memcg) {
>                         uncharge_batch(ug);
>                         uncharge_gather_clear(ug);
>                 }
> -               ug->memcg = page_memcg(page);
> +               ug->memcg = memcg;
>                 ug->dummy_page = page;
>
>                 /* pairs with css_put in uncharge_batch */
> -               css_get(&ug->memcg->css);
> +               css_get(&memcg->css);
>         }
>
>         nr_pages = compound_nr(page);
> -       ug->nr_pages += nr_pages;
>
> -       if (PageMemcgKmem(page))
> +       if (PageMemcgKmem(page)) {
> +               ug->nr_memory += nr_pages;
>                 ug->nr_kmem += nr_pages;
> -       else
> +
> +               page->memcg_data = 0;
> +               obj_cgroup_put(objcg);
> +       } else {
> +               /* LRU pages aren't accounted at the root level */
> +               if (!mem_cgroup_is_root(memcg))
> +                       ug->nr_memory += nr_pages;
>                 ug->pgpgout++;
>
> -       page->memcg_data = 0;
> -       css_put(&ug->memcg->css);
> +               page->memcg_data = 0;
> +       }
> +
> +       css_put(&memcg->css);
>  }
>
>  /**
> --
> 2.11.0
>

  parent reply	other threads:[~2021-03-19  3:40 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-18 11:06 [PATCH v4 0/5] Use obj_cgroup APIs to charge kmem pages Muchun Song
2021-03-18 11:06 ` [PATCH v4 1/5] mm: memcontrol: introduce obj_cgroup_{un}charge_pages Muchun Song
2021-03-18 11:06 ` [PATCH v4 2/5] mm: memcontrol: directly access page->memcg_data in mm/page_alloc.c Muchun Song
2021-03-18 15:09   ` Johannes Weiner
2021-03-19  1:00   ` Shakeel Butt
2021-03-19  1:00     ` Shakeel Butt
2021-03-18 11:06 ` [PATCH v4 3/5] mm: memcontrol: change ug->dummy_page only if memcg changed Muchun Song
2021-03-18 15:11   ` Johannes Weiner
2021-03-19  1:22   ` Shakeel Butt
2021-03-19  1:22     ` Shakeel Butt
2021-03-18 11:06 ` [PATCH v4 4/5] mm: memcontrol: use obj_cgroup APIs to charge kmem pages Muchun Song
2021-03-18 15:23   ` Johannes Weiner
2021-03-19  3:39   ` Shakeel Butt [this message]
2021-03-19  3:39     ` Shakeel Butt
2021-03-19  4:05     ` [External] " Muchun Song
2021-03-19  4:05       ` Muchun Song
2021-03-19 13:59       ` Shakeel Butt
2021-03-19 13:59         ` Shakeel Butt
2021-03-19 15:45         ` Muchun Song
2021-03-19 15:45           ` Muchun Song
2021-03-18 11:06 ` [PATCH v4 5/5] mm: memcontrol: move PageMemcgKmem to the scope of CONFIG_MEMCG_KMEM Muchun Song
2021-03-19  8:14 [PATCH v4 4/5] mm: memcontrol: use obj_cgroup APIs to charge kmem pages kernel test robot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CALvZod5RSXiUHBkW4aaWOnak6LQ6QdSiGWMh9Wk_Q++dz6Y4_Q@mail.gmail.com \
    --to=shakeelb@google.com \
    --cc=akpm@linux-foundation.org \
    --cc=duanxiongchun@bytedance.com \
    --cc=guro@fb.com \
    --cc=hannes@cmpxchg.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@kernel.org \
    --cc=songmuchun@bytedance.com \
    --cc=vdavydov.dev@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.