diff options
| author | KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> | 2010-08-09 20:19:56 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-09 23:45:03 -0400 |
| commit | bdce6d9ebf52c1f6c23163d1a33320ce7c007f73 (patch) | |
| tree | 6070de94cdece474e277d8878721421671e212eb | |
| parent | cf4dcc3e9b374e1b61a7c22faf868707ce78d6a9 (diff) | |
memcg, vmscan: add memcg reclaim tracepoint
Memcg also need to trace reclaim progress as direct reclaim. This patch
add it.
Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Acked-by: Mel Gorman <mel@csn.ul.ie>
Acked-by: Balbir Singh <balbir@linux.vnet.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | include/trace/events/vmscan.h | 28 | ||||
| -rw-r--r-- | mm/vmscan.c | 20 |
2 files changed, 47 insertions, 1 deletions
diff --git a/include/trace/events/vmscan.h b/include/trace/events/vmscan.h index f9f2747bc1c1..028733be4f34 100644 --- a/include/trace/events/vmscan.h +++ b/include/trace/events/vmscan.h | |||
| @@ -117,6 +117,19 @@ DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_direct_reclaim_b | |||
| 117 | TP_ARGS(order, may_writepage, gfp_flags) | 117 | TP_ARGS(order, may_writepage, gfp_flags) |
| 118 | ); | 118 | ); |
| 119 | 119 | ||
| 120 | DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_memcg_reclaim_begin, | ||
| 121 | |||
| 122 | TP_PROTO(int order, int may_writepage, gfp_t gfp_flags), | ||
| 123 | |||
| 124 | TP_ARGS(order, may_writepage, gfp_flags) | ||
| 125 | ); | ||
| 126 | |||
| 127 | DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_memcg_softlimit_reclaim_begin, | ||
| 128 | |||
| 129 | TP_PROTO(int order, int may_writepage, gfp_t gfp_flags), | ||
| 130 | |||
| 131 | TP_ARGS(order, may_writepage, gfp_flags) | ||
| 132 | ); | ||
| 120 | 133 | ||
| 121 | DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_end_template, | 134 | DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_end_template, |
| 122 | 135 | ||
| @@ -142,6 +155,21 @@ DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_direct_reclaim_end | |||
| 142 | TP_ARGS(nr_reclaimed) | 155 | TP_ARGS(nr_reclaimed) |
| 143 | ); | 156 | ); |
| 144 | 157 | ||
| 158 | DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_memcg_reclaim_end, | ||
| 159 | |||
| 160 | TP_PROTO(unsigned long nr_reclaimed), | ||
| 161 | |||
| 162 | TP_ARGS(nr_reclaimed) | ||
| 163 | ); | ||
| 164 | |||
| 165 | DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_memcg_softlimit_reclaim_end, | ||
| 166 | |||
| 167 | TP_PROTO(unsigned long nr_reclaimed), | ||
| 168 | |||
| 169 | TP_ARGS(nr_reclaimed) | ||
| 170 | ); | ||
| 171 | |||
| 172 | |||
| 145 | TRACE_EVENT(mm_vmscan_lru_isolate, | 173 | TRACE_EVENT(mm_vmscan_lru_isolate, |
| 146 | 174 | ||
| 147 | TP_PROTO(int order, | 175 | TP_PROTO(int order, |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 9789a2c92563..154b37a33731 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
| @@ -1951,6 +1951,11 @@ unsigned long mem_cgroup_shrink_node_zone(struct mem_cgroup *mem, | |||
| 1951 | sc.nodemask = &nm; | 1951 | sc.nodemask = &nm; |
| 1952 | sc.nr_reclaimed = 0; | 1952 | sc.nr_reclaimed = 0; |
| 1953 | sc.nr_scanned = 0; | 1953 | sc.nr_scanned = 0; |
| 1954 | |||
| 1955 | trace_mm_vmscan_memcg_softlimit_reclaim_begin(0, | ||
| 1956 | sc.may_writepage, | ||
| 1957 | sc.gfp_mask); | ||
| 1958 | |||
| 1954 | /* | 1959 | /* |
| 1955 | * NOTE: Although we can get the priority field, using it | 1960 | * NOTE: Although we can get the priority field, using it |
| 1956 | * here is not a good idea, since it limits the pages we can scan. | 1961 | * here is not a good idea, since it limits the pages we can scan. |
| @@ -1959,6 +1964,9 @@ unsigned long mem_cgroup_shrink_node_zone(struct mem_cgroup *mem, | |||
| 1959 | * the priority and make it zero. | 1964 | * the priority and make it zero. |
| 1960 | */ | 1965 | */ |
| 1961 | shrink_zone(0, zone, &sc); | 1966 | shrink_zone(0, zone, &sc); |
| 1967 | |||
| 1968 | trace_mm_vmscan_memcg_softlimit_reclaim_end(sc.nr_reclaimed); | ||
| 1969 | |||
| 1962 | return sc.nr_reclaimed; | 1970 | return sc.nr_reclaimed; |
| 1963 | } | 1971 | } |
| 1964 | 1972 | ||
| @@ -1968,6 +1976,7 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem_cont, | |||
| 1968 | unsigned int swappiness) | 1976 | unsigned int swappiness) |
| 1969 | { | 1977 | { |
| 1970 | struct zonelist *zonelist; | 1978 | struct zonelist *zonelist; |
| 1979 | unsigned long nr_reclaimed; | ||
| 1971 | struct scan_control sc = { | 1980 | struct scan_control sc = { |
| 1972 | .may_writepage = !laptop_mode, | 1981 | .may_writepage = !laptop_mode, |
| 1973 | .may_unmap = 1, | 1982 | .may_unmap = 1, |
| @@ -1982,7 +1991,16 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem_cont, | |||
| 1982 | sc.gfp_mask = (gfp_mask & GFP_RECLAIM_MASK) | | 1991 | sc.gfp_mask = (gfp_mask & GFP_RECLAIM_MASK) | |
| 1983 | (GFP_HIGHUSER_MOVABLE & ~GFP_RECLAIM_MASK); | 1992 | (GFP_HIGHUSER_MOVABLE & ~GFP_RECLAIM_MASK); |
| 1984 | zonelist = NODE_DATA(numa_node_id())->node_zonelists; | 1993 | zonelist = NODE_DATA(numa_node_id())->node_zonelists; |
| 1985 | return do_try_to_free_pages(zonelist, &sc); | 1994 | |
| 1995 | trace_mm_vmscan_memcg_reclaim_begin(0, | ||
| 1996 | sc.may_writepage, | ||
| 1997 | sc.gfp_mask); | ||
| 1998 | |||
| 1999 | nr_reclaimed = do_try_to_free_pages(zonelist, &sc); | ||
| 2000 | |||
| 2001 | trace_mm_vmscan_memcg_reclaim_end(nr_reclaimed); | ||
| 2002 | |||
| 2003 | return nr_reclaimed; | ||
| 1986 | } | 2004 | } |
| 1987 | #endif | 2005 | #endif |
| 1988 | 2006 | ||
