不它不是。
看看内核提交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_jited
struct 所示。