All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vlastimil Babka <vbabka@suse.cz>
To: Mel Gorman <mgorman@techsingularity.net>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: Johannes Weiner <hannes@cmpxchg.org>,
	Rik van Riel <riel@redhat.com>,
	David Rientjes <rientjes@google.com>,
	Joonsoo Kim <iamjoonsoo.kim@lge.com>,
	Michal Hocko <mhocko@kernel.org>, Linux-MM <linux-mm@kvack.org>,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 04/12] mm, page_alloc: Only check cpusets when one exists that can be mem-controlled
Date: Mon, 24 Aug 2015 14:37:41 +0200	[thread overview]
Message-ID: <55DB1015.4080103@suse.cz> (raw)
In-Reply-To: <1440418191-10894-5-git-send-email-mgorman@techsingularity.net>

On 08/24/2015 02:09 PM, Mel Gorman wrote:
> David Rientjes correctly pointed out that the "root cpuset may not exclude
> mems on the system so, even if mounted, there's no need to check or be
> worried about concurrent change when there is only one cpuset".
>
> The three checks for cpusets_enabled() care whether a cpuset exists that
> can limit memory, not that cpuset is enabled as such. This patch replaces
> cpusets_enabled() with cpusets_mems_enabled() which checks if at least one
> cpuset exists that can limit memory and updates the appropriate call sites.
>
> Signed-off-by: Mel Gorman <mgorman@suse.de>
> ---
>   include/linux/cpuset.h | 16 +++++++++-------
>   mm/page_alloc.c        |  2 +-
>   2 files changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h
> index 6eb27cb480b7..1e823870987e 100644
> --- a/include/linux/cpuset.h
> +++ b/include/linux/cpuset.h
> @@ -17,10 +17,6 @@
>   #ifdef CONFIG_CPUSETS
>
>   extern struct static_key cpusets_enabled_key;
> -static inline bool cpusets_enabled(void)
> -{
> -	return static_key_false(&cpusets_enabled_key);
> -}
>
>   static inline int nr_cpusets(void)
>   {
> @@ -28,6 +24,12 @@ static inline int nr_cpusets(void)
>   	return static_key_count(&cpusets_enabled_key) + 1;
>   }
>
> +/* Returns true if a cpuset exists that can set cpuset.mems */
> +static inline bool cpusets_mems_enabled(void)
> +{
> +	return nr_cpusets() > 1;
> +}
> +

Hm, but this loses the benefits of static key branches?
How about something like:

   if (static_key_false(&cpusets_enabled_key))
	return nr_cpusets() > 1
   else
	return false;



