linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Hugh Dickins <hughd@google.com>
To: Johannes Weiner <hannes@cmpxchg.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
	Michal Hocko <mhocko@suse.cz>,
	Balbir Singh <bsingharora@gmail.com>,
	cgroups@vger.kernel.org, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org
Subject: Re: [patch 7/8] mm: memcg: modify PageCgroupAcctLRU non-atomically
Date: Wed, 23 Nov 2011 10:52:39 -0800 (PST)	[thread overview]
Message-ID: <alpine.LSU.2.00.1111231039390.2175@sister.anvils> (raw)
In-Reply-To: <1322062951-1756-8-git-send-email-hannes@cmpxchg.org>

On Wed, 23 Nov 2011, Johannes Weiner wrote:

> From: Johannes Weiner <jweiner@redhat.com>
> 
> This bit is protected by zone->lru_lock, there is no need for locked
> operations when setting and clearing it.
> 
> Signed-off-by: Johannes Weiner <jweiner@redhat.com>

Unless there are special considerations which you have not mentioned at
all in the description above, this 7/8 and the similar 8/8 are mistaken.

The atomic operation is not for guaranteeing the setting and clearing
of the bit in question: it's for guaranteeing that you don't accidentally
set or clear any of the other bits in the same word when you're doing so,
if another task is updating them at the same time as you're doing this.

There are circumstances when non-atomic shortcuts can be taken, when
you're sure the field cannot yet be visible to other tasks (we do that
when setting PageLocked on a freshly allocated page, for example - but
even then have to rely on others using get_page_unless_zero properly).
But I don't think that's the case here.

Hugh

