All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michal Hocko <mhocko@suse.com>
To: Matthew Wilcox <willy@infradead.org>
Cc: Zhou Guanghui <zhouguanghui1@huawei.com>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	akpm@linux-foundation.org, hannes@cmpxchg.org, hughd@google.com,
	kirill.shutemov@linux.intel.com, npiggin@gmail.com,
	ziy@nvidia.com, wangkefeng.wang@huawei.com, guohanjun@huawei.com,
	dingtianhong@huawei.com, chenweilong@huawei.com,
	rui.xiang@huawei.com
Subject: Re: [PATCH v2 2/2] mm/memcg: set memcg when split page
Date: Thu, 11 Mar 2021 09:37:02 +0100	[thread overview]
Message-ID: <YEnWrg2XFwZ2PR0N@dhcp22.suse.cz> (raw)
In-Reply-To: <YEdyJ+ZK2l7tu0rw@dhcp22.suse.cz>

Johannes, Hugh,

what do you think about this approach? If we want to stick with
split_page approach then we need to update the missing place Matthew has
pointed out.

On Tue 09-03-21 14:03:36, Michal Hocko wrote:
> On Tue 09-03-21 12:32:55, Matthew Wilcox wrote:
> > On Tue, Mar 09, 2021 at 10:02:00AM +0100, Michal Hocko wrote:
> [...]
> > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> > > index 913c2b9e5c72..d44dea2b8d22 100644
> > > --- a/mm/memcontrol.c
> > > +++ b/mm/memcontrol.c
> > > @@ -3135,8 +3135,21 @@ int __memcg_kmem_charge_page(struct page *page, gfp_t gfp, int order)
> > >  	if (memcg && !mem_cgroup_is_root(memcg)) {
> > >  		ret = __memcg_kmem_charge(memcg, gfp, 1 << order);
> > >  		if (!ret) {
> > > +			int nr_pages = 1 << order;
> > >  			page->memcg_data = (unsigned long)memcg |
> > >  				MEMCG_DATA_KMEM;
> > > +			
> > > +			/*
> > > +			 * Compound pages are normally split or freed
> > > +			 * via their head pages so memcg_data in in the
> > > +			 * head page should be sufficient but there
> > > +			 * are exceptions to the rule (see __free_pages).
> > > +			 * Non compound pages would need to copy memcg anyway.
> > > +			 */
> > > +			for (i = 1; i < nr_pages; i++) {
> > > +				struct page * p = page + i;
> > > +				p->memcg_data = page->memcg_data
> > > +			}
> > >  			return 0;
> > 
> > I would condition this loop on if (!(gfp & __GFP_COMP)), but yes, something
> > along these lines.  I might phrase the comment a little differently ...
> > 
> > 			/*
> > 			 * Compound pages are treated as a single unit,
> > 			 * but non-compound pages can be freed individually
> > 			 * so each page needs to have its memcg set to get
> > 			 * the accounting right.
> > 			 */
> 
> OK, I must have misunderstood your __free_pages fix then. I thought this
> was about compound pages. Btw. again I forgot about css ref counting so
> here is an updated version.
> 
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index 913c2b9e5c72..ec2c705f38fa 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -3133,10 +3133,22 @@ int __memcg_kmem_charge_page(struct page *page, gfp_t gfp, int order)
>  
>  	memcg = get_mem_cgroup_from_current();
>  	if (memcg && !mem_cgroup_is_root(memcg)) {
> -		ret = __memcg_kmem_charge(memcg, gfp, 1 << order);
> +		int nr_pages = 1 << order;
> +		ret = __memcg_kmem_charge(memcg, gfp, nr_pages);
>  		if (!ret) {
>  			page->memcg_data = (unsigned long)memcg |
>  				MEMCG_DATA_KMEM;
> +			if (nr_pages > 1) {
> +				/*
> +				 * comment goes here
> +				 */
> +				for (i = 1; i < nr_pages; i++) {
> +					struct page * p = page + i;
> +					p->memcg_data = page->memcg_data
> +				}
> +				/* Head page reference from get_mem_cgroup_from_current */
> +				css_get_many(&memcg->css, nr_pages - 1);
> +			}
>  			return 0;
>  		}
>  		css_put(&memcg->css);

-- 
Michal Hocko
SUSE Labs

  reply	other threads:[~2021-03-11  8:38 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-04  7:40 [PATCH v2 0/2] set memcg when split page Zhou Guanghui
2021-03-04  7:40 ` [PATCH v2 1/2] mm/memcg: rename mem_cgroup_split_huge_fixup to split_page_memcg Zhou Guanghui
2021-03-04 15:50   ` Johannes Weiner
2021-03-04 16:20   ` Zi Yan
2021-03-04 18:54   ` Shakeel Butt
2021-03-04 18:54     ` Shakeel Butt
2021-03-05 11:48   ` Michal Hocko
2021-03-08 22:37   ` Singh, Balbir
2021-03-09  8:28     ` Michal Hocko
2021-03-10 21:44       ` Singh, Balbir
2021-03-10 22:00         ` Hugh Dickins
2021-03-10 22:00           ` Hugh Dickins
2021-03-10 23:50           ` Singh, Balbir
2021-03-04  7:40 ` [PATCH v2 2/2] mm/memcg: set memcg when split page Zhou Guanghui
2021-03-04 15:52   ` Johannes Weiner
2021-03-04 16:22   ` Zi Yan
2021-03-04 18:55   ` Shakeel Butt
2021-03-04 18:55     ` Shakeel Butt
2021-03-05 11:52   ` Michal Hocko
2021-03-05 23:58     ` Andrew Morton
2021-03-08  8:41       ` Michal Hocko
2021-03-08 20:42         ` Andrew Morton
2021-03-08 20:47           ` Matthew Wilcox
2021-03-09  0:10             ` Andrew Morton
2021-03-08 21:02   ` Matthew Wilcox
2021-03-09  9:02     ` Michal Hocko
2021-03-09 12:32       ` Matthew Wilcox
2021-03-09 13:03         ` Michal Hocko
2021-03-11  8:37           ` Michal Hocko [this message]
2021-03-11 15:21             ` Johannes Weiner
2021-03-11 16:23               ` Matthew Wilcox
2021-03-11 16:26               ` Michal Hocko
2021-03-11 20:37                 ` Hugh Dickins
2021-03-11 20:37                   ` Hugh Dickins
2021-03-18 14:05                   ` Michal Hocko
2021-03-18 15:02                     ` Matthew Wilcox
2021-03-18 15:07                     ` Johannes Weiner

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=YEnWrg2XFwZ2PR0N@dhcp22.suse.cz \
    --to=mhocko@suse.com \
    --cc=akpm@linux-foundation.org \
    --cc=chenweilong@huawei.com \
    --cc=dingtianhong@huawei.com \
    --cc=guohanjun@huawei.com \
    --cc=hannes@cmpxchg.org \
    --cc=hughd@google.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=npiggin@gmail.com \
    --cc=rui.xiang@huawei.com \
    --cc=wangkefeng.wang@huawei.com \
    --cc=willy@infradead.org \
    --cc=zhouguanghui1@huawei.com \
    --cc=ziy@nvidia.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.