1c94fbe1dSSteven Rostedt /* 2c94fbe1dSSteven Rostedt * Because linux/module.h has tracepoints in the header, and ftrace.h 3de477254SPaul Gortmaker * used to include this file, define_trace.h includes linux/module.h 4c94fbe1dSSteven Rostedt * But we do not want the module.h to override the TRACE_SYSTEM macro 5c94fbe1dSSteven Rostedt * variable that define_trace.h is processing, so we only set it 6c94fbe1dSSteven Rostedt * when module events are being processed, which would happen when 7c94fbe1dSSteven Rostedt * CREATE_TRACE_POINTS is defined. 8c94fbe1dSSteven Rostedt */ 9c94fbe1dSSteven Rostedt #ifdef CREATE_TRACE_POINTS 107ead8b83SLi Zefan #undef TRACE_SYSTEM 117ead8b83SLi Zefan #define TRACE_SYSTEM module 12c94fbe1dSSteven Rostedt #endif 137ead8b83SLi Zefan 147ead8b83SLi Zefan #if !defined(_TRACE_MODULE_H) || defined(TRACE_HEADER_MULTI_READ) 157ead8b83SLi Zefan #define _TRACE_MODULE_H 167ead8b83SLi Zefan 177ead8b83SLi Zefan #include <linux/tracepoint.h> 187ead8b83SLi Zefan 197ead8b83SLi Zefan #ifdef CONFIG_MODULES 207ead8b83SLi Zefan 217ead8b83SLi Zefan struct module; 227ead8b83SLi Zefan 237ead8b83SLi Zefan #define show_module_flags(flags) __print_flags(flags, "", \ 247ead8b83SLi Zefan { (1UL << TAINT_PROPRIETARY_MODULE), "P" }, \ 2566cc69e3SMathieu Desnoyers { (1UL << TAINT_OOT_MODULE), "O" }, \ 267ead8b83SLi Zefan { (1UL << TAINT_FORCED_MODULE), "F" }, \ 2766cc69e3SMathieu Desnoyers { (1UL << TAINT_CRAP), "C" }, \ 28132e9a68SMathieu Desnoyers { (1UL << TAINT_UNSIGNED_MODULE), "E" }) 297ead8b83SLi Zefan 307ead8b83SLi Zefan TRACE_EVENT(module_load, 317ead8b83SLi Zefan 327ead8b83SLi Zefan TP_PROTO(struct module *mod), 337ead8b83SLi Zefan 347ead8b83SLi Zefan TP_ARGS(mod), 357ead8b83SLi Zefan 367ead8b83SLi Zefan TP_STRUCT__entry( 377ead8b83SLi Zefan __field( unsigned int, taints ) 387ead8b83SLi Zefan __string( name, mod->name ) 397ead8b83SLi Zefan ), 407ead8b83SLi Zefan 417ead8b83SLi Zefan TP_fast_assign( 427ead8b83SLi Zefan __entry->taints = mod->taints; 437ead8b83SLi Zefan __assign_str(name, mod->name); 447ead8b83SLi Zefan ), 457ead8b83SLi Zefan 467ead8b83SLi Zefan TP_printk("%s %s", __get_str(name), show_module_flags(__entry->taints)) 477ead8b83SLi Zefan ); 487ead8b83SLi Zefan 497ead8b83SLi Zefan TRACE_EVENT(module_free, 507ead8b83SLi Zefan 517ead8b83SLi Zefan TP_PROTO(struct module *mod), 527ead8b83SLi Zefan 537ead8b83SLi Zefan TP_ARGS(mod), 547ead8b83SLi Zefan 557ead8b83SLi Zefan TP_STRUCT__entry( 567ead8b83SLi Zefan __string( name, mod->name ) 577ead8b83SLi Zefan ), 587ead8b83SLi Zefan 597ead8b83SLi Zefan TP_fast_assign( 607ead8b83SLi Zefan __assign_str(name, mod->name); 617ead8b83SLi Zefan ), 627ead8b83SLi Zefan 637ead8b83SLi Zefan TP_printk("%s", __get_str(name)) 647ead8b83SLi Zefan ); 657ead8b83SLi Zefan 66eb0c5377SSteven Rostedt #ifdef CONFIG_MODULE_UNLOAD 67eb0c5377SSteven Rostedt /* trace_module_get/put are only used if CONFIG_MODULE_UNLOAD is defined */ 68eb0c5377SSteven Rostedt 69925684d6SLi Zefan DECLARE_EVENT_CLASS(module_refcnt, 707ead8b83SLi Zefan 71ae832d1eSLi Zefan TP_PROTO(struct module *mod, unsigned long ip), 727ead8b83SLi Zefan 73ae832d1eSLi Zefan TP_ARGS(mod, ip), 747ead8b83SLi Zefan 757ead8b83SLi Zefan TP_STRUCT__entry( 767ead8b83SLi Zefan __field( unsigned long, ip ) 777ead8b83SLi Zefan __field( int, refcnt ) 787ead8b83SLi Zefan __string( name, mod->name ) 797ead8b83SLi Zefan ), 807ead8b83SLi Zefan 817ead8b83SLi Zefan TP_fast_assign( 827ead8b83SLi Zefan __entry->ip = ip; 83*2f35c41fSMasami Hiramatsu __entry->refcnt = atomic_read(&mod->refcnt); 847ead8b83SLi Zefan __assign_str(name, mod->name); 857ead8b83SLi Zefan ), 867ead8b83SLi Zefan 877ead8b83SLi Zefan TP_printk("%s call_site=%pf refcnt=%d", 887ead8b83SLi Zefan __get_str(name), (void *)__entry->ip, __entry->refcnt) 897ead8b83SLi Zefan ); 907ead8b83SLi Zefan 91925684d6SLi Zefan DEFINE_EVENT(module_refcnt, module_get, 927ead8b83SLi Zefan 93ae832d1eSLi Zefan TP_PROTO(struct module *mod, unsigned long ip), 947ead8b83SLi Zefan 95ae832d1eSLi Zefan TP_ARGS(mod, ip) 96925684d6SLi Zefan ); 977ead8b83SLi Zefan 98925684d6SLi Zefan DEFINE_EVENT(module_refcnt, module_put, 997ead8b83SLi Zefan 100ae832d1eSLi Zefan TP_PROTO(struct module *mod, unsigned long ip), 1017ead8b83SLi Zefan 102ae832d1eSLi Zefan TP_ARGS(mod, ip) 1037ead8b83SLi Zefan ); 104eb0c5377SSteven Rostedt #endif /* CONFIG_MODULE_UNLOAD */ 1057ead8b83SLi Zefan 1067ead8b83SLi Zefan TRACE_EVENT(module_request, 1077ead8b83SLi Zefan 1087ead8b83SLi Zefan TP_PROTO(char *name, bool wait, unsigned long ip), 1097ead8b83SLi Zefan 1107ead8b83SLi Zefan TP_ARGS(name, wait, ip), 1117ead8b83SLi Zefan 1127ead8b83SLi Zefan TP_STRUCT__entry( 1137ead8b83SLi Zefan __field( unsigned long, ip ) 114b5e3008eSDavid Sharp __field( bool, wait ) 1157ead8b83SLi Zefan __string( name, name ) 1167ead8b83SLi Zefan ), 1177ead8b83SLi Zefan 1187ead8b83SLi Zefan TP_fast_assign( 1197ead8b83SLi Zefan __entry->ip = ip; 120b5e3008eSDavid Sharp __entry->wait = wait; 1217ead8b83SLi Zefan __assign_str(name, name); 1227ead8b83SLi Zefan ), 1237ead8b83SLi Zefan 1247ead8b83SLi Zefan TP_printk("%s wait=%d call_site=%pf", 1257ead8b83SLi Zefan __get_str(name), (int)__entry->wait, (void *)__entry->ip) 1267ead8b83SLi Zefan ); 1277ead8b83SLi Zefan 1287ead8b83SLi Zefan #endif /* CONFIG_MODULES */ 1297ead8b83SLi Zefan 1307ead8b83SLi Zefan #endif /* _TRACE_MODULE_H */ 1317ead8b83SLi Zefan 1327ead8b83SLi Zefan /* This part must be outside protection */ 1337ead8b83SLi Zefan #include <trace/define_trace.h> 134