[PATCH 1/2] mm: page_alloc.c: Add tracepoints for slowpath

From: Janani Ravichandran
Date: Wed Jul 27 2016 - 10:49:36 EST


Add tracepoints to the slowpath code to gather some information.
The tracepoints can also be used to find out how much time was spent in
the slowpath.

Signed-off-by: Janani Ravichandran <janani.rvchndrn@xxxxxxxxx>
---
include/trace/events/kmem.h | 40 ++++++++++++++++++++++++++++++++++++++++
mm/page_alloc.c | 5 +++++
2 files changed, 45 insertions(+)

diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h
index 6b2e154..c19ab9f 100644
--- a/include/trace/events/kmem.h
+++ b/include/trace/events/kmem.h
@@ -169,6 +169,46 @@ TRACE_EVENT(mm_page_free,
__entry->order)
);

+TRACE_EVENT(mm_slowpath_begin,
+
+ TP_PROTO(gfp_t gfp_mask, int order),
+
+ TP_ARGS(gfp_mask, order),
+
+ TP_STRUCT__entry(
+ __field(gfp_t, gfp_mask)
+ __field(int, order)
+ ),
+
+ TP_fast_assign(
+ __entry->gfp_mask = gfp_mask;
+ __entry->order = order;
+ ),
+
+ TP_printk("gfp_mask:%s order=%d",
+ show_gfp_flags(__entry->gfp_mask),
+ __entry->order)
+);
+
+TRACE_EVENT(mm_slowpath_end,
+
+ TP_PROTO(struct page *page),
+
+ TP_ARGS(page),
+
+ TP_STRUCT__entry(
+ __field(unsigned long, pfn)
+ ),
+
+ TP_fast_assign(
+ __entry->pfn = page ? page_to_pfn(page) : -1UL;
+ ),
+
+ TP_printk("page=%p pfn=%lu",
+ __entry->pfn != -1UL ? pfn_to_page(__entry->pfn) : NULL,
+ __entry->pfn != -1UL ? __entry->pfn : 0)
+);
+
TRACE_EVENT(mm_page_free_batched,

TP_PROTO(struct page *page, int cold),
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 8b3e134..be9c688 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -3595,6 +3595,8 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
(__GFP_ATOMIC|__GFP_DIRECT_RECLAIM)))
gfp_mask &= ~__GFP_ATOMIC;

+ trace_mm_slowpath_begin(gfp_mask, order);
+
retry:
if (gfp_mask & __GFP_KSWAPD_RECLAIM)
wake_all_kswapds(order, ac);
@@ -3769,6 +3771,9 @@ noretry:
nopage:
warn_alloc_failed(gfp_mask, order, NULL);
got_pg:
+
+ trace_mm_slowpath_end(page);
+
return page;
}

--
2.7.0