Разрешены ли циклы в программе ядра eBPF? - PullRequest
0 голосов
/ 13 мая 2019

Я думаю о решении репликации пакетов в ядре и пересылке на 5 хостов (одноадресная передача).Планирую использовать для него eBPF / XDP.

Я пытаюсь выполнить цикл 5 раз, и внутри цикла я планирую клонировать пакет, изменить IP-адрес DST, обновить cksum и передать пакет.на тот же intf он был получен.

Я где-то читал, что циклы не могут быть использованы в XDP, поэтому не уверен, будет ли это работать?

Нужна консультация специалиста, пожалуйста.

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

Редактировать июнь 2019 года: Ограниченные циклы теперь загружены в ядро ​​и доступны , начиная с Linux 5.2 ( commit ).

Оригинальный ответ:

Нет, в настоящий момент в программах eBPF петли не допускаются.Задние края не допускаются, поэтому верификатор ядра может убедиться, что программы завершают работу (и не вешают ядро).

Это может измениться в будущем, так как разработчики ядра работают над поддержкой для ограничительных циклов .

Существует два возможных обходных пути , о которых стоит упомянуть. Оба предполагают, что вы знаете, сколько раз вам придется «зацикливаться» при написании вашей программы.

Во-первых, есть исключение для обратных сторон в отношении функций.Это означает, что вы можете иметь функции и вызывать их несколько раз.Таким образом, вы можете иметь весь контент, который вы обычно помещаете в свой цикл в отдельную функцию, и вызывать эту функцию столько раз, сколько вы делаете цикл.

Во-вторых, вы можете писать зацикливается в вашем C-коде и просит clang развернуть их во время компиляции.Это выглядит следующим образом:

#pragma clang loop unroll(full)
        for (i = 0; i < 4; i++) {
            /* Do stuff ... */
        }

Это означает, что в результирующем объектном файле функция будет развернута , она будет заменена полной серией выполняемых инструкций снет фактического обратного скачка.

На данный момент не существует решения для последовательности с произвольным числом циклов.

1 голос
/ 13 мая 2019

Технически, обратные края в графе потока управления программами байт-кода BPF запрещены, а не петли.Конкретно, это означает, что вы можете писать ограниченные циклы в C, но вы должны развернуть их во время компиляции.

Чтобы развернуть цикл, вы можете использовать Clang's #pragma unroll директива .Это должно работать для цикла с 5 итерациями, но не для очень длинных циклов.

...