轉自:https://blog.csdn.net/u014089131/article/details/73907995
在kernel中經常會看到trace_XX形式的函數,但是又找不到它的定義。 這個其實是kernel的tracepoint,定義在include/linux/tracepoint.h中。 #define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \ extern struct tracepoint __tracepoint_##name; \ static inline void trace_##name(proto) \ { \ if (static_key_false(&__tracepoint_##name.key)) \ __DO_TRACE(&__tracepoint_##name, \ TP_PROTO(data_proto), \ TP_ARGS(data_args), \ TP_CONDITION(cond),,); \ } \ __DECLARE_TRACE_RCU(name, PARAMS(proto), PARAMS(args), \ PARAMS(cond), PARAMS(data_proto), PARAMS(data_args)) \ static inline int \ register_trace_##name(void (*probe)(data_proto), void *data) \ { \ return tracepoint_probe_register(#name, (void *)probe, \ data); \ } \ static inline int \ unregister_trace_##name(void (*probe)(data_proto), void *data) \ { \ return tracepoint_probe_unregister(#name, (void *)probe, \ data); \ } \ static inline void \ check_trace_callback_type_##name(void (*cb)(data_proto)) \ { \ } \ static inline bool \ trace_##name##_enabled(void) \ { \ return static_key_false(&__tracepoint_##name.key); \ } 這些trace_開頭的函數是由上面這個宏來定義的。 trace_要想起作用,需要調用register_trace_##name,給他關聯一個probe函數, 當調用trace_時就執行probe函數,否則這個trace_不會起實際作用。
