Linux 커널에서 wakeup이 어떻게 작동하는지 더 잘 이해하려고 노력 중인데 여기서 발견했습니다.ttwu_do_wakeup()Trace_sched_wakeup이 호출되는데, 이 함수는 리눅스 커널에 정의되어 있지 않은 것 같습니다. 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) { ... }