summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoonsoo Kim <iamjoonsoo.kim@lge.com>2015-02-11 18:27:01 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2015-02-11 20:06:04 -0500
commit16c4a097a035c01809aa0c0abd458ca1fe4ff3d0 (patch)
treefe961117b89c43c293d4914c5301ec59da390c6b
parent4645f06334be1ad0eb61aa182c7999fe51bc1ba6 (diff)
mm/compaction: enhance tracepoint output for compaction begin/end
We now have tracepoint for begin event of compaction and it prints start position of both scanners, but, tracepoint for end event of compaction doesn't print finish position of both scanners. It'd be also useful to know finish position of both scanners so this patch add it. It will help to find odd behavior or problem on compaction internal logic. And mode is added to both begin/end tracepoint output, since according to mode, compaction behavior is quite different. And lastly, status format is changed to string rather than status number for readability. [akpm@linux-foundation.org: fix sparse warning] Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Acked-by: Vlastimil Babka <vbabka@suse.cz> Cc: Mel Gorman <mgorman@suse.de> Cc: David Rientjes <rientjes@google.com> Cc: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/linux/compaction.h1
-rw-r--r--include/trace/events/compaction.h49
-rw-r--r--mm/compaction.c15
3 files changed, 49 insertions, 16 deletions
diff --git a/include/linux/compaction.h b/include/linux/compaction.h
index f2efda2e6ac6..db64cae06530 100644
--- a/include/linux/compaction.h
+++ b/include/linux/compaction.h
@@ -12,6 +12,7 @@
12#define COMPACT_PARTIAL 3 12#define COMPACT_PARTIAL 3
13/* The full zone was compacted */ 13/* The full zone was compacted */
14#define COMPACT_COMPLETE 4 14#define COMPACT_COMPLETE 4
15/* When adding new state, please change compaction_status_string, too */
15 16
16/* Used to signal whether compaction detected need_sched() or lock contention */ 17/* Used to signal whether compaction detected need_sched() or lock contention */
17/* No contention detected */ 18/* No contention detected */
diff --git a/include/trace/events/compaction.h b/include/trace/events/compaction.h
index 1337d9e01e3d..839f6fac921a 100644
--- a/include/trace/events/compaction.h
+++ b/include/trace/events/compaction.h
@@ -85,46 +85,67 @@ TRACE_EVENT(mm_compaction_migratepages,
85); 85);
86 86
87TRACE_EVENT(mm_compaction_begin, 87TRACE_EVENT(mm_compaction_begin,
88 TP_PROTO(unsigned long zone_start, unsigned long migrate_start, 88 TP_PROTO(unsigned long zone_start, unsigned long migrate_pfn,
89 unsigned long free_start, unsigned long zone_end), 89 unsigned long free_pfn, unsigned long zone_end, bool sync),
90 90
91 TP_ARGS(zone_start, migrate_start, free_start, zone_end), 91 TP_ARGS(zone_start, migrate_pfn, free_pfn, zone_end, sync),
92 92
93 TP_STRUCT__entry( 93 TP_STRUCT__entry(
94 __field(unsigned long, zone_start) 94 __field(unsigned long, zone_start)
95 __field(unsigned long, migrate_start) 95 __field(unsigned long, migrate_pfn)
96 __field(unsigned long, free_start) 96 __field(unsigned long, free_pfn)
97 __field(unsigned long, zone_end) 97 __field(unsigned long, zone_end)
98 __field(bool, sync)
98 ), 99 ),
99 100
100 TP_fast_assign( 101 TP_fast_assign(
101 __entry->zone_start = zone_start; 102 __entry->zone_start = zone_start;
102 __entry->migrate_start = migrate_start; 103 __entry->migrate_pfn = migrate_pfn;
103 __entry->free_start = free_start; 104 __entry->free_pfn = free_pfn;
104 __entry->zone_end = zone_end; 105 __entry->zone_end = zone_end;
106 __entry->sync = sync;
105 ), 107 ),
106 108
107 TP_printk("zone_start=0x%lx migrate_start=0x%lx free_start=0x%lx zone_end=0x%lx", 109 TP_printk("zone_start=0x%lx migrate_pfn=0x%lx free_pfn=0x%lx zone_end=0x%lx, mode=%s",
108 __entry->zone_start, 110 __entry->zone_start,
109 __entry->migrate_start, 111 __entry->migrate_pfn,
110 __entry->free_start, 112 __entry->free_pfn,
111 __entry->zone_end) 113 __entry->zone_end,
114 __entry->sync ? "sync" : "async")
112); 115);
113 116
114TRACE_EVENT(mm_compaction_end, 117TRACE_EVENT(mm_compaction_end,
115 TP_PROTO(int status), 118 TP_PROTO(unsigned long zone_start, unsigned long migrate_pfn,
119 unsigned long free_pfn, unsigned long zone_end, bool sync,
120 int status),
116 121
117 TP_ARGS(status), 122 TP_ARGS(zone_start, migrate_pfn, free_pfn, zone_end, sync, status),
118 123
119 TP_STRUCT__entry( 124 TP_STRUCT__entry(
125 __field(unsigned long, zone_start)
126 __field(unsigned long, migrate_pfn)
127 __field(unsigned long, free_pfn)
128 __field(unsigned long, zone_end)
129 __field(bool, sync)
120 __field(int, status) 130 __field(int, status)
121 ), 131 ),
122 132
123 TP_fast_assign( 133 TP_fast_assign(
134 __entry->zone_start = zone_start;
135 __entry->migrate_pfn = migrate_pfn;
136 __entry->free_pfn = free_pfn;
137 __entry->zone_end = zone_end;
138 __entry->sync = sync;
124 __entry->status = status; 139 __entry->status = status;
125 ), 140 ),
126 141
127 TP_printk("status=%d", __entry->status) 142 TP_printk("zone_start=0x%lx migrate_pfn=0x%lx free_pfn=0x%lx zone_end=0x%lx, mode=%s status=%s",
143 __entry->zone_start,
144 __entry->migrate_pfn,
145 __entry->free_pfn,
146 __entry->zone_end,
147 __entry->sync ? "sync" : "async",
148 compaction_status_string[__entry->status])
128); 149);
129 150
130#endif /* _TRACE_COMPACTION_H */ 151#endif /* _TRACE_COMPACTION_H */
diff --git a/mm/compaction.c b/mm/compaction.c
index 9c7e6909dd29..66f7c365e888 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -34,6 +34,15 @@ static inline void count_compact_events(enum vm_event_item item, long delta)
34#endif 34#endif
35 35
36#if defined CONFIG_COMPACTION || defined CONFIG_CMA 36#if defined CONFIG_COMPACTION || defined CONFIG_CMA
37#ifdef CONFIG_TRACEPOINTS
38static const char *const compaction_status_string[] = {
39 "deferred",
40 "skipped",
41 "continue",
42 "partial",
43 "complete",
44};
45#endif
37 46
38#define CREATE_TRACE_POINTS 47#define CREATE_TRACE_POINTS
39#include <trace/events/compaction.h> 48#include <trace/events/compaction.h>
@@ -1197,7 +1206,8 @@ static int compact_zone(struct zone *zone, struct compact_control *cc)
1197 zone->compact_cached_migrate_pfn[1] = cc->migrate_pfn; 1206 zone->compact_cached_migrate_pfn[1] = cc->migrate_pfn;
1198 } 1207 }
1199 1208
1200 trace_mm_compaction_begin(start_pfn, cc->migrate_pfn, cc->free_pfn, end_pfn); 1209 trace_mm_compaction_begin(start_pfn, cc->migrate_pfn,
1210 cc->free_pfn, end_pfn, sync);
1201 1211
1202 migrate_prep_local(); 1212 migrate_prep_local();
1203 1213
@@ -1299,7 +1309,8 @@ out:
1299 zone->compact_cached_free_pfn = free_pfn; 1309 zone->compact_cached_free_pfn = free_pfn;
1300 } 1310 }
1301 1311
1302 trace_mm_compaction_end(ret); 1312 trace_mm_compaction_end(start_pfn, cc->migrate_pfn,
1313 cc->free_pfn, end_pfn, sync, ret);
1303 1314
1304 return ret; 1315 return ret;
1305} 1316}