Редактировать июнь 2019 года: Ограниченные циклы теперь загружены в ядро и доступны , начиная с Linux 5.2 ( commit ).
Оригинальный ответ:
Нет, в настоящий момент в программах eBPF петли не допускаются.Задние края не допускаются, поэтому верификатор ядра может убедиться, что программы завершают работу (и не вешают ядро).
Это может измениться в будущем, так как разработчики ядра работают над поддержкой для ограничительных циклов .
Существует два возможных обходных пути , о которых стоит упомянуть. Оба предполагают, что вы знаете, сколько раз вам придется «зацикливаться» при написании вашей программы.
Во-первых, есть исключение для обратных сторон в отношении функций.Это означает, что вы можете иметь функции и вызывать их несколько раз.Таким образом, вы можете иметь весь контент, который вы обычно помещаете в свой цикл в отдельную функцию, и вызывать эту функцию столько раз, сколько вы делаете цикл.
Во-вторых, вы можете писать зацикливается в вашем C-коде и просит clang развернуть их во время компиляции.Это выглядит следующим образом:
#pragma clang loop unroll(full)
for (i = 0; i < 4; i++) {
/* Do stuff ... */
}
Это означает, что в результирующем объектном файле функция будет развернута , она будет заменена полной серией выполняемых инструкций снет фактического обратного скачка.
На данный момент не существует решения для последовательности с произвольным числом циклов.