无法使用 bcc 工具将 eBPF `kretprobes` 附加到 `napi_poll()`

Val*_*Roy 2 linux-kernel bpf ebpf bcc-bpf

想法是用来测量返回处理的数据包数量(称为工作)的argdist延迟持续时间。napi_poll()执行延迟与处理的数据包数量的比率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()

pch*_*gno 5

大多数情况下,Failed to attach BPF to kprobe错误是由内联函数引起的。正如Kprobes 文档(第 1 节Kprobes Features and Limitations)中所解释的,如果目标函数是内联的,Kprobes 将无法附加。由于napi_poll是 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
Run Code Online (Sandbox Code Playgroud)

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


此问题有多种解决方法,具体取决于您的目标。

  1. 如果您不介意重新编译内核,则可以使用Linuxinline属性来确保napi_poll不是内联的。
  2. 如果您无法更改内核,通常的解决方法是找到napi_poll提供相同信息的调用函数。如果调用 by 的函数napi_poll提供了足够的信息并且自身未内联,则该函数也可以工作。