Trace_sched_wakeup은 Linux 커널에서 호출되지만 어디에도 정의되어 있지 않은 것 같습니까?

Trace_sched_wakeup은 Linux 커널에서 호출되지만 어디에도 정의되어 있지 않은 것 같습니까?

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) { ... }

관련 정보