All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wu Fengguang <fengguang.wu@intel.com>
To: Andrew Morton <akpm@linux-foundation.org>
To: Ingo Molnar <mingo@elte.hu>
Cc: Mel Gorman <mgorman@suse.de>,
	Balbir Singh <balbir@linux.vnet.ibm.com>,
	Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
	Wu Fengguang <fengguang.wu@intel.com>
Cc: Linux Memory Management List <linux-mm@kvack.org>
Cc: LKML <linux-kernel@vger.kernel.org>
Subject: [RFC][PATCH 7/7] tracing/mm: add memcg field
Date: Mon, 29 Aug 2011 11:29:58 +0800	[thread overview]
Message-ID: <20110829034932.531048150@intel.com> (raw)
In-Reply-To: 20110829032951.677220552@intel.com

[-- Attachment #1: memcg-page-id.patch --]
[-- Type: text/plain, Size: 5628 bytes --]

Dump the memcg id associated with a pagecache page.

The downside is, the page_memcg_id() is a pretty heavy weight function
that needs to lock/unlock the page..

CC: Balbir Singh <balbir@linux.vnet.ibm.com>
CC: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
CC: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
---
 include/linux/memcontrol.h |    6 ++++++
 include/trace/events/mm.h  |   16 +++++++++++-----
 kernel/trace/trace_mm.c    |   12 +++++++++---
 mm/memcontrol.c            |   18 ++++++++++++++++++
 4 files changed, 44 insertions(+), 8 deletions(-)

--- linux-mmotm.orig/include/linux/memcontrol.h	2011-08-29 10:55:48.000000000 +0800
+++ linux-mmotm/include/linux/memcontrol.h	2011-08-29 10:55:53.000000000 +0800
@@ -91,6 +91,7 @@ extern void mem_cgroup_uncharge_cache_pa
 extern void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask);
 int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *memcg);
 
+extern unsigned short page_memcg_id(struct page *page);
 extern struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page);
 extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p);
 extern struct mem_cgroup *try_get_mem_cgroup_from_mm(struct mm_struct *mm);
@@ -199,6 +200,11 @@ static inline int mem_cgroup_try_charge_
 	return 0;
 }
 
