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

Linux kernel 无法使用bcc工具将eBPF`kretprobes`附加到`napi_poll()`上,linux-kernel,bpf,ebpf,bcc-bpf,Linux Kernel,Bpf,Ebpf,Bcc Bpf,这个想法是使用argdist来测量napi_poll()的延迟持续时间,它返回处理的数据包数(称为work)。napi_poll()的执行延迟与处理的数据包数量之比将给出以直方图形式处理每个数据包所需的平均时间 我使用以下命令 argdist-H'r:c:napi_poll():u64:$latency/$retval#每个数据包的平均时间(ns)' 这导致我出现错误无法将BPF连接到kprobe并且在dmesg中我收到类似无法在napi_poll+0处插入探针的消息:-2 我只是好奇为什么我

这个想法是使用
argdist
来测量
napi_poll()
的延迟持续时间,它返回处理的数据包数(称为work)。
napi_poll()
的执行延迟与处理的数据包数量之比将给出以直方图形式处理每个数据包所需的平均时间

我使用以下命令

argdist-H'r:c:napi_poll():u64:$latency/$retval#每个数据包的平均时间(ns)'
这导致我出现错误
无法将BPF连接到kprobe
并且在dmesg中我收到类似
无法在napi_poll+0处插入探针的消息:-2


我只是好奇为什么我不能将
kretprobes
附加到
napi\u poll()
,当类似的技巧与
net\u rx\u action()一起工作时?

大多数时候,
未能将BPF附加到kprobe上的错误是由内联函数引起的。如(部分
Kprobes功能和限制
)中所述,如果目标函数是内联的,Kprobes将无法连接。因为,它可能是在编译时内联的

如果已内联或未内联,则可以签入内核符号:

$ 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\u poll
是内联的,而
net\u rx\u action
不是


根据您的目标,有几种解决此问题的方法

  • 如果您不介意重新编译内核,可以使用来确保
    napi\u poll
    未内联
  • 如果无法更改内核,通常的解决方法是找到提供相同信息的调用函数
    napi_poll
    。如果
    napi_poll
    调用的函数提供了足够的信息并且本身没有内联,那么它也可以工作

  • 你能用一个更简单的工具试试吗?例如,
    funcount napi\u poll
    。在我的系统上,
    napi\u poll
    不起作用,但
    net\u rx\u action
    起作用。可能只是因为其中一个是内联的,而不是另一个。我认为你关于函数的内联性是正确的,因为我尝试了其他方法,napi_poll从未奏效。我将写一个完整的答案,并给出建议,但不幸的是,如果你不能截取函数,你将无能为力。