是否可以对使用不同模式的eBPF代码进行尾部调用?
例如,如果我使用kprobe编码了printk(“ hello world”)的代码,
之后我是否可以尾部调用XDP代码?反之亦然?
我在eBPF上使用套接字缓冲区编程了一些东西,当我尝试尾部调用另一个使用kprobe的代码时,它不会加载程序。
我想在使用BPF.SOCKET_FILTER模式后对使用XDP_PASS的代码进行尾部调用,但似乎尾部调用不起作用。
我一直试图弄清楚这一点,但找不到有关使用不同模式的尾调用代码的任何文档:P
谢谢!
答案 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版本的程序。