1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Because linux/module.h has tracepoints in the header, and ftrace.h 4*4882a593Smuzhiyun * used to include this file, define_trace.h includes linux/module.h 5*4882a593Smuzhiyun * But we do not want the module.h to override the TRACE_SYSTEM macro 6*4882a593Smuzhiyun * variable that define_trace.h is processing, so we only set it 7*4882a593Smuzhiyun * when module events are being processed, which would happen when 8*4882a593Smuzhiyun * CREATE_TRACE_POINTS is defined. 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun #ifdef CREATE_TRACE_POINTS 11*4882a593Smuzhiyun #undef TRACE_SYSTEM 12*4882a593Smuzhiyun #define TRACE_SYSTEM module 13*4882a593Smuzhiyun #endif 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #if !defined(_TRACE_MODULE_H) || defined(TRACE_HEADER_MULTI_READ) 16*4882a593Smuzhiyun #define _TRACE_MODULE_H 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #include <linux/tracepoint.h> 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #ifdef CONFIG_MODULES 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun struct module; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define show_module_flags(flags) __print_flags(flags, "", \ 25*4882a593Smuzhiyun { (1UL << TAINT_PROPRIETARY_MODULE), "P" }, \ 26*4882a593Smuzhiyun { (1UL << TAINT_OOT_MODULE), "O" }, \ 27*4882a593Smuzhiyun { (1UL << TAINT_FORCED_MODULE), "F" }, \ 28*4882a593Smuzhiyun { (1UL << TAINT_CRAP), "C" }, \ 29*4882a593Smuzhiyun { (1UL << TAINT_UNSIGNED_MODULE), "E" }) 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun TRACE_EVENT(module_load, 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun TP_PROTO(struct module *mod), 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun TP_ARGS(mod), 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun TP_STRUCT__entry( 38*4882a593Smuzhiyun __field( unsigned int, taints ) 39*4882a593Smuzhiyun __string( name, mod->name ) 40*4882a593Smuzhiyun ), 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun TP_fast_assign( 43*4882a593Smuzhiyun __entry->taints = mod->taints; 44*4882a593Smuzhiyun __assign_str(name, mod->name); 45*4882a593Smuzhiyun ), 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun TP_printk("%s %s", __get_str(name), show_module_flags(__entry->taints)) 48*4882a593Smuzhiyun ); 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun TRACE_EVENT(module_free, 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun TP_PROTO(struct module *mod), 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun TP_ARGS(mod), 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun TP_STRUCT__entry( 57*4882a593Smuzhiyun __string( name, mod->name ) 58*4882a593Smuzhiyun ), 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun TP_fast_assign( 61*4882a593Smuzhiyun __assign_str(name, mod->name); 62*4882a593Smuzhiyun ), 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun TP_printk("%s", __get_str(name)) 65*4882a593Smuzhiyun ); 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #ifdef CONFIG_MODULE_UNLOAD 68*4882a593Smuzhiyun /* trace_module_get/put are only used if CONFIG_MODULE_UNLOAD is defined */ 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun DECLARE_EVENT_CLASS(module_refcnt, 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun TP_PROTO(struct module *mod, unsigned long ip), 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun TP_ARGS(mod, ip), 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun TP_STRUCT__entry( 77*4882a593Smuzhiyun __field( unsigned long, ip ) 78*4882a593Smuzhiyun __field( int, refcnt ) 79*4882a593Smuzhiyun __string( name, mod->name ) 80*4882a593Smuzhiyun ), 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun TP_fast_assign( 83*4882a593Smuzhiyun __entry->ip = ip; 84*4882a593Smuzhiyun __entry->refcnt = atomic_read(&mod->refcnt); 85*4882a593Smuzhiyun __assign_str(name, mod->name); 86*4882a593Smuzhiyun ), 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun TP_printk("%s call_site=%ps refcnt=%d", 89*4882a593Smuzhiyun __get_str(name), (void *)__entry->ip, __entry->refcnt) 90*4882a593Smuzhiyun ); 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun DEFINE_EVENT(module_refcnt, module_get, 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun TP_PROTO(struct module *mod, unsigned long ip), 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun TP_ARGS(mod, ip) 97*4882a593Smuzhiyun ); 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun DEFINE_EVENT(module_refcnt, module_put, 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun TP_PROTO(struct module *mod, unsigned long ip), 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun TP_ARGS(mod, ip) 104*4882a593Smuzhiyun ); 105*4882a593Smuzhiyun #endif /* CONFIG_MODULE_UNLOAD */ 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun TRACE_EVENT(module_request, 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun TP_PROTO(char *name, bool wait, unsigned long ip), 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun TP_ARGS(name, wait, ip), 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun TP_STRUCT__entry( 114*4882a593Smuzhiyun __field( unsigned long, ip ) 115*4882a593Smuzhiyun __field( bool, wait ) 116*4882a593Smuzhiyun __string( name, name ) 117*4882a593Smuzhiyun ), 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun TP_fast_assign( 120*4882a593Smuzhiyun __entry->ip = ip; 121*4882a593Smuzhiyun __entry->wait = wait; 122*4882a593Smuzhiyun __assign_str(name, name); 123*4882a593Smuzhiyun ), 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun TP_printk("%s wait=%d call_site=%ps", 126*4882a593Smuzhiyun __get_str(name), (int)__entry->wait, (void *)__entry->ip) 127*4882a593Smuzhiyun ); 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun #endif /* CONFIG_MODULES */ 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #endif /* _TRACE_MODULE_H */ 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun /* This part must be outside protection */ 134*4882a593Smuzhiyun #include <trace/define_trace.h> 135