diff --git a/include/trace/events/mm.h b/include/trace/events/mm.h new file mode 100644 index 0000000..d5a5ec2 --- /dev/null +++ b/include/trace/events/mm.h @@ -0,0 +1,94 @@ +#if !defined(_TRACE_MM_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_MM_H + +#include +#include + +#undef TRACE_SYSTEM +#define TRACE_SYSTEM mm + +TRACE_EVENT(mm_pagereclaim_shrinkactive, + + TP_PROTO(unsigned long scanned, unsigned long moved, + int file, int priority), + + TP_ARGS(scanned, moved, file, priority), + + TP_STRUCT__entry( + __field(unsigned long, scanned) + __field(unsigned long, moved) + __field(int, file) + __field(int, priority) + ), + + TP_fast_assign( + __entry->scanned = scanned; + __entry->moved = moved; + __entry->file = file; + __entry->priority = priority; + ), + + TP_printk("%s, scanned %ld, moved %ld, priority %d", + __entry->file ? "pagecache" : "anonymous", + __entry->scanned, __entry->moved, + __entry->priority) + ); + +TRACE_EVENT(mm_pagereclaim_shrinkinactive, + + TP_PROTO(unsigned long scanned, unsigned long reclaimed, + int file, int priority), + + TP_ARGS(scanned, reclaimed, file, priority), + + TP_STRUCT__entry( + __field(unsigned long, scanned) + __field(unsigned long, reclaimed) + __field(int, file) + __field(int, priority) + ), + + TP_fast_assign( + __entry->scanned = scanned; + __entry->reclaimed = reclaimed; + __entry->file = file; + __entry->priority = priority; + ), + + TP_printk("%s, scanned %ld, reclaimed %ld, priority %d", + __entry->file ? "pagecache" : "anonymous", + __entry->scanned, __entry->reclaimed, + __entry->priority) + ); + +TRACE_EVENT(mm_get_scanratio, + + TP_PROTO(unsigned long anon, unsigned long file, + unsigned long percent_anon, unsigned long percent_file), + + TP_ARGS(anon, file, percent_anon, percent_file), + + TP_STRUCT__entry( + __field(unsigned long, anon) + __field(unsigned long, file) + __field(unsigned long, percent_anon) + __field(unsigned long, percent_file) + ), + + TP_fast_assign( + __entry->anon = anon; + __entry->file = file; + __entry->percent_anon = percent_anon; + __entry->percent_file = percent_file; + ), + + TP_printk("%ld anonymous pages, reclaiming %ld%% - %ld pagecache pages, reclaiming %ld%%", + __entry->anon, __entry->percent_anon, + __entry->file, __entry->percent_file) + + ); + +#endif /* _TRACE_MM_H */ + +/* This part must be outside protection */ +#include diff --git a/mm/vmscan.c b/mm/vmscan.c index ba8228e..8797a26 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -40,6 +40,8 @@ #include #include #include +#define CREATE_TRACE_POINTS +#include #include #include @@ -1168,6 +1170,8 @@ static unsigned long shrink_inactive_list(unsigned long max_scan, done: local_irq_enable(); pagevec_release(&pvec); + trace_mm_pagereclaim_shrinkinactive(nr_scanned, nr_reclaimed, + file, priority); return nr_reclaimed; } @@ -1325,6 +1329,7 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, LRU_BASE + file * LRU_FILE); spin_unlock_irq(&zone->lru_lock); + trace_mm_pagereclaim_shrinkactive(pgscanned, pgmoved, file, priority); } static int inactive_anon_is_low_global(struct zone *zone) @@ -1491,6 +1496,7 @@ static void get_scan_ratio(struct zone *zone, struct scan_control *sc, /* Normalize to percentages */ percent[0] = 100 * ap / (ap + fp + 1); percent[1] = 100 - percent[0]; + trace_mm_get_scanratio(anon, file, percent[0], percent[1]); } /*