>   static inline void cpuset_inc(void)
>   {
>   	static_key_slow_inc(&cpusets_enabled_key);
> @@ -104,7 +106,7 @@ extern void cpuset_print_task_mems_allowed(struct task_struct *p);
>    */
>   static inline unsigned int read_mems_allowed_begin(void)
>   {
> -	if (!cpusets_enabled())
> +	if (!cpusets_mems_enabled())
>   		return 0;
>
>   	return read_seqcount_begin(&current->mems_allowed_seq);
> @@ -118,7 +120,7 @@ static inline unsigned int read_mems_allowed_begin(void)
>    */
>   static inline bool read_mems_allowed_retry(unsigned int seq)
>   {
> -	if (!cpusets_enabled())
> +	if (!cpusets_mems_enabled())
>   		return false;

Actually I doubt it's much of benefit for these usages, even if the 
static key benefits are restored. If there's a single root cpuset, we 
would check the seqlock prior to this patch, now we'll check static key 
value (which should have the same cost?). With >1 cpusets, we would 
check seqlock prior to this patch, now we'll check static key value 
*and* the seqlock...

>
>   	return read_seqcount_retry(&current->mems_allowed_seq, seq);
> @@ -139,7 +141,7 @@ static inline void set_mems_allowed(nodemask_t nodemask)
>
>   #else /* !CONFIG_CPUSETS */
>
> -static inline bool cpusets_enabled(void) { return false; }
> +static inline bool cpusets_mems_enabled(void) { return false; }
>
>   static inline int cpuset_init(void) { return 0; }
>   static inline void cpuset_init_smp(void) {}
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 62ae28d8ae8d..2c1c3bf54d15 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -2470,7 +2470,7 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags,
>   		if (IS_ENABLED(CONFIG_NUMA) && zlc_active &&
>   			!zlc_zone_worth_trying(zonelist, z, allowednodes))
>   				continue;
> -		if (cpusets_enabled() &&
> +		if (cpusets_mems_enabled() &&
>   			(alloc_flags & ALLOC_CPUSET) &&
>   			!cpuset_zone_allowed(zone, gfp_mask))
>   				continue;

Here the benefits are less clear. I guess cpuset_zone_allowed() is 
potentially costly...

Heck, shouldn't we just start the static key on -1 (if possible), so 
that it's enabled only when there's 2+ cpusets?

--
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/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: Vlastimil Babka <vbabka@suse.cz>
To: Mel Gorman <mgorman@techsingularity.net>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: Johannes Weiner <hannes@cmpxchg.org>,
	Rik van Riel <riel@redhat.com>,
	David Rientjes <rientjes@google.com>,
	Joonsoo Kim <iamjoonsoo.kim@lge.com>,
	Michal Hocko <mhocko@kernel.org>, Linux-MM <linux-mm@kvack.org>,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 04/12] mm, page_alloc: Only check cpusets when one exists that can be mem-controlled
Date: Mon, 24 Aug 2015 14:37:41 +0200	[thread overview]
Message-ID: <55DB1015.4080103@suse.cz> (raw)
In-Reply-To: <1440418191-10894-5-git-send-email-mgorman@techsingularity.net>

On 08/24/2015 02:09 PM, Mel Gorman wrote:
> David Rientjes correctly pointed out that the "root cpuset may not exclude
> mems on the system so, even if mounted, there's no need to check or be
> worried about concurrent change when there is only one cpuset".
>
> The three checks for cpusets_enabled() care whether a cpuset exists that
> can limit memory, not that cpuset is enabled as such. This patch replaces
> cpusets_enabled() with cpusets_mems_enabled() which checks if at least one
> cpuset exists that can limit memory and updates the appropriate call sites.
>
> Signed-off-by: Mel Gorman <mgorman@suse.de>
> ---
>   include/linux/cpuset.h | 16 +++++++++-------
>   mm/page_alloc.c        |  2 +-
>   2 files changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h
> index 6eb27cb480b7..1e823870987e 100644
> --- a/include/linux/cpuset.h
> +++ b/include/linux/cpuset.h
> @@ -17,10 +17,6 @@
>   #ifdef CONFIG_CPUSETS
>
>   extern struct static_key cpusets_enabled_key;
> -static inline bool cpusets_enabled(void)
> -{
> -	return static_key_false(&cpusets_enabled_key);
> -}
>
>   static inline int nr_cpusets(void)
>   {
> @@ -28,6 +24,12 @@ static inline int nr_cpusets(void)
>   	return static_key_count(&cpusets_enabled_key) + 1;
>   }
>
> +/* Returns true if a cpuset exists that can set cpuset.mems */
> +static inline bool cpusets_mems_enabled(void)
> +{
> +	return nr_cpusets() > 1;
> +}
> +

Hm, but this loses the benefits of static key branches?
How about something like:

   if (static_key_false(&cpusets_enabled_key))
	return nr_cpusets() > 1
   else
	return false;



>   static inline void cpuset_inc(void)
>   {
>   	static_key_slow_inc(&cpusets_enabled_key);
> @@ -104,7 +106,7 @@ extern void cpuset_print_task_mems_allowed(struct task_struct *p);
>    */
>   static inline unsigned int read_mems_allowed_begin(void)
>   {
> -	if (!cpusets_enabled())
> +	if (!cpusets_mems_enabled())
>   		return 0;
>
>   	return read_seqcount_begin(&current->mems_allowed_seq);
> @@ -118,7 +120,7 @@ static inline unsigned int read_mems_allowed_begin(void)
>    */
>   static inline bool read_mems_allowed_retry(unsigned int seq)
>   {
> -	if (!cpusets_enabled())
> +	if (!cpusets_mems_enabled())
>   		return false;

Actually I doubt it's much of benefit for these usages, even if the 
static key benefits are restored. If there's a single root cpuset, we 
would check the seqlock prior to this patch, now we'll check static key 
value (which should have the same cost?). With >1 cpusets, we would 
check seqlock prior to this patch, now we'll check static key value 
*and* the seqlock...

>
>   	return read_seqcount_retry(&current->mems_allowed_seq, seq);
> @@ -139,7 +141,7 @@ static inline void set_mems_allowed(nodemask_t nodemask)
>
>   #else /* !CONFIG_CPUSETS */
>
> -static inline bool cpusets_enabled(void) { return false; }
> +static inline bool cpusets_mems_enabled(void) { return false; }
>
>   static inline int cpuset_init(void) { return 0; }
>   static inline void cpuset_init_smp(void) {}
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 62ae28d8ae8d..2c1c3bf54d15 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -2470,7 +2470,7 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags,
>   		if (IS_ENABLED(CONFIG_NUMA) && zlc_active &&
>   			!zlc_zone_worth_trying(zonelist, z, allowednodes))
>   				continue;
> -		if (cpusets_enabled() &&
> +		if (cpusets_mems_enabled() &&
>   			(alloc_flags & ALLOC_CPUSET) &&
>   			!cpuset_zone_allowed(zone, gfp_mask))
>   				continue;

Here the benefits are less clear. I guess cpuset_zone_allowed() is 
potentially costly...

Heck, shouldn't we just start the static key on -1 (if possible), so 
that it's enabled only when there's 2+ cpusets?

  reply	other threads:[~2015-08-24 12:37 UTC|newest]

Thread overview: 110+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-24 12:09 [PATCH 00/12] Remove zonelist cache and high-order watermark checking v3 Mel Gorman
2015-08-24 12:09 ` Mel Gorman
2015-08-24 12:09 ` [PATCH 01/12] mm, page_alloc: Remove unnecessary parameter from zone_watermark_ok_safe Mel Gorman
2015-08-24 12:09   ` Mel Gorman
2015-08-24 12:09 ` [PATCH 02/12] mm, page_alloc: Remove unnecessary recalculations for dirty zone balancing Mel Gorman
2015-08-24 12:09   ` Mel Gorman
2015-08-24 12:09 ` [PATCH 03/12] mm, page_alloc: Remove unnecessary taking of a seqlock when cpusets are disabled Mel Gorman
2015-08-24 12:09   ` Mel Gorman
2015-08-26 10:25   ` Michal Hocko
2015-08-26 10:25     ` Michal Hocko
2015-08-24 12:09 ` [PATCH 04/12] mm, page_alloc: Only check cpusets when one exists that can be mem-controlled Mel Gorman
2015-08-24 12:09   ` Mel Gorman
2015-08-24 12:37   ` Vlastimil Babka [this message]
2015-08-24 12:37     ` Vlastimil Babka
2015-08-24 13:16     ` Mel Gorman
2015-08-24 13:16       ` Mel Gorman
2015-08-24 20:53       ` Vlastimil Babka
2015-08-24 20:53         ` Vlastimil Babka
2015-08-25 10:33         ` Mel Gorman
2015-08-25 10:33           ` Mel Gorman
2015-08-25 11:09           ` Vlastimil Babka
2015-08-25 11:09             ` Vlastimil Babka
2015-08-26 13:41             ` Mel Gorman
2015-08-26 13:41               ` Mel Gorman
2015-08-26 10:46   ` Michal Hocko
2015-08-26 10:46     ` Michal Hocko
2015-08-24 12:09 ` [PATCH 05/12] mm, page_alloc: Remove unecessary recheck of nodemask Mel Gorman
2015-08-24 12:09   ` Mel Gorman
2015-08-25 14:32   ` Vlastimil Babka
2015-08-25 14:32     ` Vlastimil Babka
2015-08-24 12:09 ` [PATCH 06/12] mm, page_alloc: Use masks and shifts when converting GFP flags to migrate types Mel Gorman
2015-08-24 12:09   ` Mel Gorman
2015-08-25 14:36   ` Vlastimil Babka
2015-08-25 14:36     ` Vlastimil Babka
2015-08-24 12:09 ` [PATCH 07/12] mm, page_alloc: Distinguish between being unable to sleep, unwilling to sleep and avoiding waking kswapd Mel Gorman
2015-08-24 12:09   ` Mel Gorman
2015-08-24 18:29   ` Mel Gorman
2015-08-24 18:29     ` Mel Gorman
2015-08-25 15:37   ` Vlastimil Babka
2015-08-25 15:37     ` Vlastimil Babka
2015-08-26 14:45     ` Mel Gorman
2015-08-26 14:45       ` Mel Gorman
2015-08-26 16:24       ` Vlastimil Babka
2015-08-26 16:24         ` Vlastimil Babka
2015-08-26 18:10         ` Mel Gorman
2015-08-26 18:10           ` Mel Gorman
2015-08-27  9:18           ` Vlastimil Babka
2015-08-27  9:18             ` Vlastimil Babka
2015-08-25 15:48   ` Vlastimil Babka
2015-08-25 15:48     ` Vlastimil Babka
2015-08-26 13:05   ` Michal Hocko
2015-08-26 13:05     ` Michal Hocko
2015-09-08  6:49   ` Joonsoo Kim
2015-09-08  6:49     ` Joonsoo Kim
2015-09-09 12:22     ` Mel Gorman
2015-09-09 12:22       ` Mel Gorman
2015-09-18  6:25       ` Joonsoo Kim
2015-09-18  6:25         ` Joonsoo Kim
2015-08-24 12:09 ` [PATCH 08/12] mm, page_alloc: Rename __GFP_WAIT to __GFP_RECLAIM Mel Gorman
2015-08-24 12:09   ` Mel Gorman
2015-08-26 12:19   ` Vlastimil Babka
2015-08-26 12:19     ` Vlastimil Babka
2015-08-24 12:09 ` [PATCH 09/12] mm, page_alloc: Delete the zonelist_cache Mel Gorman
2015-08-24 12:09   ` Mel Gorman
2015-08-24 12:29 ` [PATCH 10/12] mm, page_alloc: Remove MIGRATE_RESERVE Mel Gorman
2015-08-24 12:29   ` Mel Gorman
2015-08-24 12:29 ` [PATCH 11/12] mm, page_alloc: Reserve pageblocks for high-order atomic allocations on demand Mel Gorman
2015-08-24 12:29   ` Mel Gorman
2015-08-26 12:44   ` Vlastimil Babka
2015-08-26 12:44     ` Vlastimil Babka
2015-08-26 14:53   ` Michal Hocko
2015-08-26 14:53     ` Michal Hocko
2015-08-26 15:38     ` Mel Gorman
2015-08-26 15:38       ` Mel Gorman
2015-09-08  8:01   ` Joonsoo Kim
2015-09-08  8:01     ` Joonsoo Kim
2015-09-09 12:32     ` Mel Gorman
2015-09-09 12:32       ` Mel Gorman
2015-09-18  6:38       ` Joonsoo Kim
2015-09-18  6:38         ` Joonsoo Kim
2015-09-21 10:51         ` Mel Gorman
2015-09-21 10:51           ` Mel Gorman
2015-08-24 12:30 ` [PATCH 12/12] mm, page_alloc: Only enforce watermarks for order-0 allocations Mel Gorman
2015-08-24 12:30   ` Mel Gorman
2015-08-26 13:42   ` Vlastimil Babka
2015-08-26 13:42     ` Vlastimil Babka
2015-08-26 14:53     ` Mel Gorman
2015-08-26 14:53       ` Mel Gorman
2015-08-28 12:10   ` Michal Hocko
2015-08-28 12:10     ` Michal Hocko
2015-08-28 14:12     ` Mel Gorman
2015-08-28 14:12       ` Mel Gorman
2015-09-08  8:26   ` Joonsoo Kim
2015-09-08  8:26     ` Joonsoo Kim
2015-09-09 12:39     ` Mel Gorman
2015-09-09 12:39       ` Mel Gorman
2015-09-18  6:56       ` Joonsoo Kim
2015-09-18  6:56         ` Joonsoo Kim
2015-09-21 10:51         ` Mel Gorman
2015-09-21 10:51           ` Mel Gorman
2015-09-30  8:51       ` Vitaly Wool
2015-09-30  8:51         ` Vitaly Wool
2015-09-30 13:52         ` Vlastimil Babka
2015-09-30 13:52           ` Vlastimil Babka
2015-09-30 14:16           ` Vitaly Wool
2015-09-30 14:16             ` Vitaly Wool
2015-09-30 14:43             ` Vlastimil Babka
2015-09-30 14:43               ` Vlastimil Babka
2015-09-30 15:18               ` Mel Gorman
2015-09-30 15:18                 ` Mel Gorman

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=55DB1015.4080103@suse.cz \
    --to=vbabka@suse.cz \
    --cc=akpm@linux-foundation.org \
    --cc=hannes@cmpxchg.org \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@techsingularity.net \
    --cc=mhocko@kernel.org \
    --cc=riel@redhat.com \
    --cc=rientjes@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.