Linuxカーネルでwakeupがどのように機能するかをよりよく理解しようとしていますが、ここで見つけました。ttwu_do_wakeup()Trace_sched_wakeupが呼び出されますが、この関数はLinuxカーネルで定義されていないようです。 Elixir Browserでは、Trace_sched_wakeup.cファイルがあるにもかかわらず、「識別子は使用されません」と言います。
また、私のコンピュータでカーネルをgrepingしようとしましたが、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) { ... }