linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [patch] mm, memcg: avoid unnecessary function call when memcg is disabled
@ 2012-11-20  1:44 David Rientjes
  2012-11-20  4:23 ` Kamezawa Hiroyuki
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: David Rientjes @ 2012-11-20  1:44 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Johannes Weiner, Michal Hocko, KAMEZAWA Hiroyuki, Hugh Dickins,
	linux-kernel, cgroups, linux-mm

While profiling numa/core v16 with cgroup_disable=memory on the command 
line, I noticed mem_cgroup_count_vm_event() still showed up as high as 
0.60% in perftop.

This occurs because the function is called extremely often even when memcg 
is disabled.

To fix this, inline the check for mem_cgroup_disabled() so we avoid the 
unnecessary function call if memcg is disabled.

Signed-off-by: David Rientjes <rientjes@google.com>
---
 include/linux/memcontrol.h |    9 ++++++++-
 mm/memcontrol.c            |    9 ++++-----
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -181,7 +181,14 @@ unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
 						gfp_t gfp_mask,
 						unsigned long *total_scanned);
 
-void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
+void __mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
+static inline void mem_cgroup_count_vm_event(struct mm_struct *mm,
+					     enum vm_event_item idx)
+{
+	if (mem_cgroup_disabled() || !mm)
+		return;
+	__mem_cgroup_count_vm_event(mm, idx);
+}
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
 void mem_cgroup_split_huge_fixup(struct page *head);
 #endif
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -59,6 +59,8 @@
 #include <trace/events/vmscan.h>
 
 struct cgroup_subsys mem_cgroup_subsys __read_mostly;
+EXPORT_SYMBOL(mem_cgroup_subsys);
+
 #define MEM_CGROUP_RECLAIM_RETRIES	5
 static struct mem_cgroup *root_mem_cgroup __read_mostly;
 
@@ -1015,13 +1017,10 @@ void mem_cgroup_iter_break(struct mem_cgroup *root,
 	     iter != NULL;				\
 	     iter = mem_cgroup_iter(NULL, iter, NULL))
 
-void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx)
+void __mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx)
 {
 	struct mem_cgroup *memcg;
 
-	if (!mm)
-		return;
-
 	rcu_read_lock();
 	memcg = mem_cgroup_from_task(rcu_dereference(mm->owner));
 	if (unlikely(!memcg))
@@ -1040,7 +1039,7 @@ void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx)
 out:
 	rcu_read_unlock();
 }
-EXPORT_SYMBOL(mem_cgroup_count_vm_event);
+EXPORT_SYMBOL(__mem_cgroup_count_vm_event);
 
 /**
  * mem_cgroup_zone_lruvec - get the lru list vector for a zone and memcg

--
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>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] mm, memcg: avoid unnecessary function call when memcg is disabled
  2012-11-20  1:44 [patch] mm, memcg: avoid unnecessary function call when memcg is disabled David Rientjes
@ 2012-11-20  4:23 ` Kamezawa Hiroyuki
  2012-11-20  8:34   ` Glauber Costa
  2012-11-20  7:07 ` Michal Hocko
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 12+ messages in thread
From: Kamezawa Hiroyuki @ 2012-11-20  4:23 UTC (permalink / raw)
  To: David Rientjes
  Cc: Andrew Morton, Johannes Weiner, Michal Hocko, Hugh Dickins,
	linux-kernel, cgroups, linux-mm

(2012/11/20 10:44), David Rientjes wrote:
> While profiling numa/core v16 with cgroup_disable=memory on the command
> line, I noticed mem_cgroup_count_vm_event() still showed up as high as
> 0.60% in perftop.
>
> This occurs because the function is called extremely often even when memcg
> is disabled.
>
> To fix this, inline the check for mem_cgroup_disabled() so we avoid the
> unnecessary function call if memcg is disabled.
>
> Signed-off-by: David Rientjes <rientjes@google.com>

