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