在linux内核中调用了trace_sched_wakeup,但似乎没有在任何地方定义?

在linux内核中调用了trace_sched_wakeup,但似乎没有在任何地方定义?

我试图更好地了解唤醒在 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) { ... }

相关内容