de47725421
The <linux/module.h> pretty much brings in the kitchen sink along with it, so it should be avoided wherever reasonably possible in terms of being included from other commonly used <linux/something.h> files, as it results in a measureable increase on compile times. The worst culprit was probably device.h since it is used everywhere. This file also had an implicit dependency/usage of mutex.h which was masked by module.h, and is also fixed here at the same time. There are over a dozen other headers that simply declare the struct instead of pulling in the whole file, so follow their lead and simply make it a few more. Most of the implicit dependencies on module.h being present by these headers pulling it in have been now weeded out, so we can finally make this change with hopefully minimal breakage. Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
131 lines
2.7 KiB
C
131 lines
2.7 KiB
C
/*
|
|
* Because linux/module.h has tracepoints in the header, and ftrace.h
|
|
* used to include this file, define_trace.h includes linux/module.h
|
|
* But we do not want the module.h to override the TRACE_SYSTEM macro
|
|
* variable that define_trace.h is processing, so we only set it
|
|
* when module events are being processed, which would happen when
|
|
* CREATE_TRACE_POINTS is defined.
|
|
*/
|
|
#ifdef CREATE_TRACE_POINTS
|
|
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM module
|
|
#endif
|
|
|
|
#if !defined(_TRACE_MODULE_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _TRACE_MODULE_H
|
|
|
|
#include <linux/tracepoint.h>
|
|
|
|
#ifdef CONFIG_MODULES
|
|
|
|
struct module;
|
|
|
|
#define show_module_flags(flags) __print_flags(flags, "", \
|
|
{ (1UL << TAINT_PROPRIETARY_MODULE), "P" }, \
|
|
{ (1UL << TAINT_FORCED_MODULE), "F" }, \
|
|
{ (1UL << TAINT_CRAP), "C" })
|
|
|
|
TRACE_EVENT(module_load,
|
|
|
|
TP_PROTO(struct module *mod),
|
|
|
|
TP_ARGS(mod),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( unsigned int, taints )
|
|
__string( name, mod->name )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->taints = mod->taints;
|
|
__assign_str(name, mod->name);
|
|
),
|
|
|
|
TP_printk("%s %s", __get_str(name), show_module_flags(__entry->taints))
|
|
);
|
|
|
|
TRACE_EVENT(module_free,
|
|
|
|
TP_PROTO(struct module *mod),
|
|
|
|
TP_ARGS(mod),
|
|
|
|
TP_STRUCT__entry(
|
|
__string( name, mod->name )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__assign_str(name, mod->name);
|
|
),
|
|
|
|
TP_printk("%s", __get_str(name))
|
|
);
|
|
|
|
#ifdef CONFIG_MODULE_UNLOAD
|
|
/* trace_module_get/put are only used if CONFIG_MODULE_UNLOAD is defined */
|
|
|
|
DECLARE_EVENT_CLASS(module_refcnt,
|
|
|
|
TP_PROTO(struct module *mod, unsigned long ip),
|
|
|
|
TP_ARGS(mod, ip),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( unsigned long, ip )
|
|
__field( int, refcnt )
|
|
__string( name, mod->name )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->ip = ip;
|
|
__entry->refcnt = __this_cpu_read(mod->refptr->incs) + __this_cpu_read(mod->refptr->decs);
|
|
__assign_str(name, mod->name);
|
|
),
|
|
|
|
TP_printk("%s call_site=%pf refcnt=%d",
|
|
__get_str(name), (void *)__entry->ip, __entry->refcnt)
|
|
);
|
|
|
|
DEFINE_EVENT(module_refcnt, module_get,
|
|
|
|
TP_PROTO(struct module *mod, unsigned long ip),
|
|
|
|
TP_ARGS(mod, ip)
|
|
);
|
|
|
|
DEFINE_EVENT(module_refcnt, module_put,
|
|
|
|
TP_PROTO(struct module *mod, unsigned long ip),
|
|
|
|
TP_ARGS(mod, ip)
|
|
);
|
|
#endif /* CONFIG_MODULE_UNLOAD */
|
|
|
|
TRACE_EVENT(module_request,
|
|
|
|
TP_PROTO(char *name, bool wait, unsigned long ip),
|
|
|
|
TP_ARGS(name, wait, ip),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( unsigned long, ip )
|
|
__field( bool, wait )
|
|
__string( name, name )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->ip = ip;
|
|
__entry->wait = wait;
|
|
__assign_str(name, name);
|
|
),
|
|
|
|
TP_printk("%s wait=%d call_site=%pf",
|
|
__get_str(name), (int)__entry->wait, (void *)__entry->ip)
|
|
);
|
|
|
|
#endif /* CONFIG_MODULES */
|
|
|
|
#endif /* _TRACE_MODULE_H */
|
|
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|