1d0b6e04aSLi Zefan #undef TRACE_SYSTEM 2d0b6e04aSLi Zefan #define TRACE_SYSTEM kmem 3d0b6e04aSLi Zefan 4ad8d75ffSSteven Rostedt #if !defined(_TRACE_KMEM_H) || defined(TRACE_HEADER_MULTI_READ) 5ad8d75ffSSteven Rostedt #define _TRACE_KMEM_H 6ad8d75ffSSteven Rostedt 7ad8d75ffSSteven Rostedt #include <linux/types.h> 8ad8d75ffSSteven Rostedt #include <linux/tracepoint.h> 9ad8d75ffSSteven Rostedt 1062ba180eSSteven Rostedt /* 1162ba180eSSteven Rostedt * The order of these masks is important. Matching masks will be seen 1262ba180eSSteven Rostedt * first and the left over flags will end up showing by themselves. 1362ba180eSSteven Rostedt * 1462ba180eSSteven Rostedt * For example, if we have GFP_KERNEL before GFP_USER we wil get: 1562ba180eSSteven Rostedt * 1662ba180eSSteven Rostedt * GFP_KERNEL|GFP_HARDWALL 1762ba180eSSteven Rostedt * 1862ba180eSSteven Rostedt * Thus most bits set go first. 1962ba180eSSteven Rostedt */ 2062ba180eSSteven Rostedt #define show_gfp_flags(flags) \ 2162ba180eSSteven Rostedt (flags) ? __print_flags(flags, "|", \ 2262ba180eSSteven Rostedt {(unsigned long)GFP_HIGHUSER_MOVABLE, "GFP_HIGHUSER_MOVABLE"}, \ 2362ba180eSSteven Rostedt {(unsigned long)GFP_HIGHUSER, "GFP_HIGHUSER"}, \ 2462ba180eSSteven Rostedt {(unsigned long)GFP_USER, "GFP_USER"}, \ 2562ba180eSSteven Rostedt {(unsigned long)GFP_TEMPORARY, "GFP_TEMPORARY"}, \ 2662ba180eSSteven Rostedt {(unsigned long)GFP_KERNEL, "GFP_KERNEL"}, \ 2762ba180eSSteven Rostedt {(unsigned long)GFP_NOFS, "GFP_NOFS"}, \ 2862ba180eSSteven Rostedt {(unsigned long)GFP_ATOMIC, "GFP_ATOMIC"}, \ 2962ba180eSSteven Rostedt {(unsigned long)GFP_NOIO, "GFP_NOIO"}, \ 3062ba180eSSteven Rostedt {(unsigned long)__GFP_HIGH, "GFP_HIGH"}, \ 3162ba180eSSteven Rostedt {(unsigned long)__GFP_WAIT, "GFP_WAIT"}, \ 3262ba180eSSteven Rostedt {(unsigned long)__GFP_IO, "GFP_IO"}, \ 3362ba180eSSteven Rostedt {(unsigned long)__GFP_COLD, "GFP_COLD"}, \ 3462ba180eSSteven Rostedt {(unsigned long)__GFP_NOWARN, "GFP_NOWARN"}, \ 3562ba180eSSteven Rostedt {(unsigned long)__GFP_REPEAT, "GFP_REPEAT"}, \ 3662ba180eSSteven Rostedt {(unsigned long)__GFP_NOFAIL, "GFP_NOFAIL"}, \ 3762ba180eSSteven Rostedt {(unsigned long)__GFP_NORETRY, "GFP_NORETRY"}, \ 3862ba180eSSteven Rostedt {(unsigned long)__GFP_COMP, "GFP_COMP"}, \ 3962ba180eSSteven Rostedt {(unsigned long)__GFP_ZERO, "GFP_ZERO"}, \ 4062ba180eSSteven Rostedt {(unsigned long)__GFP_NOMEMALLOC, "GFP_NOMEMALLOC"}, \ 4162ba180eSSteven Rostedt {(unsigned long)__GFP_HARDWALL, "GFP_HARDWALL"}, \ 4262ba180eSSteven Rostedt {(unsigned long)__GFP_THISNODE, "GFP_THISNODE"}, \ 4362ba180eSSteven Rostedt {(unsigned long)__GFP_RECLAIMABLE, "GFP_RECLAIMABLE"}, \ 4462ba180eSSteven Rostedt {(unsigned long)__GFP_MOVABLE, "GFP_MOVABLE"} \ 4562ba180eSSteven Rostedt ) : "GFP_NOWAIT" 4662ba180eSSteven Rostedt 4753d0422cSLi Zefan DECLARE_EVENT_CLASS(kmem_alloc, 48ad8d75ffSSteven Rostedt 49ad8d75ffSSteven Rostedt TP_PROTO(unsigned long call_site, 50ad8d75ffSSteven Rostedt const void *ptr, 51ad8d75ffSSteven Rostedt size_t bytes_req, 52ad8d75ffSSteven Rostedt size_t bytes_alloc, 53ad8d75ffSSteven Rostedt gfp_t gfp_flags), 54ad8d75ffSSteven Rostedt 55ad8d75ffSSteven Rostedt TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags), 56ad8d75ffSSteven Rostedt 57ad8d75ffSSteven Rostedt TP_STRUCT__entry( 58ad8d75ffSSteven Rostedt __field( unsigned long, call_site ) 59ad8d75ffSSteven Rostedt __field( const void *, ptr ) 60ad8d75ffSSteven Rostedt __field( size_t, bytes_req ) 61ad8d75ffSSteven Rostedt __field( size_t, bytes_alloc ) 62ad8d75ffSSteven Rostedt __field( gfp_t, gfp_flags ) 63ad8d75ffSSteven Rostedt ), 64ad8d75ffSSteven Rostedt 65ad8d75ffSSteven Rostedt TP_fast_assign( 66ad8d75ffSSteven Rostedt __entry->call_site = call_site; 67ad8d75ffSSteven Rostedt __entry->ptr = ptr; 68ad8d75ffSSteven Rostedt __entry->bytes_req = bytes_req; 69ad8d75ffSSteven Rostedt __entry->bytes_alloc = bytes_alloc; 70ad8d75ffSSteven Rostedt __entry->gfp_flags = gfp_flags; 71ad8d75ffSSteven Rostedt ), 72ad8d75ffSSteven Rostedt 7362ba180eSSteven Rostedt TP_printk("call_site=%lx ptr=%p bytes_req=%zu bytes_alloc=%zu gfp_flags=%s", 74ad8d75ffSSteven Rostedt __entry->call_site, 75ad8d75ffSSteven Rostedt __entry->ptr, 76ad8d75ffSSteven Rostedt __entry->bytes_req, 77ad8d75ffSSteven Rostedt __entry->bytes_alloc, 7862ba180eSSteven Rostedt show_gfp_flags(__entry->gfp_flags)) 79ad8d75ffSSteven Rostedt ); 80ad8d75ffSSteven Rostedt 8153d0422cSLi Zefan DEFINE_EVENT(kmem_alloc, kmalloc, 82ad8d75ffSSteven Rostedt 8353d0422cSLi Zefan TP_PROTO(unsigned long call_site, const void *ptr, 8453d0422cSLi Zefan size_t bytes_req, size_t bytes_alloc, gfp_t gfp_flags), 85ad8d75ffSSteven Rostedt 8653d0422cSLi Zefan TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags) 87ad8d75ffSSteven Rostedt ); 88ad8d75ffSSteven Rostedt 8953d0422cSLi Zefan DEFINE_EVENT(kmem_alloc, kmem_cache_alloc, 9053d0422cSLi Zefan 9153d0422cSLi Zefan TP_PROTO(unsigned long call_site, const void *ptr, 9253d0422cSLi Zefan size_t bytes_req, size_t bytes_alloc, gfp_t gfp_flags), 9353d0422cSLi Zefan 9453d0422cSLi Zefan TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags) 9553d0422cSLi Zefan ); 9653d0422cSLi Zefan 9753d0422cSLi Zefan DECLARE_EVENT_CLASS(kmem_alloc_node, 98ad8d75ffSSteven Rostedt 99ad8d75ffSSteven Rostedt TP_PROTO(unsigned long call_site, 100ad8d75ffSSteven Rostedt const void *ptr, 101ad8d75ffSSteven Rostedt size_t bytes_req, 102ad8d75ffSSteven Rostedt size_t bytes_alloc, 103ad8d75ffSSteven Rostedt gfp_t gfp_flags, 104ad8d75ffSSteven Rostedt int node), 105ad8d75ffSSteven Rostedt 106ad8d75ffSSteven Rostedt TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags, node), 107ad8d75ffSSteven Rostedt 108ad8d75ffSSteven Rostedt TP_STRUCT__entry( 109ad8d75ffSSteven Rostedt __field( unsigned long, call_site ) 110ad8d75ffSSteven Rostedt __field( const void *, ptr ) 111ad8d75ffSSteven Rostedt __field( size_t, bytes_req ) 112ad8d75ffSSteven Rostedt __field( size_t, bytes_alloc ) 113ad8d75ffSSteven Rostedt __field( gfp_t, gfp_flags ) 114ad8d75ffSSteven Rostedt __field( int, node ) 115ad8d75ffSSteven Rostedt ), 116ad8d75ffSSteven Rostedt 117ad8d75ffSSteven Rostedt TP_fast_assign( 118ad8d75ffSSteven Rostedt __entry->call_site = call_site; 119ad8d75ffSSteven Rostedt __entry->ptr = ptr; 120ad8d75ffSSteven Rostedt __entry->bytes_req = bytes_req; 121ad8d75ffSSteven Rostedt __entry->bytes_alloc = bytes_alloc; 122ad8d75ffSSteven Rostedt __entry->gfp_flags = gfp_flags; 123ad8d75ffSSteven Rostedt __entry->node = node; 124ad8d75ffSSteven Rostedt ), 125ad8d75ffSSteven Rostedt 12662ba180eSSteven Rostedt TP_printk("call_site=%lx ptr=%p bytes_req=%zu bytes_alloc=%zu gfp_flags=%s node=%d", 127ad8d75ffSSteven Rostedt __entry->call_site, 128ad8d75ffSSteven Rostedt __entry->ptr, 129ad8d75ffSSteven Rostedt __entry->bytes_req, 130ad8d75ffSSteven Rostedt __entry->bytes_alloc, 13162ba180eSSteven Rostedt show_gfp_flags(__entry->gfp_flags), 132ad8d75ffSSteven Rostedt __entry->node) 133ad8d75ffSSteven Rostedt ); 134ad8d75ffSSteven Rostedt 13553d0422cSLi Zefan DEFINE_EVENT(kmem_alloc_node, kmalloc_node, 136ad8d75ffSSteven Rostedt 13753d0422cSLi Zefan TP_PROTO(unsigned long call_site, const void *ptr, 13853d0422cSLi Zefan size_t bytes_req, size_t bytes_alloc, 13953d0422cSLi Zefan gfp_t gfp_flags, int node), 140ad8d75ffSSteven Rostedt 14153d0422cSLi Zefan TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags, node) 142ad8d75ffSSteven Rostedt ); 143ad8d75ffSSteven Rostedt 14453d0422cSLi Zefan DEFINE_EVENT(kmem_alloc_node, kmem_cache_alloc_node, 14553d0422cSLi Zefan 14653d0422cSLi Zefan TP_PROTO(unsigned long call_site, const void *ptr, 14753d0422cSLi Zefan size_t bytes_req, size_t bytes_alloc, 14853d0422cSLi Zefan gfp_t gfp_flags, int node), 14953d0422cSLi Zefan 15053d0422cSLi Zefan TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags, node) 15153d0422cSLi Zefan ); 15253d0422cSLi Zefan 15353d0422cSLi Zefan DECLARE_EVENT_CLASS(kmem_free, 154ad8d75ffSSteven Rostedt 155ad8d75ffSSteven Rostedt TP_PROTO(unsigned long call_site, const void *ptr), 156ad8d75ffSSteven Rostedt 157ad8d75ffSSteven Rostedt TP_ARGS(call_site, ptr), 158ad8d75ffSSteven Rostedt 159ad8d75ffSSteven Rostedt TP_STRUCT__entry( 160ad8d75ffSSteven Rostedt __field( unsigned long, call_site ) 161ad8d75ffSSteven Rostedt __field( const void *, ptr ) 162ad8d75ffSSteven Rostedt ), 163ad8d75ffSSteven Rostedt 164ad8d75ffSSteven Rostedt TP_fast_assign( 165ad8d75ffSSteven Rostedt __entry->call_site = call_site; 166ad8d75ffSSteven Rostedt __entry->ptr = ptr; 167ad8d75ffSSteven Rostedt ), 168ad8d75ffSSteven Rostedt 169ad8d75ffSSteven Rostedt TP_printk("call_site=%lx ptr=%p", __entry->call_site, __entry->ptr) 170ad8d75ffSSteven Rostedt ); 171ad8d75ffSSteven Rostedt 17253d0422cSLi Zefan DEFINE_EVENT(kmem_free, kfree, 173ad8d75ffSSteven Rostedt 174ad8d75ffSSteven Rostedt TP_PROTO(unsigned long call_site, const void *ptr), 175ad8d75ffSSteven Rostedt 17653d0422cSLi Zefan TP_ARGS(call_site, ptr) 17753d0422cSLi Zefan ); 178ad8d75ffSSteven Rostedt 17953d0422cSLi Zefan DEFINE_EVENT(kmem_free, kmem_cache_free, 180ad8d75ffSSteven Rostedt 18153d0422cSLi Zefan TP_PROTO(unsigned long call_site, const void *ptr), 182ad8d75ffSSteven Rostedt 18353d0422cSLi Zefan TP_ARGS(call_site, ptr) 184ad8d75ffSSteven Rostedt ); 1854b4f278cSMel Gorman 1864b4f278cSMel Gorman TRACE_EVENT(mm_page_free_direct, 1874b4f278cSMel Gorman 1884b4f278cSMel Gorman TP_PROTO(struct page *page, unsigned int order), 1894b4f278cSMel Gorman 1904b4f278cSMel Gorman TP_ARGS(page, order), 1914b4f278cSMel Gorman 1924b4f278cSMel Gorman TP_STRUCT__entry( 1934b4f278cSMel Gorman __field( struct page *, page ) 1944b4f278cSMel Gorman __field( unsigned int, order ) 1954b4f278cSMel Gorman ), 1964b4f278cSMel Gorman 1974b4f278cSMel Gorman TP_fast_assign( 1984b4f278cSMel Gorman __entry->page = page; 1994b4f278cSMel Gorman __entry->order = order; 2004b4f278cSMel Gorman ), 2014b4f278cSMel Gorman 2024b4f278cSMel Gorman TP_printk("page=%p pfn=%lu order=%d", 2034b4f278cSMel Gorman __entry->page, 2044b4f278cSMel Gorman page_to_pfn(__entry->page), 2054b4f278cSMel Gorman __entry->order) 2064b4f278cSMel Gorman ); 2074b4f278cSMel Gorman 2084b4f278cSMel Gorman TRACE_EVENT(mm_pagevec_free, 2094b4f278cSMel Gorman 2104b4f278cSMel Gorman TP_PROTO(struct page *page, int cold), 2114b4f278cSMel Gorman 2124b4f278cSMel Gorman TP_ARGS(page, cold), 2134b4f278cSMel Gorman 2144b4f278cSMel Gorman TP_STRUCT__entry( 2154b4f278cSMel Gorman __field( struct page *, page ) 2164b4f278cSMel Gorman __field( int, cold ) 2174b4f278cSMel Gorman ), 2184b4f278cSMel Gorman 2194b4f278cSMel Gorman TP_fast_assign( 2204b4f278cSMel Gorman __entry->page = page; 2214b4f278cSMel Gorman __entry->cold = cold; 2224b4f278cSMel Gorman ), 2234b4f278cSMel Gorman 2244b4f278cSMel Gorman TP_printk("page=%p pfn=%lu order=0 cold=%d", 2254b4f278cSMel Gorman __entry->page, 2264b4f278cSMel Gorman page_to_pfn(__entry->page), 2274b4f278cSMel Gorman __entry->cold) 2284b4f278cSMel Gorman ); 2294b4f278cSMel Gorman 2304b4f278cSMel Gorman TRACE_EVENT(mm_page_alloc, 2314b4f278cSMel Gorman 2324b4f278cSMel Gorman TP_PROTO(struct page *page, unsigned int order, 2334b4f278cSMel Gorman gfp_t gfp_flags, int migratetype), 2344b4f278cSMel Gorman 2354b4f278cSMel Gorman TP_ARGS(page, order, gfp_flags, migratetype), 2364b4f278cSMel Gorman 2374b4f278cSMel Gorman TP_STRUCT__entry( 2384b4f278cSMel Gorman __field( struct page *, page ) 2394b4f278cSMel Gorman __field( unsigned int, order ) 2404b4f278cSMel Gorman __field( gfp_t, gfp_flags ) 2414b4f278cSMel Gorman __field( int, migratetype ) 2424b4f278cSMel Gorman ), 2434b4f278cSMel Gorman 2444b4f278cSMel Gorman TP_fast_assign( 2454b4f278cSMel Gorman __entry->page = page; 2464b4f278cSMel Gorman __entry->order = order; 2474b4f278cSMel Gorman __entry->gfp_flags = gfp_flags; 2484b4f278cSMel Gorman __entry->migratetype = migratetype; 2494b4f278cSMel Gorman ), 2504b4f278cSMel Gorman 2514b4f278cSMel Gorman TP_printk("page=%p pfn=%lu order=%d migratetype=%d gfp_flags=%s", 2524b4f278cSMel Gorman __entry->page, 2534b4f278cSMel Gorman page_to_pfn(__entry->page), 2544b4f278cSMel Gorman __entry->order, 2554b4f278cSMel Gorman __entry->migratetype, 2564b4f278cSMel Gorman show_gfp_flags(__entry->gfp_flags)) 2574b4f278cSMel Gorman ); 2584b4f278cSMel Gorman 25953d0422cSLi Zefan DECLARE_EVENT_CLASS(mm_page, 2600d3d062aSMel Gorman 2610d3d062aSMel Gorman TP_PROTO(struct page *page, unsigned int order, int migratetype), 2620d3d062aSMel Gorman 2630d3d062aSMel Gorman TP_ARGS(page, order, migratetype), 2640d3d062aSMel Gorman 2650d3d062aSMel Gorman TP_STRUCT__entry( 2660d3d062aSMel Gorman __field( struct page *, page ) 2670d3d062aSMel Gorman __field( unsigned int, order ) 2680d3d062aSMel Gorman __field( int, migratetype ) 2690d3d062aSMel Gorman ), 2700d3d062aSMel Gorman 2710d3d062aSMel Gorman TP_fast_assign( 2720d3d062aSMel Gorman __entry->page = page; 2730d3d062aSMel Gorman __entry->order = order; 2740d3d062aSMel Gorman __entry->migratetype = migratetype; 2750d3d062aSMel Gorman ), 2760d3d062aSMel Gorman 2770d3d062aSMel Gorman TP_printk("page=%p pfn=%lu order=%u migratetype=%d percpu_refill=%d", 2780d3d062aSMel Gorman __entry->page, 2790d3d062aSMel Gorman page_to_pfn(__entry->page), 2800d3d062aSMel Gorman __entry->order, 2810d3d062aSMel Gorman __entry->migratetype, 2820d3d062aSMel Gorman __entry->order == 0) 2830d3d062aSMel Gorman ); 2840d3d062aSMel Gorman 28553d0422cSLi Zefan DEFINE_EVENT(mm_page, mm_page_alloc_zone_locked, 2860d3d062aSMel Gorman 28753d0422cSLi Zefan TP_PROTO(struct page *page, unsigned int order, int migratetype), 28853d0422cSLi Zefan 28953d0422cSLi Zefan TP_ARGS(page, order, migratetype) 29053d0422cSLi Zefan ); 29153d0422cSLi Zefan 29253d0422cSLi Zefan DEFINE_EVENT_PRINT(mm_page, mm_page_pcpu_drain, 29353d0422cSLi Zefan 29453d0422cSLi Zefan TP_PROTO(struct page *page, unsigned int order, int migratetype), 2950d3d062aSMel Gorman 2960d3d062aSMel Gorman TP_ARGS(page, order, migratetype), 2970d3d062aSMel Gorman 2980d3d062aSMel Gorman TP_printk("page=%p pfn=%lu order=%d migratetype=%d", 29953d0422cSLi Zefan __entry->page, page_to_pfn(__entry->page), 30053d0422cSLi Zefan __entry->order, __entry->migratetype) 3010d3d062aSMel Gorman ); 3020d3d062aSMel Gorman 303e0fff1bdSMel Gorman TRACE_EVENT(mm_page_alloc_extfrag, 304e0fff1bdSMel Gorman 305e0fff1bdSMel Gorman TP_PROTO(struct page *page, 306e0fff1bdSMel Gorman int alloc_order, int fallback_order, 307e0fff1bdSMel Gorman int alloc_migratetype, int fallback_migratetype), 308e0fff1bdSMel Gorman 309e0fff1bdSMel Gorman TP_ARGS(page, 310e0fff1bdSMel Gorman alloc_order, fallback_order, 311e0fff1bdSMel Gorman alloc_migratetype, fallback_migratetype), 312e0fff1bdSMel Gorman 313e0fff1bdSMel Gorman TP_STRUCT__entry( 314e0fff1bdSMel Gorman __field( struct page *, page ) 315e0fff1bdSMel Gorman __field( int, alloc_order ) 316e0fff1bdSMel Gorman __field( int, fallback_order ) 317e0fff1bdSMel Gorman __field( int, alloc_migratetype ) 318e0fff1bdSMel Gorman __field( int, fallback_migratetype ) 319e0fff1bdSMel Gorman ), 320e0fff1bdSMel Gorman 321e0fff1bdSMel Gorman TP_fast_assign( 322e0fff1bdSMel Gorman __entry->page = page; 323e0fff1bdSMel Gorman __entry->alloc_order = alloc_order; 324e0fff1bdSMel Gorman __entry->fallback_order = fallback_order; 325e0fff1bdSMel Gorman __entry->alloc_migratetype = alloc_migratetype; 326e0fff1bdSMel Gorman __entry->fallback_migratetype = fallback_migratetype; 327e0fff1bdSMel Gorman ), 328e0fff1bdSMel Gorman 329e0fff1bdSMel Gorman TP_printk("page=%p pfn=%lu alloc_order=%d fallback_order=%d pageblock_order=%d alloc_migratetype=%d fallback_migratetype=%d fragmenting=%d change_ownership=%d", 330e0fff1bdSMel Gorman __entry->page, 331e0fff1bdSMel Gorman page_to_pfn(__entry->page), 332e0fff1bdSMel Gorman __entry->alloc_order, 333e0fff1bdSMel Gorman __entry->fallback_order, 334e0fff1bdSMel Gorman pageblock_order, 335e0fff1bdSMel Gorman __entry->alloc_migratetype, 336e0fff1bdSMel Gorman __entry->fallback_migratetype, 337e0fff1bdSMel Gorman __entry->fallback_order < pageblock_order, 338e0fff1bdSMel Gorman __entry->alloc_migratetype == __entry->fallback_migratetype) 339e0fff1bdSMel Gorman ); 340e0fff1bdSMel Gorman 341ad8d75ffSSteven Rostedt #endif /* _TRACE_KMEM_H */ 342ad8d75ffSSteven Rostedt 343ad8d75ffSSteven Rostedt /* This part must be outside protection */ 344ad8d75ffSSteven Rostedt #include <trace/define_trace.h> 345