Linux-Kernel
在linux核心中呼叫了trace_sched_wakeup,但似乎沒有在任何地方定義?
我試圖更好地了解喚醒在 linux 核心中是如何工作的,但我注意到這裡ttwu_do_wakeup()呼叫了 trace_sched_wakeup,但是這個函式似乎沒有在 linux 核心中定義。儘管有一個 trace_sched_wakeup.c 文件,elixir 瀏覽器說這個“沒有使用標識符”。
我還嘗試在我的機器上 grep 核心,我也沒有找到任何定義 trace_sched_wakeup 函式的地方。
這個函式呼叫是如何進行的?
任何想法表示讚賞。
謝謝。
trace_sched_wakeup()
通過呼叫宏在trace/events/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))
最後,在第 231 行
__DECLARE_TRACE
定義:#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) { ... }