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

时间:2017-12-24 19:37:10

标签: linux-kernel bpf ebpf

想法是使用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()

1 个答案:

答案 0 :(得分:2)

大多数情况下Failed to attach BPF to kprobe错误是由内联函数引起的。正如Kprobes documentationKprobes Features and Limitations部分)中所述,如果内联目标函数,Kprobes将无法附加。从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调用的函数如果提供了足够的信息并且没有内联,也可以工作。