aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMel Gorman <mel@csn.ul.ie>2011-01-13 18:45:54 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2011-01-13 20:32:33 -0500
commitb7aba6984dc048503b69c2a885098cdd430832bf (patch)
tree1f682189bd967feaf28c2978445c7ebe82116185
parent2d90508f638241a2e7422d884767398296ebe720 (diff)
mm: compaction: add trace events for memory compaction activity
In preparation for a patches promoting the use of memory compaction over lumpy reclaim, this patch adds trace points for memory compaction activity. Using them, we can monitor the scanning activity of the migration and free page scanners as well as the number and success rates of pages passed to page migration. Signed-off-by: Mel Gorman <mel@csn.ul.ie> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Rik van Riel <riel@redhat.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Andy Whitcroft <apw@shadowen.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/trace/events/compaction.h74
-rw-r--r--mm/compaction.c14
2 files changed, 87 insertions, 1 deletions
diff --git a/include/trace/events/compaction.h b/include/trace/events/compaction.h
new file mode 100644
index 000000000000..388bcdd26d46
--- /dev/null
+++ b/include/trace/events/compaction.h
@@ -0,0 +1,74 @@
1#undef TRACE_SYSTEM
2#define TRACE_SYSTEM compaction
3
4#if !defined(_TRACE_COMPACTION_H) || defined(TRACE_HEADER_MULTI_READ)
5#define _TRACE_COMPACTION_H
6
7#include <linux/types.h>
8#include <linux/tracepoint.h>
9#include "gfpflags.h"
10
11DECLARE_EVENT_CLASS(mm_compaction_isolate_template,
12
13 TP_PROTO(unsigned long nr_scanned,
14 unsigned long nr_taken),
15
16 TP_ARGS(nr_scanned, nr_taken),
17
18 TP_STRUCT__entry(
19 __field(unsigned long, nr_scanned)
20 __field(unsigned long, nr_taken)
21 ),
22
23 TP_fast_assign(
24 __entry->nr_scanned = nr_scanned;
25 __entry->nr_taken = nr_taken;
26 ),
27
28 TP_printk("nr_scanned=%lu nr_taken=%lu",
29 __entry->nr_scanned,
30 __entry->nr_taken)
31);
32
33DEFINE_EVENT(mm_compaction_isolate_template, mm_compaction_isolate_migratepages,
34
35 TP_PROTO(unsigned long nr_scanned,
36 unsigned long nr_taken),
37
38 TP_ARGS(nr_scanned, nr_taken)
39);
40
41DEFINE_EVENT(mm_compaction_isolate_template, mm_compaction_isolate_freepages,
42 TP_PROTO(unsigned long nr_scanned,
43 unsigned long nr_taken),
44
45 TP_ARGS(nr_scanned, nr_taken)
46);
47
48TRACE_EVENT(mm_compaction_migratepages,
49
50 TP_PROTO(unsigned long nr_migrated,
51 unsigned long nr_failed),
52
53 TP_ARGS(nr_migrated, nr_failed),
54
55 TP_STRUCT__entry(
56 __field(unsigned long, nr_migrated)
57 __field(unsigned long, nr_failed)
58 ),
59
60 TP_fast_assign(
61 __entry->nr_migrated = nr_migrated;
62 __entry->nr_failed = nr_failed;
63 ),
64
65 TP_printk("nr_migrated=%lu nr_failed=%lu",
66 __entry->nr_migrated,
67 __entry->nr_failed)
68);
69
70
71#endif /* _TRACE_COMPACTION_H */
72
73/* This part must be outside protection */
74#include <trace/define_trace.h>
diff --git a/mm/compaction.c b/mm/compaction.c
index 1a8894eadf72..20011a850fef 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -16,6 +16,9 @@
16#include <linux/sysfs.h> 16#include <linux/sysfs.h>
17#include "internal.h" 17#include "internal.h"
18 18
19#define CREATE_TRACE_POINTS
20#include <trace/events/compaction.h>
21
19/* 22/*
20 * compact_control is used to track pages being migrated and the free pages 23 * compact_control is used to track pages being migrated and the free pages
21 * they are being migrated to during memory compaction. The free_pfn starts 24 * they are being migrated to during memory compaction. The free_pfn starts
@@ -60,7 +63,7 @@ static unsigned long isolate_freepages_block(struct zone *zone,
60 struct list_head *freelist) 63 struct list_head *freelist)
61{ 64{
62 unsigned long zone_end_pfn, end_pfn; 65 unsigned long zone_end_pfn, end_pfn;
63 int total_isolated = 0; 66 int nr_scanned = 0, total_isolated = 0;
64 struct page *cursor; 67 struct page *cursor;
65 68
66 /* Get the last PFN we should scan for free pages at */ 69 /* Get the last PFN we should scan for free pages at */
@@ -81,6 +84,7 @@ static unsigned long isolate_freepages_block(struct zone *zone,
81 84
82 if (!pfn_valid_within(blockpfn)) 85 if (!pfn_valid_within(blockpfn))
83 continue; 86 continue;
87 nr_scanned++;
84 88
85 if (!PageBuddy(page)) 89 if (!PageBuddy(page))
86 continue; 90 continue;
@@ -100,6 +104,7 @@ static unsigned long isolate_freepages_block(struct zone *zone,
100 } 104 }
101 } 105 }
102 106
107 trace_mm_compaction_isolate_freepages(nr_scanned, total_isolated);
103 return total_isolated; 108 return total_isolated;
104} 109}
105 110
@@ -234,6 +239,7 @@ static unsigned long isolate_migratepages(struct zone *zone,
234 struct compact_control *cc) 239 struct compact_control *cc)
235{ 240{
236 unsigned long low_pfn, end_pfn; 241 unsigned long low_pfn, end_pfn;
242 unsigned long nr_scanned = 0, nr_isolated = 0;
237 struct list_head *migratelist = &cc->migratepages; 243 struct list_head *migratelist = &cc->migratepages;
238 244
239 /* Do not scan outside zone boundaries */ 245 /* Do not scan outside zone boundaries */
@@ -266,6 +272,7 @@ static unsigned long isolate_migratepages(struct zone *zone,
266 struct page *page; 272 struct page *page;
267 if (!pfn_valid_within(low_pfn)) 273 if (!pfn_valid_within(low_pfn))
268 continue; 274 continue;
275 nr_scanned++;
269 276
270 /* Get the page and skip if free */ 277 /* Get the page and skip if free */
271 page = pfn_to_page(low_pfn); 278 page = pfn_to_page(low_pfn);
@@ -280,6 +287,7 @@ static unsigned long isolate_migratepages(struct zone *zone,
280 del_page_from_lru_list(zone, page, page_lru(page)); 287 del_page_from_lru_list(zone, page, page_lru(page));
281 list_add(&page->lru, migratelist); 288 list_add(&page->lru, migratelist);
282 cc->nr_migratepages++; 289 cc->nr_migratepages++;
290 nr_isolated++;
283 291
284 /* Avoid isolating too much */ 292 /* Avoid isolating too much */
285 if (cc->nr_migratepages == COMPACT_CLUSTER_MAX) 293 if (cc->nr_migratepages == COMPACT_CLUSTER_MAX)
@@ -291,6 +299,8 @@ static unsigned long isolate_migratepages(struct zone *zone,
291 spin_unlock_irq(&zone->lru_lock); 299 spin_unlock_irq(&zone->lru_lock);
292 cc->migrate_pfn = low_pfn; 300 cc->migrate_pfn = low_pfn;
293 301
302 trace_mm_compaction_isolate_migratepages(nr_scanned, nr_isolated);
303
294 return cc->nr_migratepages; 304 return cc->nr_migratepages;
295} 305}
296 306
@@ -401,6 +411,8 @@ static int compact_zone(struct zone *zone, struct compact_control *cc)
401 count_vm_events(COMPACTPAGES, nr_migrate - nr_remaining); 411 count_vm_events(COMPACTPAGES, nr_migrate - nr_remaining);
402 if (nr_remaining) 412 if (nr_remaining)
403 count_vm_events(COMPACTPAGEFAILED, nr_remaining); 413 count_vm_events(COMPACTPAGEFAILED, nr_remaining);
414 trace_mm_compaction_migratepages(nr_migrate - nr_remaining,
415 nr_remaining);
404 416
405 /* Release LRU pages not migrated */ 417 /* Release LRU pages not migrated */
406 if (!list_empty(&cc->migratepages)) { 418 if (!list_empty(&cc->migratepages)) {