Linux-Kernel

在linux核心中呼叫了trace_sched_wakeup,但似乎沒有在任何地方定義?

  • February 21, 2021

我試圖更好地了解喚醒在 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_EVENTlinux/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) { ... }

引用自:https://unix.stackexchange.com/questions/635687