> ---
>  include/linux/page_cgroup.h |   16 ++++++++++++----
>  mm/memcontrol.c             |    4 ++--
>  2 files changed, 14 insertions(+), 6 deletions(-)
> 
> diff --git a/include/linux/page_cgroup.h b/include/linux/page_cgroup.h
> index aaa60da..a0bc9d0 100644
> --- a/include/linux/page_cgroup.h
> +++ b/include/linux/page_cgroup.h
> @@ -57,14 +57,23 @@ static inline int PageCgroup##uname(struct page_cgroup *pc)	\
>  #define SETPCGFLAG(uname, lname)			\
>  static inline void SetPageCgroup##uname(struct page_cgroup *pc)\
>  	{ set_bit(PCG_##lname, &pc->flags);  }
> +#define __SETPCGFLAG(uname, lname)			\
> +static inline void __SetPageCgroup##uname(struct page_cgroup *pc)\
> +	{ __set_bit(PCG_##lname, &pc->flags);  }
>  
>  #define CLEARPCGFLAG(uname, lname)			\
>  static inline void ClearPageCgroup##uname(struct page_cgroup *pc)	\
>  	{ clear_bit(PCG_##lname, &pc->flags);  }
> +#define __CLEARPCGFLAG(uname, lname)			\
> +static inline void __ClearPageCgroup##uname(struct page_cgroup *pc)	\
> +	{ __clear_bit(PCG_##lname, &pc->flags);  }
>  
>  #define TESTCLEARPCGFLAG(uname, lname)			\
>  static inline int TestClearPageCgroup##uname(struct page_cgroup *pc)	\
>  	{ return test_and_clear_bit(PCG_##lname, &pc->flags);  }
> +#define __TESTCLEARPCGFLAG(uname, lname)			\
> +static inline int __TestClearPageCgroup##uname(struct page_cgroup *pc)	\
> +	{ return __test_and_clear_bit(PCG_##lname, &pc->flags);  }
>  
>  /* Cache flag is set only once (at allocation) */
>  TESTPCGFLAG(Cache, CACHE)
> @@ -75,11 +84,10 @@ TESTPCGFLAG(Used, USED)
>  CLEARPCGFLAG(Used, USED)
>  SETPCGFLAG(Used, USED)
>  
> -SETPCGFLAG(AcctLRU, ACCT_LRU)
> -CLEARPCGFLAG(AcctLRU, ACCT_LRU)
> +__SETPCGFLAG(AcctLRU, ACCT_LRU)
> +__CLEARPCGFLAG(AcctLRU, ACCT_LRU)
>  TESTPCGFLAG(AcctLRU, ACCT_LRU)
> -TESTCLEARPCGFLAG(AcctLRU, ACCT_LRU)
> -
> +__TESTCLEARPCGFLAG(AcctLRU, ACCT_LRU)
>  
>  SETPCGFLAG(FileMapped, FILE_MAPPED)
>  CLEARPCGFLAG(FileMapped, FILE_MAPPED)
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index b9a3b94..51aba19 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -995,7 +995,7 @@ struct lruvec *mem_cgroup_lru_add_list(struct zone *zone, struct page *page,
>  		/* Ensure pc->mem_cgroup is visible after reading PCG_USED. */
>  		smp_rmb();
>  		memcg = pc->mem_cgroup;
> -		SetPageCgroupAcctLRU(pc);
> +		__SetPageCgroupAcctLRU(pc);
>  	} else
>  		memcg = root_mem_cgroup;
>  	mz = page_cgroup_zoneinfo(memcg, page);
> @@ -1031,7 +1031,7 @@ void mem_cgroup_lru_del_list(struct page *page, enum lru_list lru)
>  	 * LRU-accounting happened against pc->mem_cgroup or
>  	 * root_mem_cgroup.
>  	 */
> -	if (TestClearPageCgroupAcctLRU(pc)) {
> +	if (__TestClearPageCgroupAcctLRU(pc)) {
>  		VM_BUG_ON(!pc->mem_cgroup);
>  		memcg = pc->mem_cgroup;
>  	} else
> -- 
> 1.7.6.4
> 
> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to majordomo@kvack.org.  For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
> 

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2011-11-23 18:53 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-23 15:42 [patch 0/8] mm: memcg fixlets for 3.3 Johannes Weiner
2011-11-23 15:42 ` [patch 1/8] mm: oom_kill: remove memcg argument from oom_kill_task() Johannes Weiner
2011-11-23 22:35   ` David Rientjes
2011-11-23 23:57   ` KAMEZAWA Hiroyuki
2011-11-24  9:07   ` Michal Hocko
2011-11-28  0:37   ` Balbir Singh
2011-11-23 15:42 ` [patch 2/8] mm: unify remaining mem_cont, mem, etc. variable names to memcg Johannes Weiner
2011-11-23 22:40   ` David Rientjes
2011-11-23 23:58   ` KAMEZAWA Hiroyuki
2011-11-24  9:17   ` Michal Hocko
2011-11-28  0:42   ` Balbir Singh
2011-11-23 15:42 ` [patch 3/8] mm: memcg: clean up fault accounting Johannes Weiner
2011-11-24  0:00   ` KAMEZAWA Hiroyuki
2011-11-24  9:33   ` Michal Hocko
2011-11-24  9:51     ` Johannes Weiner
2011-11-28  0:45   ` Balbir Singh
2011-11-23 15:42 ` [patch 4/8] mm: memcg: lookup_page_cgroup (almost) never returns NULL Johannes Weiner
2011-11-24  0:01   ` KAMEZAWA Hiroyuki
2011-11-24  9:52   ` Michal Hocko
2011-11-24 10:05     ` Johannes Weiner
2011-11-24 10:26       ` Michal Hocko
2011-11-28  9:15         ` Johannes Weiner
2011-11-28  9:34           ` Johannes Weiner
2011-11-28 10:12             ` Michal Hocko
2011-11-28  7:03   ` Balbir Singh
2011-11-28  9:17     ` Johannes Weiner
2011-11-23 15:42 ` [patch 5/8] mm: memcg: remove unneeded checks from newpage_charge() Johannes Weiner
2011-11-24  0:04   ` KAMEZAWA Hiroyuki
2011-11-24  9:04     ` Johannes Weiner
2011-11-24 10:30       ` Michal Hocko
2011-11-24 11:58         ` Johannes Weiner
2011-11-23 15:42 ` [patch 6/8] mm: memcg: remove unneeded checks from uncharge_page() Johannes Weiner
2011-11-24  0:06   ` KAMEZAWA Hiroyuki
2011-11-24  9:06     ` Johannes Weiner
2011-11-24 10:34       ` Michal Hocko
2011-11-23 15:42 ` [patch 7/8] mm: memcg: modify PageCgroupAcctLRU non-atomically Johannes Weiner
2011-11-23 18:52   ` Hugh Dickins [this message]
2011-11-24  8:53     ` Johannes Weiner
2011-11-24  0:09   ` KAMEZAWA Hiroyuki
2011-11-24  8:55     ` Johannes Weiner
2011-11-23 15:42 ` [patch 8/8] mm: memcg: modify PageCgroupCache non-atomically Johannes Weiner
2011-11-24  0:13   ` KAMEZAWA Hiroyuki
2011-11-24  9:13     ` Johannes Weiner
2011-11-24  6:09 ` [patch 0/8] mm: memcg fixlets for 3.3 Balbir Singh
2011-11-24  9:45   ` 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=alpine.LSU.2.00.1111231039390.2175@sister.anvils \
    --to=hughd@google.com \
    --cc=akpm@linux-foundation.org \
    --cc=bsingharora@gmail.com \
    --cc=cgroups@vger.kernel.org \
    --cc=hannes@cmpxchg.org \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@suse.cz \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox