Можно ли вызвать коды eBPF, которые используют разные режимы? - PullRequest
1 голос
/ 01 июля 2019

Можно ли вызвать хвостовые коды eBPF, которые используют разные режимы?

Например, если бы я закодировал код, который printk ("hello world"), используя kprobe,

был бы яв состоянии выполнить вызов XDP-кода впоследствии или наоборот?

Я запрограммировал что-то для eBPF, которое использует буфер сокетов и похоже, что когда я пытаюсь выполнить хвостовой вызов другого кода, который использует kprobe, он не загружает программу.

Я хотел выполнить хвостовой вызов кода, который использует XDP_PASS после использования режима BPF.SOCKET_FILTER, но кажется, что хвостовой вызов не работает.

Я пытался выяснить это, ноЯ не могу найти никаких документов, касающихся оконечных телефонных кодов, которые используют разные режимы: P

Заранее спасибо!

1 Ответ

1 голос
/ 01 июля 2019

Нет, это не так.

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

...