33906bc5c8
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>
37 lines
1.5 KiB
C
37 lines
1.5 KiB
C
/*
|
|
* 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"
|
|
|