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

时间:2019-07-01 05:09:07

标签: ebpf

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

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

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

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

不,不是。

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

owner_prog_type

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

请注意,如结构的/* '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 */ 所示,也不可能混合JIT版本的程序和非JIT版本的程序。