aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/trace/events/kmem.h74
-rw-r--r--mm/page_alloc.c7
2 files changed, 80 insertions, 1 deletions
diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h
index 1493c541f9c4..0d358a0d45c1 100644
--- a/include/trace/events/kmem.h
+++ b/include/trace/events/kmem.h
@@ -225,6 +225,80 @@ TRACE_EVENT(kmem_cache_free,
225 225
226 TP_printk("call_site=%lx ptr=%p", __entry->call_site, __entry->ptr) 226 TP_printk("call_site=%lx ptr=%p", __entry->call_site, __entry->ptr)
227); 227);
228
229TRACE_EVENT(mm_page_free_direct,
230
231 TP_PROTO(struct page *page, unsigned int order),
232
233 TP_ARGS(page, order),
234
235 TP_STRUCT__entry(
236 __field( struct page *, page )
237 __field( unsigned int, order )
238 ),
239
240 TP_fast_assign(
241 __entry->page = page;
242 __entry->order = order;
243 ),
244
245 TP_printk("page=%p pfn=%lu order=%d",
246 __entry->page,
247 page_to_pfn(__entry->page),
248 __entry->order)
249);
250
251TRACE_EVENT(mm_pagevec_free,
252
253 TP_PROTO(struct page *page, int cold),
254
255 TP_ARGS(page, cold),
256
257 TP_STRUCT__entry(
258 __field( struct page *, page )
259 __field( int, cold )
260 ),
261
262 TP_fast_assign(
263 __entry->page = page;
264 __entry->cold = cold;
265 ),
266
267 TP_printk("page=%p pfn=%lu order=0 cold=%d",
268 __entry->page,
269 page_to_pfn(__entry->page),
270 __entry->cold)
271);
272
273TRACE_EVENT(mm_page_alloc,
274
275 TP_PROTO(struct page *page, unsigned int order,
276 gfp_t gfp_flags, int migratetype),
277
278 TP_ARGS(page, order, gfp_flags, migratetype),
279
280 TP_STRUCT__entry(
281 __field( struct page *, page )
282 __field( unsigned int, order )
283 __field( gfp_t, gfp_flags )
284 __field( int, migratetype )
285 ),
286
287 TP_fast_assign(
288 __entry->page = page;
289 __entry->order = order;
290 __entry->gfp_flags = gfp_flags;
291 __entry->migratetype = migratetype;
292 ),
293
294 TP_printk("page=%p pfn=%lu order=%d migratetype=%d gfp_flags=%s",
295 __entry->page,
296 page_to_pfn(__entry->page),
297 __entry->order,
298 __entry->migratetype,
299 show_gfp_flags(__entry->gfp_flags))
300);
301
228#endif /* _TRACE_KMEM_H */ 302#endif /* _TRACE_KMEM_H */
229 303
230/* This part must be outside protection */ 304/* This part must be outside protection */
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 913a8ebd3a8e..80f954d82d77 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -1076,6 +1076,7 @@ static void free_hot_cold_page(struct page *page, int cold)
1076 1076
1077void free_hot_page(struct page *page) 1077void free_hot_page(struct page *page)
1078{ 1078{
1079 trace_mm_page_free_direct(page, 0);
1079 free_hot_cold_page(page, 0); 1080 free_hot_cold_page(page, 0);
1080} 1081}
1081 1082
@@ -1920,6 +1921,7 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
1920 zonelist, high_zoneidx, nodemask, 1921 zonelist, high_zoneidx, nodemask,
1921 preferred_zone, migratetype); 1922 preferred_zone, migratetype);
1922 1923
1924 trace_mm_page_alloc(page, order, gfp_mask, migratetype);
1923 return page; 1925 return page;
1924} 1926}
1925EXPORT_SYMBOL(__alloc_pages_nodemask); 1927EXPORT_SYMBOL(__alloc_pages_nodemask);
@@ -1954,13 +1956,16 @@ void __pagevec_free(struct pagevec *pvec)
1954{ 1956{
1955 int i = pagevec_count(pvec); 1957 int i = pagevec_count(pvec);
1956 1958
1957 while (--i >= 0) 1959 while (--i >= 0) {
1960 trace_mm_pagevec_free(pvec->pages[i], pvec->cold);
1958 free_hot_cold_page(pvec->pages[i], pvec->cold); 1961 free_hot_cold_page(pvec->pages[i], pvec->cold);
1962 }
1959} 1963}
1960 1964
1961void __free_pages(struct page *page, unsigned int order) 1965void __free_pages(struct page *page, unsigned int order)
1962{ 1966{
1963 if (put_page_testzero(page)) { 1967 if (put_page_testzero(page)) {
1968 trace_mm_page_free_direct(page, order);
1964 if (order == 0) 1969 if (order == 0)
1965 free_hot_page(page); 1970 free_hot_page(page);
1966 else 1971 else