Нет, это не так.
Посмотрите на коммит ядра 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
структуры.