All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michal Hocko <mhocko@suse.com>
To: Roman Gushchin <guro@fb.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Shakeel Butt <shakeelb@google.com>,
	Johannes Weiner <hannes@cmpxchg.org>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	kernel-team@fb.com
Subject: Re: [PATCH v5 3/4] mm: introduce page memcg flags
Date: Wed, 14 Oct 2020 16:37:43 +0200	[thread overview]
Message-ID: <20201014143743.GF4440@dhcp22.suse.cz> (raw)
In-Reply-To: <20201002172559.4000748-4-guro@fb.com>

On Fri 02-10-20 10:25:58, Roman Gushchin wrote:
> The lowest bit in page->memcg_data is used to distinguish between
> struct memory_cgroup pointer and a pointer to a objcgs array.
> All checks and modifications of this bit are open-coded.
> 
> Let's formalize it using page memcg flags, defined in enum
> page_memcg_data_flags.
> 
> Additional flags might be added later.
> 
> Signed-off-by: Roman Gushchin <guro@fb.com>
> Reviewed-by: Shakeel Butt <shakeelb@google.com>

Acked-by: Michal Hocko <mhocko@suse.com>

> ---
>  include/linux/memcontrol.h | 32 ++++++++++++++++++++------------
>  1 file changed, 20 insertions(+), 12 deletions(-)
> 
> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> index c7ac0a5b8989..99a4841d658b 100644
> --- a/include/linux/memcontrol.h
> +++ b/include/linux/memcontrol.h
> @@ -343,6 +343,15 @@ struct mem_cgroup {
>  
>  extern struct mem_cgroup *root_mem_cgroup;
>  
> +enum page_memcg_data_flags {
> +	/* page->memcg_data is a pointer to an objcgs vector */
> +	MEMCG_DATA_OBJCGS = (1UL << 0),
> +	/* the next bit after the last actual flag */
> +	__NR_MEMCG_DATA_FLAGS  = (1UL << 1),
> +};
> +
> +#define MEMCG_DATA_FLAGS_MASK (__NR_MEMCG_DATA_FLAGS - 1)
> +
>  /*
>   * page_memcg - get the memory cgroup associated with a page
>   * @page: a pointer to the page struct
> @@ -404,13 +413,7 @@ static inline struct mem_cgroup *page_memcg_check(struct page *page)
>  	 */
>  	unsigned long memcg_data = READ_ONCE(page->memcg_data);
>  
> -	/*
> -	 * The lowest bit set means that memcg isn't a valid
> -	 * memcg pointer, but a obj_cgroups pointer.
> -	 * In this case the page is shared and doesn't belong
> -	 * to any specific memory cgroup.
> -	 */
> -	if (memcg_data & 0x1UL)
> +	if (memcg_data & MEMCG_DATA_OBJCGS)
>  		return NULL;
>  
>  	return (struct mem_cgroup *)memcg_data;
> @@ -429,7 +432,11 @@ static inline struct mem_cgroup *page_memcg_check(struct page *page)
>   */
>  static inline struct obj_cgroup **page_objcgs(struct page *page)
>  {
> -	return (struct obj_cgroup **)(READ_ONCE(page->memcg_data) & ~0x1UL);
> +	unsigned long memcg_data = READ_ONCE(page->memcg_data);
> +
> +	VM_BUG_ON_PAGE(memcg_data && !(memcg_data & MEMCG_DATA_OBJCGS), page);
> +
> +	return (struct obj_cgroup **)(memcg_data & ~MEMCG_DATA_FLAGS_MASK);
>  }
>  
>  /*
> @@ -444,10 +451,10 @@ static inline struct obj_cgroup **page_objcgs_check(struct page *page)
>  {
>  	unsigned long memcg_data = READ_ONCE(page->memcg_data);
>  
> -	if (memcg_data && (memcg_data & 0x1UL))
> -		return (struct obj_cgroup **)(memcg_data & ~0x1UL);
> +	if (!memcg_data || !(memcg_data & MEMCG_DATA_OBJCGS))
> +		return NULL;
>  
> -	return NULL;
> +	return (struct obj_cgroup **)(memcg_data & ~MEMCG_DATA_FLAGS_MASK);
>  }
>  
>  /*
> @@ -460,7 +467,8 @@ static inline struct obj_cgroup **page_objcgs_check(struct page *page)
>  static inline bool set_page_objcgs(struct page *page,
>  					struct obj_cgroup **objcgs)
>  {
> -	return !cmpxchg(&page->memcg_data, 0, (unsigned long)objcgs | 0x1UL);
> +	return !cmpxchg(&page->memcg_data, 0, (unsigned long)objcgs |
> +			MEMCG_DATA_OBJCGS);
>  }
>  #else
>  static inline struct obj_cgroup **page_objcgs(struct page *page)
> -- 
> 2.26.2

-- 
Michal Hocko
SUSE Labs


  parent reply	other threads:[~2020-10-14 14:37 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-02 17:25 [PATCH v5 0/4] mm: allow mapping accounted kernel pages to userspace Roman Gushchin
2020-10-02 17:25 ` [PATCH v5 1/4] mm: memcontrol: use helpers to read page's memcg data Roman Gushchin
2020-10-05 15:12   ` Shakeel Butt
2020-10-14 14:37   ` Michal Hocko
2020-10-02 17:25 ` [PATCH v5 2/4] mm: memcontrol/slab: use helpers to access slab page's memcg_data Roman Gushchin
2020-10-05 15:13   ` Shakeel Butt
2020-10-02 17:25 ` [PATCH v5 3/4] mm: introduce page memcg flags Roman Gushchin
2020-10-05 14:57   ` Johannes Weiner
2020-10-14 14:37   ` Michal Hocko [this message]
2020-10-02 17:25 ` [PATCH v5 4/4] mm: convert page kmemcg type to a page memcg flag Roman Gushchin
2020-10-05 15:18   ` Shakeel Butt
2020-10-14 14:40   ` Michal Hocko

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=20201014143743.GF4440@dhcp22.suse.cz \
    --to=mhocko@suse.com \
    --cc=akpm@linux-foundation.org \
    --cc=guro@fb.com \
    --cc=hannes@cmpxchg.org \
    --cc=kernel-team@fb.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=shakeelb@google.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.