-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
vmscan: tracing: add trace events for kswapd wakeup, sleeping and dir…
…ect reclaim Add two trace events for kswapd waking up and going asleep for the purposes of tracking kswapd activity and two trace events for direct reclaim beginning and ending. The information can be used to work out how much time a process or the system is spending on the reclamation of pages and in the case of direct reclaim, how many pages were reclaimed for that process. High frequency triggering of these events could point to memory pressure problems. Signed-off-by: Mel Gorman <mel@csn.ul.ie> Acked-by: Rik van Riel <riel@redhat.com> Acked-by: Larry Woodman <lwoodman@redhat.com> Cc: Dave Chinner <david@fromorbit.com> Cc: Chris Mason <chris.mason@oracle.com> Cc: Nick Piggin <npiggin@suse.de> Cc: Rik van Riel <riel@redhat.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Christoph Hellwig <hch@infradead.org> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Michael Rubin <mrubin@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
- Loading branch information
Mel Gorman
authored and
Linus Torvalds
committed
Aug 10, 2010
1 parent
c6a8a8c
commit 33906bc
Showing
4 changed files
with
173 additions
and
41 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
/* | ||
* The order of these masks is important. Matching masks will be seen | ||
* first and the left over flags will end up showing by themselves. | ||
* | ||
* For example, if we have GFP_KERNEL before GFP_USER we wil get: | ||
* | ||
* GFP_KERNEL|GFP_HARDWALL | ||
* | ||
* Thus most bits set go first. | ||
*/ | ||
#define show_gfp_flags(flags) \ | ||
(flags) ? __print_flags(flags, "|", \ | ||
{(unsigned long)GFP_HIGHUSER_MOVABLE, "GFP_HIGHUSER_MOVABLE"}, \ | ||
{(unsigned long)GFP_HIGHUSER, "GFP_HIGHUSER"}, \ | ||
{(unsigned long)GFP_USER, "GFP_USER"}, \ | ||
{(unsigned long)GFP_TEMPORARY, "GFP_TEMPORARY"}, \ | ||
{(unsigned long)GFP_KERNEL, "GFP_KERNEL"}, \ | ||
{(unsigned long)GFP_NOFS, "GFP_NOFS"}, \ | ||
{(unsigned long)GFP_ATOMIC, "GFP_ATOMIC"}, \ | ||
{(unsigned long)GFP_NOIO, "GFP_NOIO"}, \ | ||
{(unsigned long)__GFP_HIGH, "GFP_HIGH"}, \ | ||
{(unsigned long)__GFP_WAIT, "GFP_WAIT"}, \ | ||
{(unsigned long)__GFP_IO, "GFP_IO"}, \ | ||
{(unsigned long)__GFP_COLD, "GFP_COLD"}, \ | ||
{(unsigned long)__GFP_NOWARN, "GFP_NOWARN"}, \ | ||
{(unsigned long)__GFP_REPEAT, "GFP_REPEAT"}, \ | ||
{(unsigned long)__GFP_NOFAIL, "GFP_NOFAIL"}, \ | ||
{(unsigned long)__GFP_NORETRY, "GFP_NORETRY"}, \ | ||
{(unsigned long)__GFP_COMP, "GFP_COMP"}, \ | ||
{(unsigned long)__GFP_ZERO, "GFP_ZERO"}, \ | ||
{(unsigned long)__GFP_NOMEMALLOC, "GFP_NOMEMALLOC"}, \ | ||
{(unsigned long)__GFP_HARDWALL, "GFP_HARDWALL"}, \ | ||
{(unsigned long)__GFP_THISNODE, "GFP_THISNODE"}, \ | ||
{(unsigned long)__GFP_RECLAIMABLE, "GFP_RECLAIMABLE"}, \ | ||
{(unsigned long)__GFP_MOVABLE, "GFP_MOVABLE"} \ | ||
) : "GFP_NOWAIT" | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
#undef TRACE_SYSTEM | ||
#define TRACE_SYSTEM vmscan | ||
|
||
#if !defined(_TRACE_VMSCAN_H) || defined(TRACE_HEADER_MULTI_READ) | ||
#define _TRACE_VMSCAN_H | ||
|
||
#include <linux/types.h> | ||
#include <linux/tracepoint.h> | ||
#include "gfpflags.h" | ||
|
||
TRACE_EVENT(mm_vmscan_kswapd_sleep, | ||
|
||
TP_PROTO(int nid), | ||
|
||
TP_ARGS(nid), | ||
|
||
TP_STRUCT__entry( | ||
__field( int, nid ) | ||
), | ||
|
||
TP_fast_assign( | ||
__entry->nid = nid; | ||
), | ||
|
||
TP_printk("nid=%d", __entry->nid) | ||
); | ||
|
||
TRACE_EVENT(mm_vmscan_kswapd_wake, | ||
|
||
TP_PROTO(int nid, int order), | ||
|
||
TP_ARGS(nid, order), | ||
|
||
TP_STRUCT__entry( | ||
__field( int, nid ) | ||
__field( int, order ) | ||
), | ||
|
||
TP_fast_assign( | ||
__entry->nid = nid; | ||
__entry->order = order; | ||
), | ||
|
||
TP_printk("nid=%d order=%d", __entry->nid, __entry->order) | ||
); | ||
|
||
TRACE_EVENT(mm_vmscan_wakeup_kswapd, | ||
|
||
TP_PROTO(int nid, int zid, int order), | ||
|
||
TP_ARGS(nid, zid, order), | ||
|
||
TP_STRUCT__entry( | ||
__field( int, nid ) | ||
__field( int, zid ) | ||
__field( int, order ) | ||
), | ||
|
||
TP_fast_assign( | ||
__entry->nid = nid; | ||
__entry->zid = zid; | ||
__entry->order = order; | ||
), | ||
|
||
TP_printk("nid=%d zid=%d order=%d", | ||
__entry->nid, | ||
__entry->zid, | ||
__entry->order) | ||
); | ||
|
||
TRACE_EVENT(mm_vmscan_direct_reclaim_begin, | ||
|
||
TP_PROTO(int order, int may_writepage, gfp_t gfp_flags), | ||
|
||
TP_ARGS(order, may_writepage, gfp_flags), | ||
|
||
TP_STRUCT__entry( | ||
__field( int, order ) | ||
__field( int, may_writepage ) | ||
__field( gfp_t, gfp_flags ) | ||
), | ||
|
||
TP_fast_assign( | ||
__entry->order = order; | ||
__entry->may_writepage = may_writepage; | ||
__entry->gfp_flags = gfp_flags; | ||
), | ||
|
||
TP_printk("order=%d may_writepage=%d gfp_flags=%s", | ||
__entry->order, | ||
__entry->may_writepage, | ||
show_gfp_flags(__entry->gfp_flags)) | ||
); | ||
|
||
TRACE_EVENT(mm_vmscan_direct_reclaim_end, | ||
|
||
TP_PROTO(unsigned long nr_reclaimed), | ||
|
||
TP_ARGS(nr_reclaimed), | ||
|
||
TP_STRUCT__entry( | ||
__field( unsigned long, nr_reclaimed ) | ||
), | ||
|
||
TP_fast_assign( | ||
__entry->nr_reclaimed = nr_reclaimed; | ||
), | ||
|
||
TP_printk("nr_reclaimed=%lu", __entry->nr_reclaimed) | ||
); | ||
|
||
#endif /* _TRACE_VMSCAN_H */ | ||
|
||
/* This part must be outside protection */ | ||
#include <trace/define_trace.h> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters