2

是否可以尾调用使用不同模式的 eBPF 代码?

例如,如果我使用 kprobe 编写了 printk("hello world") 的代码,

之后我是否可以尾调用 XDP 代码,反之亦然?

我在 eBPF 上编写了一些使用套接字缓冲区的程序,似乎当我尝试尾调用另一个使用 kprobe 的代码时,它不会加载程序。

我想在使用 BPF.SOCKET_FILTER 模式后尾调用使用 XDP_PASS 的代码,但似乎尾调用不起作用。

我一直试图弄清楚这一点,但我找不到任何关于使用不同模式的尾调用代码的文档:P

提前致谢!

4

1 回答 1

4

不它不是。

看看内核提交04fd61ab36ec,它引入了尾调用:第一段代码中的注释(在内部内核头文件 bpf.h 中)定义了struct bpf_array,设置了一个owner_prog_type成员,并在注释中解释了以下内容:

/* 'ownership' of prog_array is claimed by the first program that
 * is going to use this map or by the first program which FD is stored
 * in the map to make sure that all callers and callees have the same
 * prog_type and JITed flag
 */

因此,一旦定义了与用于尾调用的 BPF 程序数组关联的程序类型,就不能将其与其他程序类型一起使用。这是有道理的,因为不同的程序类型使用不同的上下文(数据包数据 VS 跟踪函数上下文 VS ...),可以使用不同的帮助器,具有不同含义的返回函数,需要来自验证器的不同检查,......所以很难看看如何从一种类型跳转到另一种类型。你怎么能从处理一个网络数据包开始,然后突然跳转到一段应该跟踪内核内部的代码?:)

请注意,也不可能混合使用 JIT 和非 JIT 的程序,如owner_jitedstruct 所示。

于 2019-07-01T08:54:12.943 回答