mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
vmscan: tracing: add trace events for kswapd wakeup, sleeping and direct 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 <[email protected]> Acked-by: Rik van Riel <[email protected]> Acked-by: Larry Woodman <[email protected]> Cc: Dave Chinner <[email protected]> Cc: Chris Mason <[email protected]> Cc: Nick Piggin <[email protected]> Cc: Rik van Riel <[email protected]> Cc: Johannes Weiner <[email protected]> Cc: Christoph Hellwig <[email protected]> Cc: KAMEZAWA Hiroyuki <[email protected]> Cc: KOSAKI Motohiro <[email protected]> Cc: Andrea Arcangeli <[email protected]> Cc: Michael Rubin <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
c6a8a8c589
commit
33906bc5c8
4 changed files with 173 additions and 41 deletions
24
mm/vmscan.c
24
mm/vmscan.c
|
|
@ -48,6 +48,9 @@
|
|||
|
||||
#include "internal.h"
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/vmscan.h>
|
||||
|
||||
struct scan_control {
|
||||
/* Incremented by the number of inactive pages that were scanned */
|
||||
unsigned long nr_scanned;
|
||||
|
|
@ -1883,6 +1886,7 @@ out:
|
|||
unsigned long try_to_free_pages(struct zonelist *zonelist, int order,
|
||||
gfp_t gfp_mask, nodemask_t *nodemask)
|
||||
{
|
||||
unsigned long nr_reclaimed;
|
||||
struct scan_control sc = {
|
||||
.gfp_mask = gfp_mask,
|
||||
.may_writepage = !laptop_mode,
|
||||
|
|
@ -1895,7 +1899,15 @@ unsigned long try_to_free_pages(struct zonelist *zonelist, int order,
|
|||
.nodemask = nodemask,
|
||||
};
|
||||
|
||||
return do_try_to_free_pages(zonelist, &sc);
|
||||
trace_mm_vmscan_direct_reclaim_begin(order,
|
||||
sc.may_writepage,
|
||||
gfp_mask);
|
||||
|
||||
nr_reclaimed = do_try_to_free_pages(zonelist, &sc);
|
||||
|
||||
trace_mm_vmscan_direct_reclaim_end(nr_reclaimed);
|
||||
|
||||
return nr_reclaimed;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CGROUP_MEM_RES_CTLR
|
||||
|
|
@ -2294,9 +2306,10 @@ static int kswapd(void *p)
|
|||
* premature sleep. If not, then go fully
|
||||
* to sleep until explicitly woken up
|
||||
*/
|
||||
if (!sleeping_prematurely(pgdat, order, remaining))
|
||||
if (!sleeping_prematurely(pgdat, order, remaining)) {
|
||||
trace_mm_vmscan_kswapd_sleep(pgdat->node_id);
|
||||
schedule();
|
||||
else {
|
||||
} else {
|
||||
if (remaining)
|
||||
count_vm_event(KSWAPD_LOW_WMARK_HIT_QUICKLY);
|
||||
else
|
||||
|
|
@ -2316,8 +2329,10 @@ static int kswapd(void *p)
|
|||
* We can speed up thawing tasks if we don't call balance_pgdat
|
||||
* after returning from the refrigerator
|
||||
*/
|
||||
if (!ret)
|
||||
if (!ret) {
|
||||
trace_mm_vmscan_kswapd_wake(pgdat->node_id, order);
|
||||
balance_pgdat(pgdat, order);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -2337,6 +2352,7 @@ void wakeup_kswapd(struct zone *zone, int order)
|
|||
return;
|
||||
if (pgdat->kswapd_max_order < order)
|
||||
pgdat->kswapd_max_order = order;
|
||||
trace_mm_vmscan_wakeup_kswapd(pgdat->node_id, zone_idx(zone), order);
|
||||
if (!cpuset_zone_allowed_hardwall(zone, GFP_KERNEL))
|
||||
return;
|
||||
if (!waitqueue_active(&pgdat->kswapd_wait))
|
||||
|
|
|
|||
Loading…
Reference in a new issue