无法使用密件抄送工具将 eBPF `kretprobes` 附加到 `napi_poll()`

failing to attach eBPF `kretprobes` to `napi_poll()` with bcc tools

想法是使用 argdist 来测量 napi_poll() 的延迟持续时间,其中 returns 处理的数据包数量(称为工作)。 napi_poll() 的执行延迟与处理的数据包数量的比率将给我以直方图形式处理每个数据包所花费的平均时间。

我正在使用以下命令

argdist -H 'r:c:napi_poll():u64:$latency/$retval#avg time per packet (ns)' 最终给我错误 Failed to attach BPF to kprobe 并且在 dmesg 中我收到类似 Could not insert probe at napi_poll+0: -2

的消息

我很好奇为什么我不能将 kretprobes 附加到 napi_poll() 而类似的技巧与 net_rx_action() 一起使用?

大多数情况下 Failed to attach BPF to kprobe 错误是由内联函数引起的。如 Kprobes documentation (section Kprobes Features and Limitations), Kprobes will fail to attach if the target function was inlined. Since napi_poll is static 中所述,它可能已在编译时内联。

如果 napi_poll 是否内联,您可以检查内核符号:

$ cat /boot/System.map-`uname -r` | grep " napi_poll"
$
$ cat /boot/System.map-`uname -r` | grep " net_rx_action"
ffffffff817d8110 t net_rx_action

在我的系统上,napi_poll 是内联的,而 net_rx_action 不是。


这个问题有几种解决方法,具体取决于您的目标。

  1. 如果您不介意重新编译您的内核,您可以使用 Linux inline attribute 来确保 napi_poll 没有被内联。
  2. 如果您无法更改内核,通常的解决方法是找到 napi_poll 的调用函数来提供相同的信息。 napi_poll 调用的函数如果提供足够的信息并且本身没有内联,也可以工作。