Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Because linux/module.h has tracepoints in the header, and ftrace.h
0004  * used to include this file, define_trace.h includes linux/module.h
0005  * But we do not want the module.h to override the TRACE_SYSTEM macro
0006  * variable that define_trace.h is processing, so we only set it
0007  * when module events are being processed, which would happen when
0008  * CREATE_TRACE_POINTS is defined.
0009  */
0010 #ifdef CREATE_TRACE_POINTS
0011 #undef TRACE_SYSTEM
0012 #define TRACE_SYSTEM module
0013 #endif
0014 
0015 #if !defined(_TRACE_MODULE_H) || defined(TRACE_HEADER_MULTI_READ)
0016 #define _TRACE_MODULE_H
0017 
0018 #include <linux/tracepoint.h>
0019 
0020 #ifdef CONFIG_MODULES
0021 
0022 struct module;
0023 
0024 #define show_module_flags(flags) __print_flags(flags, "",   \
0025     { (1UL << TAINT_PROPRIETARY_MODULE),    "P" },      \
0026     { (1UL << TAINT_OOT_MODULE),        "O" },      \
0027     { (1UL << TAINT_FORCED_MODULE),     "F" },      \
0028     { (1UL << TAINT_CRAP),          "C" },      \
0029     { (1UL << TAINT_UNSIGNED_MODULE),   "E" })
0030 
0031 TRACE_EVENT(module_load,
0032 
0033     TP_PROTO(struct module *mod),
0034 
0035     TP_ARGS(mod),
0036 
0037     TP_STRUCT__entry(
0038         __field(    unsigned int,   taints      )
0039         __string(   name,       mod->name   )
0040     ),
0041 
0042     TP_fast_assign(
0043         __entry->taints = mod->taints;
0044         __assign_str(name, mod->name);
0045     ),
0046 
0047     TP_printk("%s %s", __get_str(name), show_module_flags(__entry->taints))
0048 );
0049 
0050 TRACE_EVENT(module_free,
0051 
0052     TP_PROTO(struct module *mod),
0053 
0054     TP_ARGS(mod),
0055 
0056     TP_STRUCT__entry(
0057         __string(   name,       mod->name   )
0058     ),
0059 
0060     TP_fast_assign(
0061         __assign_str(name, mod->name);
0062     ),
0063 
0064     TP_printk("%s", __get_str(name))
0065 );
0066 
0067 #ifdef CONFIG_MODULE_UNLOAD
0068 /* trace_module_get/put are only used if CONFIG_MODULE_UNLOAD is defined */
0069 
0070 DECLARE_EVENT_CLASS(module_refcnt,
0071 
0072     TP_PROTO(struct module *mod, unsigned long ip),
0073 
0074     TP_ARGS(mod, ip),
0075 
0076     TP_STRUCT__entry(
0077         __field(    unsigned long,  ip      )
0078         __field(    int,        refcnt      )
0079         __string(   name,       mod->name   )
0080     ),
0081 
0082     TP_fast_assign(
0083         __entry->ip = ip;
0084         __entry->refcnt = atomic_read(&mod->refcnt);
0085         __assign_str(name, mod->name);
0086     ),
0087 
0088     TP_printk("%s call_site=%ps refcnt=%d",
0089           __get_str(name), (void *)__entry->ip, __entry->refcnt)
0090 );
0091 
0092 DEFINE_EVENT(module_refcnt, module_get,
0093 
0094     TP_PROTO(struct module *mod, unsigned long ip),
0095 
0096     TP_ARGS(mod, ip)
0097 );
0098 
0099 DEFINE_EVENT(module_refcnt, module_put,
0100 
0101     TP_PROTO(struct module *mod, unsigned long ip),
0102 
0103     TP_ARGS(mod, ip)
0104 );
0105 #endif /* CONFIG_MODULE_UNLOAD */
0106 
0107 TRACE_EVENT(module_request,
0108 
0109     TP_PROTO(char *name, bool wait, unsigned long ip),
0110 
0111     TP_ARGS(name, wait, ip),
0112 
0113     TP_STRUCT__entry(
0114         __field(    unsigned long,  ip      )
0115         __field(    bool,       wait        )
0116         __string(   name,       name        )
0117     ),
0118 
0119     TP_fast_assign(
0120         __entry->ip = ip;
0121         __entry->wait   = wait;
0122         __assign_str(name, name);
0123     ),
0124 
0125     TP_printk("%s wait=%d call_site=%ps",
0126           __get_str(name), (int)__entry->wait, (void *)__entry->ip)
0127 );
0128 
0129 #endif /* CONFIG_MODULES */
0130 
0131 #endif /* _TRACE_MODULE_H */
0132 
0133 /* This part must be outside protection */
0134 #include <trace/define_trace.h>