+static inline unsigned short page_memcg_id(struct page *page)
+{
+	return 0;
+}
+
 static inline void mem_cgroup_commit_charge_swapin(struct page *page,
 					  struct mem_cgroup *ptr)
 {
--- linux-mmotm.orig/mm/memcontrol.c	2011-08-29 10:55:48.000000000 +0800
+++ linux-mmotm/mm/memcontrol.c	2011-08-29 10:59:28.000000000 +0800
@@ -591,6 +591,24 @@ mem_cgroup_largest_soft_limit_node(struc
 	return mz;
 }
 
+unsigned short page_memcg_id(struct page *page)
+{
+	struct mem_cgroup *memcg;
+	struct cgroup_subsys_state *css;
+	unsigned short id = 0;
+
+	lock_page(page);
+	memcg = try_get_mem_cgroup_from_page(page);
+	if (memcg) {
+		css = mem_cgroup_css(memcg);
+		id = css_id(css);
+		css_put(css);
+	}
+	unlock_page(page);
+
+	return id;
+}
+
 /*
  * Implementation Note: reading percpu statistics for memcg.
  *
--- linux-mmotm.orig/include/trace/events/mm.h	2011-08-29 10:55:52.000000000 +0800
+++ linux-mmotm/include/trace/events/mm.h	2011-08-29 10:55:53.000000000 +0800
@@ -34,6 +34,7 @@ TRACE_EVENT(dump_page_frame,
 		__field(	unsigned long,	flags		)
 		__field(	unsigned int,	count		)
 		__field(	unsigned int,	mapcount	)
+		__field(	unsigned int,	memcg		)
 		__field(	unsigned long,	private		)
 		__field(	unsigned long,	mapping		)
 		__field(	unsigned long,	index		)
@@ -46,17 +47,19 @@ TRACE_EVENT(dump_page_frame,
 		__entry->flags		= page->flags;
 		__entry->count		= atomic_read(&page->_count);
 		__entry->mapcount	= page_mapcount(page);
+		__entry->memcg		= page_memcg_id(page);
 		__entry->private	= page->private;
 		__entry->mapping	= (unsigned long)page->mapping;
 		__entry->index		= page->index;
 	),
 
 	TP_printk("pfn=%lu page=%p count=%u mapcount=%u "
-		  "private=%lx mapping=%lx index=%lx flags=%s",
+		  "memcg=%u private=%lx mapping=%lx index=%lx flags=%s",
 		  __entry->pfn,
 		  __entry->page,
 		  __entry->count,
 		  __entry->mapcount,
+		  __entry->memcg,
 		  __entry->private,
 		  __entry->mapping,
 		  __entry->index,
@@ -68,9 +71,9 @@ TRACE_EVENT(dump_page_frame,
 
 TRACE_EVENT(dump_page_cache,
 
-	TP_PROTO(struct page *page, unsigned long len),
+	TP_PROTO(struct page *page, unsigned long len, unsigned int memcg),
 
-	TP_ARGS(page, len),
+	TP_ARGS(page, len, memcg),
 
 	TP_STRUCT__entry(
 		__field(	unsigned long,	index		)
@@ -78,6 +81,7 @@ TRACE_EVENT(dump_page_cache,
 		__field(	u64,		flags		)
 		__field(	unsigned int,	count		)
 		__field(	unsigned int,	mapcount	)
+		__field(	unsigned int,	memcg		)
 	),
 
 	TP_fast_assign(
@@ -86,10 +90,11 @@ TRACE_EVENT(dump_page_cache,
 		__entry->flags		= stable_page_flags(page);
 		__entry->count		= atomic_read(&page->_count);
 		__entry->mapcount	= page_mapcount(page);
+		__entry->memcg		= memcg;
 	),
 
 	TP_printk("index=%lu len=%lu flags=%c%c%c%c%c%c%c%c%c%c%c "
-		  "count=%u mapcount=%u",
+		  "count=%u mapcount=%u memcg=%u",
 		  __entry->index,
 		  __entry->len,
 		  __entry->flags & (1ULL << KPF_MMAP)		? 'M' : '_',
@@ -104,7 +109,8 @@ TRACE_EVENT(dump_page_cache,
 		  __entry->flags & (1ULL << KPF_MAPPEDTODISK)	? 'd' : '_',
 		  __entry->flags & (1ULL << KPF_PRIVATE)	? 'P' : '_',
 		  __entry->count,
-		  __entry->mapcount)
+		  __entry->mapcount,
+		  __entry->memcg)
 );
 
 
--- linux-mmotm.orig/kernel/trace/trace_mm.c	2011-08-29 10:56:02.000000000 +0800
+++ linux-mmotm/kernel/trace/trace_mm.c	2011-08-29 11:01:04.000000000 +0800
@@ -155,6 +155,8 @@ static void dump_pagecache(struct addres
 	struct page *page;
 	unsigned long start = 0;
 	unsigned long len = 0;
+	unsigned int memcg0;
+	unsigned int memcg;
 	int i;
 
 	for (;;) {
@@ -165,23 +167,27 @@ static void dump_pagecache(struct addres
 
 		if (nr_pages == 0) {
 			if (len)
-				trace_dump_page_cache(page0, len);
+				trace_dump_page_cache(page0, len, memcg0);
 			return;
 		}
 
 		for (i = 0; i < nr_pages; i++) {
 			page = pages[i];
+			memcg = page_memcg_id(page);
 
 			if (len &&
 			    page->index == start + len &&
-			    pages_similar(page0, page))
+			    pages_similar(page0, page) &&
+			    memcg0 == memcg)
 				len++;
 			else {
 				if (len)
-					trace_dump_page_cache(page0, len);
+					trace_dump_page_cache(page0, len,
+							      memcg0);
 				page0 = page;
 				start = page->index;
 				len = 1;
+				memcg0 = memcg;
 			}
 		}
 		cond_resched();



WARNING: multiple messages have this Message-ID (diff)
From: Wu Fengguang <fengguang.wu@intel.com>
To: Andrew Morton <akpm@linux-foundation.org>, Ingo Molnar <mingo@elte.hu>
Cc: Mel Gorman <mgorman@suse.de>,
	Balbir Singh <balbir@linux.vnet.ibm.com>,
	Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
	Wu Fengguang <fengguang.wu@intel.com>,
	Linux Memory Management List <linux-mm@kvack.org>,
	LKML <linux-kernel@vger.kernel.org>
Subject: [RFC][PATCH 7/7] tracing/mm: add memcg field
Date: Mon, 29 Aug 2011 11:29:58 +0800	[thread overview]
Message-ID: <20110829034932.531048150@intel.com> (raw)
In-Reply-To: 20110829032951.677220552@intel.com

[-- Attachment #1: memcg-page-id.patch --]
[-- Type: text/plain, Size: 5931 bytes --]

Dump the memcg id associated with a pagecache page.

The downside is, the page_memcg_id() is a pretty heavy weight function
that needs to lock/unlock the page..

CC: Balbir Singh <balbir@linux.vnet.ibm.com>
CC: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
CC: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
---
 include/linux/memcontrol.h |    6 ++++++
 include/trace/events/mm.h  |   16 +++++++++++-----
 kernel/trace/trace_mm.c    |   12 +++++++++---
 mm/memcontrol.c            |   18 ++++++++++++++++++
 4 files changed, 44 insertions(+), 8 deletions(-)

--- linux-mmotm.orig/include/linux/memcontrol.h	2011-08-29 10:55:48.000000000 +0800
+++ linux-mmotm/include/linux/memcontrol.h	2011-08-29 10:55:53.000000000 +0800
@@ -91,6 +91,7 @@ extern void mem_cgroup_uncharge_cache_pa
 extern void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask);
 int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *memcg);
 
+extern unsigned short page_memcg_id(struct page *page);
 extern struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page);
 extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p);
 extern struct mem_cgroup *try_get_mem_cgroup_from_mm(struct mm_struct *mm);
@@ -199,6 +200,11 @@ static inline int mem_cgroup_try_charge_
 	return 0;
 }
 
+static inline unsigned short page_memcg_id(struct page *page)
+{
+	return 0;
+}
+
 static inline void mem_cgroup_commit_charge_swapin(struct page *page,
 					  struct mem_cgroup *ptr)
 {
--- linux-mmotm.orig/mm/memcontrol.c	2011-08-29 10:55:48.000000000 +0800
+++ linux-mmotm/mm/memcontrol.c	2011-08-29 10:59:28.000000000 +0800
@@ -591,6 +591,24 @@ mem_cgroup_largest_soft_limit_node(struc
 	return mz;
 }
 
+unsigned short page_memcg_id(struct page *page)
+{
+	struct mem_cgroup *memcg;
+	struct cgroup_subsys_state *css;
+	unsigned short id = 0;
+
+	lock_page(page);
+	memcg = try_get_mem_cgroup_from_page(page);
+	if (memcg) {
+		css = mem_cgroup_css(memcg);
+		id = css_id(css);
+		css_put(css);
+	}
+	unlock_page(page);
+
+	return id;
+}
+
 /*
  * Implementation Note: reading percpu statistics for memcg.
  *
--- linux-mmotm.orig/include/trace/events/mm.h	2011-08-29 10:55:52.000000000 +0800
+++ linux-mmotm/include/trace/events/mm.h	2011-08-29 10:55:53.000000000 +0800
@@ -34,6 +34,7 @@ TRACE_EVENT(dump_page_frame,
 		__field(	unsigned long,	flags		)
 		__field(	unsigned int,	count		)
 		__field(	unsigned int,	mapcount	)
+		__field(	unsigned int,	memcg		)
 		__field(	unsigned long,	private		)
 		__field(	unsigned long,	mapping		)
 		__field(	unsigned long,	index		)
@@ -46,17 +47,19 @@ TRACE_EVENT(dump_page_frame,
 		__entry->flags		= page->flags;
 		__entry->count		= atomic_read(&page->_count);
 		__entry->mapcount	= page_mapcount(page);
+		__entry->memcg		= page_memcg_id(page);
 		__entry->private	= page->private;
 		__entry->mapping	= (unsigned long)page->mapping;
 		__entry->index		= page->index;
 	),
 
 	TP_printk("pfn=%lu page=%p count=%u mapcount=%u "
-		  "private=%lx mapping=%lx index=%lx flags=%s",
+		  "memcg=%u private=%lx mapping=%lx index=%lx flags=%s",
 		  __entry->pfn,
 		  __entry->page,
 		  __entry->count,
 		  __entry->mapcount,
+		  __entry->memcg,
 		  __entry->private,
 		  __entry->mapping,
 		  __entry->index,
@@ -68,9 +71,9 @@ TRACE_EVENT(dump_page_frame,
 
 TRACE_EVENT(dump_page_cache,
 
-	TP_PROTO(struct page *page, unsigned long len),
+	TP_PROTO(struct page *page, unsigned long len, unsigned int memcg),
 
-	TP_ARGS(page, len),
+	TP_ARGS(page, len, memcg),
 
 	TP_STRUCT__entry(
 		__field(	unsigned long,	index		)
@@ -78,6 +81,7 @@ TRACE_EVENT(dump_page_cache,
 		__field(	u64,		flags		)
 		__field(	unsigned int,	count		)
 		__field(	unsigned int,	mapcount	)
+		__field(	unsigned int,	memcg		)
 	),
 
 	TP_fast_assign(
@@ -86,10 +90,11 @@ TRACE_EVENT(dump_page_cache,
 		__entry->flags		= stable_page_flags(page);
 		__entry->count		= atomic_read(&page->_count);
 		__entry->mapcount	= page_mapcount(page);
+		__entry->memcg		= memcg;
 	),
 
 	TP_printk("index=%lu len=%lu flags=%c%c%c%c%c%c%c%c%c%c%c "
-		  "count=%u mapcount=%u",
+		  "count=%u mapcount=%u memcg=%u",
 		  __entry->index,
 		  __entry->len,
 		  __entry->flags & (1ULL << KPF_MMAP)		? 'M' : '_',
@@ -104,7 +109,8 @@ TRACE_EVENT(dump_page_cache,
 		  __entry->flags & (1ULL << KPF_MAPPEDTODISK)	? 'd' : '_',
 		  __entry->flags & (1ULL << KPF_PRIVATE)	? 'P' : '_',
 		  __entry->count,
-		  __entry->mapcount)
+		  __entry->mapcount,
+		  __entry->memcg)
 );
 
 
--- linux-mmotm.orig/kernel/trace/trace_mm.c	2011-08-29 10:56:02.000000000 +0800
+++ linux-mmotm/kernel/trace/trace_mm.c	2011-08-29 11:01:04.000000000 +0800
@@ -155,6 +155,8 @@ static void dump_pagecache(struct addres
 	struct page *page;
 	unsigned long start = 0;
 	unsigned long len = 0;
+	unsigned int memcg0;
+	unsigned int memcg;
 	int i;
 
 	for (;;) {
@@ -165,23 +167,27 @@ static void dump_pagecache(struct addres
 
 		if (nr_pages == 0) {
 			if (len)
-				trace_dump_page_cache(page0, len);
+				trace_dump_page_cache(page0, len, memcg0);
 			return;
 		}
 
 		for (i = 0; i < nr_pages; i++) {
 			page = pages[i];
+			memcg = page_memcg_id(page);
 
 			if (len &&
 			    page->index == start + len &&
-			    pages_similar(page0, page))
+			    pages_similar(page0, page) &&
+			    memcg0 == memcg)
 				len++;
 			else {
 				if (len)
-					trace_dump_page_cache(page0, len);
+					trace_dump_page_cache(page0, len,
+							      memcg0);
 				page0 = page;
 				start = page->index;
 				len = 1;
+				memcg0 = memcg;
 			}
 		}
 		cond_resched();


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

  parent reply	other threads:[~2011-08-29  3:57 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-29  3:29 [RFC][PATCH 0/7] trace memory objects Wu Fengguang
2011-08-29  3:29 ` Wu Fengguang
2011-08-29  3:29 ` [RFC][PATCH 1/7] tracing/mm: add page frame snapshot trace Wu Fengguang
2011-08-29  3:29 ` Wu Fengguang
2011-08-29  3:29   ` Wu Fengguang
     [not found]   ` <20110829152034.cb5d2c28.akpm@linux-foundation.org>
2011-08-30  2:12     ` [PATCH] kernel.h/checkpatch: Mark strict_strto<foo> and simple_strto<foo> as obsolete Joe Perches
2011-08-29  3:29 ` [RFC][PATCH 2/7] tracing/mm: rename trigger file to dump-pfn Wu Fengguang
2011-08-29  3:29   ` Wu Fengguang
2011-08-29  3:29 ` Wu Fengguang
2011-08-29  3:29 ` [RFC][PATCH 3/7] tracing/mm: create trace_objects.c Wu Fengguang
2011-08-29  3:29 ` Wu Fengguang
2011-08-29  3:29   ` Wu Fengguang
2011-08-29  3:29 ` [RFC][PATCH 4/7] tracing/mm: dump more page frame information Wu Fengguang
2011-08-29  3:29 ` Wu Fengguang
2011-08-29  3:29   ` Wu Fengguang
2011-08-29  3:29 ` [RFC][PATCH 5/7] tracing/mm: accept echo-able input format for pfn range Wu Fengguang
2011-08-29  3:29   ` Wu Fengguang
2011-08-29  3:29 ` Wu Fengguang
2011-08-29  3:29 ` [RFC][PATCH 6/7] tracing/mm: add dump-file and dump-fs interfaces Wu Fengguang
2011-08-29  3:29 ` Wu Fengguang
2011-08-29  3:29   ` Wu Fengguang
2011-08-29  3:29 ` Wu Fengguang [this message]
2011-08-29  3:29   ` [RFC][PATCH 7/7] tracing/mm: add memcg field Wu Fengguang
2011-08-29  3:29 ` Wu Fengguang
2011-08-29  3:59 ` [RFC][PATCH 0/7] trace memory objects Wu Fengguang
2011-08-29  3:59   ` Wu Fengguang

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=20110829034932.531048150@intel.com \
    --to=fengguang.wu@intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=balbir@linux.vnet.ibm.com \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=mgorman@suse.de \
    --cc=nishimura@mxp.nes.nec.co.jp \
    /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.