我试图更好地了解唤醒在 Linux 内核中的工作原理,但我在这里注意到ttwu_do_wakeup()调用trace_sched_wakeup,但是这个函数似乎没有在linux内核中定义。 Elixir 浏览器说这个“标识符未被使用”,尽管有一个trace_sched_wakeup.c 文件。
我还尝试在我的机器上 grep 内核,但也没有找到任何定义了 trace_sched_wakeup 函数的地方。
这个函数调用是如何进行的呢?
任何想法表示赞赏。
谢谢。
答案1
trace_sched_wakeup()
定义于跟踪/事件/sched.h,第 96 行通过调用宏DEFINE_EVENT
:
DEFINE_EVENT(sched_wakeup_template, sched_wakeup,
TP_PROTO(struct task_struct *p),
TP_ARGS(p));
DEFINE_EVENT
定义于linux/tracepoint.h,第 520 行:
#define DEFINE_EVENT(template, name, proto, args) \
DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
DECLARE_TRACE
被定义为在第 395 行:
#define DECLARE_TRACE(name, proto, args) \
__DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \
cpu_online(raw_smp_processor_id()), \
PARAMS(void *__data, proto), \
PARAMS(__data, args))
最后__DECLARE_TRACE
定义了在第 231 行:
#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), 0); \
if (IS_ENABLED(CONFIG_LOCKDEP) && (cond)) { \
rcu_read_lock_sched_notrace(); \
rcu_dereference_sched(__tracepoint_##name.funcs);\
rcu_read_unlock_sched_notrace(); \
} \
} \
...
这实际上是trace_sched_wakeup()
这样定义的:
static inline void trace_sched_wakeup(struct task_struct *p) { ... }