Acked-By: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>



--
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>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] mm, memcg: avoid unnecessary function call when memcg is disabled
  2012-11-20  1:44 [patch] mm, memcg: avoid unnecessary function call when memcg is disabled David Rientjes
  2012-11-20  4:23 ` Kamezawa Hiroyuki
@ 2012-11-20  7:07 ` Michal Hocko
  2012-11-20 17:27 ` Johannes Weiner
  2012-11-20 21:49 ` Andrew Morton
  3 siblings, 0 replies; 12+ messages in thread
From: Michal Hocko @ 2012-11-20  7:07 UTC (permalink / raw)
  To: David Rientjes
  Cc: Andrew Morton, Johannes Weiner, KAMEZAWA Hiroyuki, Hugh Dickins,
	linux-kernel, cgroups, linux-mm

On Mon 19-11-12 17:44:34, David Rientjes wrote:
> While profiling numa/core v16 with cgroup_disable=memory on the command 
> line, I noticed mem_cgroup_count_vm_event() still showed up as high as 
> 0.60% in perftop.
> 
> This occurs because the function is called extremely often even when memcg 
> is disabled.
> 
> To fix this, inline the check for mem_cgroup_disabled() so we avoid the 
> unnecessary function call if memcg is disabled.
> 
> Signed-off-by: David Rientjes <rientjes@google.com>

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

Thanks!

