Есть ли надежный способ явно указать порядок выполнения программ BPF kprobe (без kretprobes).
Например, когда я называю программы как kprobe__<func>_1
и kprobe__<func>_2
, я получаю порядок выполнения вроде kprobe__<func>_2
-> kprobe__<func>_1
, то есть в обратном порядке. Имеет ли значение порядок загрузки программ или их название? Я не могу найти никакой документации по этому поводу и не знаю, как убедиться, что мои программы будут выполняться так, как мне действительно нужно, на целых ядрах.
Я просто пытался переименовать свои функции с суффиксами _[n]
, где n
- строго положительное число (включая ноль), и это работает, но не дает уверенности, что оно будет работать на всех ядрах одинаково.
Невозможно гарантировать определенный порядок выполнения программ kprobe, поскольку порядок может различаться в разных версиях ядра. Даже если полагаться на соглашения об именах или порядок загрузки программ, это не гарантирует определенного порядка выполнения.
Поэтому целесообразно разрабатывать программы kprobe, независимые друг от друга в порядке выполнения, или объединять их в одну.
Я не думаю, что вы можете что-то сделать с этим, кроме как не поддерживать версии, которые портировали BPF. Поскольку гарантий не существует, для заказа вам не повезло.
К сожалению, это необходимо, потому что старое ядро с бэк-портом bpf (например, centos 3.10) имеет ограничения по размеру проги и не поддерживает
bpf_tail_call