> ---
>  include/linux/memcontrol.h |    9 ++++++++-
>  mm/memcontrol.c            |    9 ++++-----
>  2 files changed, 12 insertions(+), 6 deletions(-)
> 
> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> --- a/include/linux/memcontrol.h
> +++ b/include/linux/memcontrol.h
> @@ -181,7 +181,14 @@ unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
>  						gfp_t gfp_mask,
>  						unsigned long *total_scanned);
>  
> -void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
> +void __mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
> +static inline void mem_cgroup_count_vm_event(struct mm_struct *mm,
> +					     enum vm_event_item idx)
> +{
> +	if (mem_cgroup_disabled() || !mm)
> +		return;
> +	__mem_cgroup_count_vm_event(mm, idx);
> +}
>  #ifdef CONFIG_TRANSPARENT_HUGEPAGE
>  void mem_cgroup_split_huge_fixup(struct page *head);
>  #endif
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -59,6 +59,8 @@
>  #include <trace/events/vmscan.h>
>  
>  struct cgroup_subsys mem_cgroup_subsys __read_mostly;
> +EXPORT_SYMBOL(mem_cgroup_subsys);
> +
>  #define MEM_CGROUP_RECLAIM_RETRIES	5
>  static struct mem_cgroup *root_mem_cgroup __read_mostly;
>  
> @@ -1015,13 +1017,10 @@ void mem_cgroup_iter_break(struct mem_cgroup *root,
>  	     iter != NULL;				\
>  	     iter = mem_cgroup_iter(NULL, iter, NULL))
>  
> -void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx)
> +void __mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx)
>  {
>  	struct mem_cgroup *memcg;
>  
> -	if (!mm)
> -		return;
> -
>  	rcu_read_lock();
>  	memcg = mem_cgroup_from_task(rcu_dereference(mm->owner));
>  	if (unlikely(!memcg))
> @@ -1040,7 +1039,7 @@ void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx)
>  out:
>  	rcu_read_unlock();
>  }
> -EXPORT_SYMBOL(mem_cgroup_count_vm_event);
> +EXPORT_SYMBOL(__mem_cgroup_count_vm_event);
>  
>  /**
>   * mem_cgroup_zone_lruvec - get the lru list vector for a zone and memcg
> --
> To unsubscribe from this list: send the line "unsubscribe cgroups" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Michal Hocko
SUSE Labs

--
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>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] mm, memcg: avoid unnecessary function call when memcg is disabled
  2012-11-20  4:23 ` Kamezawa Hiroyuki
@ 2012-11-20  8:34   ` Glauber Costa
  0 siblings, 0 replies; 12+ messages in thread
From: Glauber Costa @ 2012-11-20  8:34 UTC (permalink / raw)
  To: Kamezawa Hiroyuki
  Cc: David Rientjes, Andrew Morton, Johannes Weiner, Michal Hocko,
	Hugh Dickins, linux-kernel, cgroups, linux-mm

On 11/20/2012 08:23 AM, Kamezawa Hiroyuki wrote:
> (2012/11/20 10:44), David Rientjes wrote:
>> While profiling numa/core v16 with cgroup_disable=memory on the command
>> line, I noticed mem_cgroup_count_vm_event() still showed up as high as
>> 0.60% in perftop.
>>
>> This occurs because the function is called extremely often even when
>> memcg
>> is disabled.
>>
>> To fix this, inline the check for mem_cgroup_disabled() so we avoid the
>> unnecessary function call if memcg is disabled.
>>
>> Signed-off-by: David Rientjes <rientjes@google.com>
> 
> Acked-By: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
> 
I am fine with this as well.

Acked-by: Glauber Costa <glommer@parallels.com>

--
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>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] mm, memcg: avoid unnecessary function call when memcg is disabled
  2012-11-20  1:44 [patch] mm, memcg: avoid unnecessary function call when memcg is disabled David Rientjes
  2012-11-20  4:23 ` Kamezawa Hiroyuki
  2012-11-20  7:07 ` Michal Hocko
@ 2012-11-20 17:27 ` Johannes Weiner
  2012-11-20 21:49 ` Andrew Morton
  3 siblings, 0 replies; 12+ messages in thread
From: Johannes Weiner @ 2012-11-20 17:27 UTC (permalink / raw)
  To: David Rientjes
  Cc: Andrew Morton, Michal Hocko, KAMEZAWA Hiroyuki, Hugh Dickins,
	linux-kernel, cgroups, linux-mm

On Mon, Nov 19, 2012 at 05:44:34PM -0800, David Rientjes wrote:
> While profiling numa/core v16 with cgroup_disable=memory on the command 
> line, I noticed mem_cgroup_count_vm_event() still showed up as high as 
> 0.60% in perftop.
> 
> This occurs because the function is called extremely often even when memcg 
> is disabled.
> 
> To fix this, inline the check for mem_cgroup_disabled() so we avoid the 
> unnecessary function call if memcg is disabled.
> 
> Signed-off-by: David Rientjes <rientjes@google.com>

Acked-by: Johannes Weiner <hannes@cmpxchg.org>

--
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>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] mm, memcg: avoid unnecessary function call when memcg is disabled
  2012-11-20  1:44 [patch] mm, memcg: avoid unnecessary function call when memcg is disabled David Rientjes
                   ` (2 preceding siblings ...)
  2012-11-20 17:27 ` Johannes Weiner
@ 2012-11-20 21:49 ` Andrew Morton
  2012-11-21  1:02   ` Kamezawa Hiroyuki
  2012-11-21  8:35   ` [patch] mm, memcg: avoid unnecessary function call when memcg is disabled Michal Hocko
  3 siblings, 2 replies; 12+ messages in thread
From: Andrew Morton @ 2012-11-20 21:49 UTC (permalink / raw)
  To: David Rientjes
  Cc: Johannes Weiner, Michal Hocko, KAMEZAWA Hiroyuki, Hugh Dickins,
	linux-kernel, cgroups, linux-mm

On Mon, 19 Nov 2012 17:44:34 -0800 (PST)
David Rientjes <rientjes@google.com> wrote:

> While profiling numa/core v16 with cgroup_disable=memory on the command 
> line, I noticed mem_cgroup_count_vm_event() still showed up as high as 
> 0.60% in perftop.
> 
> This occurs because the function is called extremely often even when memcg 
> is disabled.
> 
> To fix this, inline the check for mem_cgroup_disabled() so we avoid the 
> unnecessary function call if memcg is disabled.
> 
> ...
>
> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> --- a/include/linux/memcontrol.h
> +++ b/include/linux/memcontrol.h
> @@ -181,7 +181,14 @@ unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
>  						gfp_t gfp_mask,
>  						unsigned long *total_scanned);
>  
> -void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
> +void __mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
> +static inline void mem_cgroup_count_vm_event(struct mm_struct *mm,
> +					     enum vm_event_item idx)
> +{
> +	if (mem_cgroup_disabled() || !mm)
> +		return;
> +	__mem_cgroup_count_vm_event(mm, idx);
> +}

Does the !mm case occur frequently enough to justify inlining it, or
should that test remain out-of-line?

--
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>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] mm, memcg: avoid unnecessary function call when memcg is disabled
  2012-11-20 21:49 ` Andrew Morton
@ 2012-11-21  1:02   ` Kamezawa Hiroyuki
  2012-11-21  2:48     ` [patch] mm, memcg: avoid unnecessary function call when memcg is disabled fix David Rientjes
  2012-11-21  8:35   ` [patch] mm, memcg: avoid unnecessary function call when memcg is disabled Michal Hocko
  1 sibling, 1 reply; 12+ messages in thread
From: Kamezawa Hiroyuki @ 2012-11-21  1:02 UTC (permalink / raw)
  To: Andrew Morton
  Cc: David Rientjes, Johannes Weiner, Michal Hocko, Hugh Dickins,
	linux-kernel, cgroups, linux-mm

(2012/11/21 6:49), Andrew Morton wrote:
> On Mon, 19 Nov 2012 17:44:34 -0800 (PST)
> David Rientjes <rientjes@google.com> wrote:
>
>> While profiling numa/core v16 with cgroup_disable=memory on the command
>> line, I noticed mem_cgroup_count_vm_event() still showed up as high as
>> 0.60% in perftop.
>>
>> This occurs because the function is called extremely often even when memcg
>> is disabled.
>>
>> To fix this, inline the check for mem_cgroup_disabled() so we avoid the
>> unnecessary function call if memcg is disabled.
>>
>> ...
>>
>> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
>> --- a/include/linux/memcontrol.h
>> +++ b/include/linux/memcontrol.h
>> @@ -181,7 +181,14 @@ unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
>>   						gfp_t gfp_mask,
>>   						unsigned long *total_scanned);
>>
>> -void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
>> +void __mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
>> +static inline void mem_cgroup_count_vm_event(struct mm_struct *mm,
>> +					     enum vm_event_item idx)
>> +{
>> +	if (mem_cgroup_disabled() || !mm)
>> +		return;
>> +	__mem_cgroup_count_vm_event(mm, idx);
>> +}
>
> Does the !mm case occur frequently enough to justify inlining it, or
> should that test remain out-of-line?
>
I think this should be out-of-line.

Thanks,
-Kame

--
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>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [patch] mm, memcg: avoid unnecessary function call when memcg is disabled fix
  2012-11-21  1:02   ` Kamezawa Hiroyuki
@ 2012-11-21  2:48     ` David Rientjes
  2012-11-21  4:11       ` Kamezawa Hiroyuki
  0 siblings, 1 reply; 12+ messages in thread
From: David Rientjes @ 2012-11-21  2:48 UTC (permalink / raw)
  To: Kamezawa Hiroyuki, Andrew Morton
  Cc: Johannes Weiner, Michal Hocko, Hugh Dickins, linux-kernel,
	cgroups, linux-mm

Move the check for !mm out of line as suggested by Andrew.

Signed-off-by: David Rientjes <rientjes@google.com>
---
 include/linux/memcontrol.h |    2 +-
 mm/memcontrol.c            |    3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -185,7 +185,7 @@ void __mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
 static inline void mem_cgroup_count_vm_event(struct mm_struct *mm,
 					     enum vm_event_item idx)
 {
-	if (mem_cgroup_disabled() || !mm)
+	if (mem_cgroup_disabled())
 		return;
 	__mem_cgroup_count_vm_event(mm, idx);
 }
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -1021,6 +1021,9 @@ void __mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx)
 {
 	struct mem_cgroup *memcg;
 
+	if (!mm)
+		return;
+
 	rcu_read_lock();
 	memcg = mem_cgroup_from_task(rcu_dereference(mm->owner));
 	if (unlikely(!memcg))

--
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>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] mm, memcg: avoid unnecessary function call when memcg is disabled fix
  2012-11-21  2:48     ` [patch] mm, memcg: avoid unnecessary function call when memcg is disabled fix David Rientjes
@ 2012-11-21  4:11       ` Kamezawa Hiroyuki
  0 siblings, 0 replies; 12+ messages in thread
From: Kamezawa Hiroyuki @ 2012-11-21  4:11 UTC (permalink / raw)
  To: David Rientjes
  Cc: Andrew Morton, Johannes Weiner, Michal Hocko, Hugh Dickins,
	linux-kernel, cgroups, linux-mm

(2012/11/21 11:48), David Rientjes wrote:
> Move the check for !mm out of line as suggested by Andrew.
>
> Signed-off-by: David Rientjes <rientjes@google.com>

Thank you very much !

Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>


> ---
>   include/linux/memcontrol.h |    2 +-
>   mm/memcontrol.c            |    3 +++
>   2 files changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> --- a/include/linux/memcontrol.h
> +++ b/include/linux/memcontrol.h
> @@ -185,7 +185,7 @@ void __mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
>   static inline void mem_cgroup_count_vm_event(struct mm_struct *mm,
>   					     enum vm_event_item idx)
>   {
> -	if (mem_cgroup_disabled() || !mm)
> +	if (mem_cgroup_disabled())
>   		return;
>   	__mem_cgroup_count_vm_event(mm, idx);
>   }
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -1021,6 +1021,9 @@ void __mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx)
>   {
>   	struct mem_cgroup *memcg;
>
> +	if (!mm)
> +		return;
> +
>   	rcu_read_lock();
>   	memcg = mem_cgroup_from_task(rcu_dereference(mm->owner));
>   	if (unlikely(!memcg))
>


--
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>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] mm, memcg: avoid unnecessary function call when memcg is disabled
  2012-11-20 21:49 ` Andrew Morton
  2012-11-21  1:02   ` Kamezawa Hiroyuki
@ 2012-11-21  8:35   ` Michal Hocko
  2012-11-28 23:29     ` Hugh Dickins
  1 sibling, 1 reply; 12+ messages in thread
From: Michal Hocko @ 2012-11-21  8:35 UTC (permalink / raw)
  To: Andrew Morton, Ying Han
  Cc: David Rientjes, Johannes Weiner, KAMEZAWA Hiroyuki, Hugh Dickins,
	linux-kernel, cgroups, linux-mm

On Tue 20-11-12 13:49:32, Andrew Morton wrote:
> On Mon, 19 Nov 2012 17:44:34 -0800 (PST)
> David Rientjes <rientjes@google.com> wrote:
> 
> > While profiling numa/core v16 with cgroup_disable=memory on the command 
> > line, I noticed mem_cgroup_count_vm_event() still showed up as high as 
> > 0.60% in perftop.
> > 
> > This occurs because the function is called extremely often even when memcg 
> > is disabled.
> > 
> > To fix this, inline the check for mem_cgroup_disabled() so we avoid the 
> > unnecessary function call if memcg is disabled.
> > 
> > ...
> >
> > diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> > --- a/include/linux/memcontrol.h
> > +++ b/include/linux/memcontrol.h
> > @@ -181,7 +181,14 @@ unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
> >  						gfp_t gfp_mask,
> >  						unsigned long *total_scanned);
> >  
> > -void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
> > +void __mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
> > +static inline void mem_cgroup_count_vm_event(struct mm_struct *mm,
> > +					     enum vm_event_item idx)
> > +{
> > +	if (mem_cgroup_disabled() || !mm)
> > +		return;
> > +	__mem_cgroup_count_vm_event(mm, idx);
> > +}
> 
> Does the !mm case occur frequently enough to justify inlining it, or
> should that test remain out-of-line?

Now that you've asked about it I started looking around and I cannot see
how mm can ever be NULL. The condition is there since the very beginning
(456f998e memcg: add the pagefault count into memcg stats) but all the
callers are page fault handlers and those shouldn't have mm==NULL.
Or is there anything obvious I am missing?

Ying, the whole thread starts https://lkml.org/lkml/2012/11/19/545 but
the primary question is why we need !mm test for mem_cgroup_count_vm_event
at all.

Thanks!
-- 
Michal Hocko
SUSE Labs

--
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>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] mm, memcg: avoid unnecessary function call when memcg is disabled
  2012-11-21  8:35   ` [patch] mm, memcg: avoid unnecessary function call when memcg is disabled Michal Hocko
@ 2012-11-28 23:29     ` Hugh Dickins
  2012-11-29 13:28       ` [PATCH] memcg: do not check for mm in mem_cgroup_count_vm_event disabled Michal Hocko
  0 siblings, 1 reply; 12+ messages in thread
From: Hugh Dickins @ 2012-11-28 23:29 UTC (permalink / raw)
  To: Michal Hocko
  Cc: Andrew Morton, Ying Han, David Rientjes, Johannes Weiner,
	KAMEZAWA Hiroyuki, linux-kernel, cgroups, linux-mm

On Wed, 21 Nov 2012, Michal Hocko wrote:
> On Tue 20-11-12 13:49:32, Andrew Morton wrote:
> > On Mon, 19 Nov 2012 17:44:34 -0800 (PST)
> > David Rientjes <rientjes@google.com> wrote:
> > 
> > > While profiling numa/core v16 with cgroup_disable=memory on the command 
> > > line, I noticed mem_cgroup_count_vm_event() still showed up as high as 
> > > 0.60% in perftop.
> > > 
> > > This occurs because the function is called extremely often even when memcg 
> > > is disabled.
> > > 
> > > To fix this, inline the check for mem_cgroup_disabled() so we avoid the 
> > > unnecessary function call if memcg is disabled.
> > > 
> > > ...
> > >
> > > diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> > > --- a/include/linux/memcontrol.h
> > > +++ b/include/linux/memcontrol.h
> > > @@ -181,7 +181,14 @@ unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
> > >  						gfp_t gfp_mask,
> > >  						unsigned long *total_scanned);
> > >  
> > > -void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
> > > +void __mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
> > > +static inline void mem_cgroup_count_vm_event(struct mm_struct *mm,
> > > +					     enum vm_event_item idx)
> > > +{
> > > +	if (mem_cgroup_disabled() || !mm)
> > > +		return;
> > > +	__mem_cgroup_count_vm_event(mm, idx);
> > > +}
> > 
> > Does the !mm case occur frequently enough to justify inlining it, or
> > should that test remain out-of-line?
> 
> Now that you've asked about it I started looking around and I cannot see
> how mm can ever be NULL. The condition is there since the very beginning
> (456f998e memcg: add the pagefault count into memcg stats) but all the
> callers are page fault handlers and those shouldn't have mm==NULL.
> Or is there anything obvious I am missing?
> 
> Ying, the whole thread starts https://lkml.org/lkml/2012/11/19/545 but
> the primary question is why we need !mm test for mem_cgroup_count_vm_event
> at all.

Here's a guess: as Ying's 456f998e patch started out in akpm's tree,
shmem.c was calling mem_cgroup_count_vm_event(current->mm, PGMAJFAULT).

Then I insisted that was inconsistent with how we usually account when
one task touches another's address space, and rearranged it to work on
vma->vm_mm instead.

Done the original way, if the touching task were a kernel daemon (KSM's
ksmd comes to my mind), then the current->mm could well have been NULL.

I agree with you that it looks redundant now.

Hugh

--
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>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH] memcg: do not check for mm in mem_cgroup_count_vm_event disabled
  2012-11-28 23:29     ` Hugh Dickins
@ 2012-11-29 13:28       ` Michal Hocko
  0 siblings, 0 replies; 12+ messages in thread
From: Michal Hocko @ 2012-11-29 13:28 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Hugh Dickins, Ying Han, David Rientjes, Johannes Weiner,
	KAMEZAWA Hiroyuki, linux-kernel, cgroups, linux-mm

On Wed 28-11-12 15:29:30, Hugh Dickins wrote:
> On Wed, 21 Nov 2012, Michal Hocko wrote:
> > On Tue 20-11-12 13:49:32, Andrew Morton wrote:
> > > On Mon, 19 Nov 2012 17:44:34 -0800 (PST)
> > > David Rientjes <rientjes@google.com> wrote:
[...]
> > > > -void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
> > > > +void __mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
> > > > +static inline void mem_cgroup_count_vm_event(struct mm_struct *mm,
> > > > +					     enum vm_event_item idx)
> > > > +{
> > > > +	if (mem_cgroup_disabled() || !mm)
> > > > +		return;
> > > > +	__mem_cgroup_count_vm_event(mm, idx);
> > > > +}
> > > 
> > > Does the !mm case occur frequently enough to justify inlining it, or
> > > should that test remain out-of-line?
> > 
> > Now that you've asked about it I started looking around and I cannot see
> > how mm can ever be NULL. The condition is there since the very beginning
> > (456f998e memcg: add the pagefault count into memcg stats) but all the
> > callers are page fault handlers and those shouldn't have mm==NULL.
> > Or is there anything obvious I am missing?
> > 
> > Ying, the whole thread starts https://lkml.org/lkml/2012/11/19/545 but
> > the primary question is why we need !mm test for mem_cgroup_count_vm_event
> > at all.
> 
> Here's a guess: as Ying's 456f998e patch started out in akpm's tree,
> shmem.c was calling mem_cgroup_count_vm_event(current->mm, PGMAJFAULT).
> 
> Then I insisted that was inconsistent with how we usually account when
> one task touches another's address space, and rearranged it to work on
> vma->vm_mm instead.

Thanks Hugh!
 
> Done the original way, if the touching task were a kernel daemon (KSM's
> ksmd comes to my mind), then the current->mm could well have been NULL.
> 
> I agree with you that it looks redundant now.

Andrew could you please pick this up?
---

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2012-11-29 13:29 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-20  1:44 [patch] mm, memcg: avoid unnecessary function call when memcg is disabled David Rientjes
2012-11-20  4:23 ` Kamezawa Hiroyuki
2012-11-20  8:34   ` Glauber Costa
2012-11-20  7:07 ` Michal Hocko
2012-11-20 17:27 ` Johannes Weiner
2012-11-20 21:49 ` Andrew Morton
2012-11-21  1:02   ` Kamezawa Hiroyuki
2012-11-21  2:48     ` [patch] mm, memcg: avoid unnecessary function call when memcg is disabled fix David Rientjes
2012-11-21  4:11       ` Kamezawa Hiroyuki
2012-11-21  8:35   ` [patch] mm, memcg: avoid unnecessary function call when memcg is disabled Michal Hocko
2012-11-28 23:29     ` Hugh Dickins
2012-11-29 13:28       ` [PATCH] memcg: do not check for mm in mem_cgroup_count_vm_event disabled Michal Hocko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).