БНФ: владелец карты

Это продолжение кто создает карту в BPF, поскольку мой новый вопрос не напрямую актуальной этой ветки.

Итак, мне кажется, что должна быть одна точка, где создается карта BPF, либо это программа bpf, либо пользовательская программа, которая загружает bpf и т. д.

Программа BPF должна знать тип карт, с которыми она будет работать, во время компиляции, поэтому нам нужно:

struct bpf_map_def SEC("maps") my_map = {
...
};

Таким образом, это означает, что пользовательская программа, например bpftool, инициирует создание карт, найденных в разделах bpf ELF, как показано в кто создает карту в потоке BPF.

С другой стороны, пользовательское приложение должно будет добавлять/удалять записи на карте. Чтобы это произошло, он должен знать ID карты, чтобы получить fd карты с bpf_map_get_fd_by_id() из libbpf. После этого мы можем наслаждаться bpf_map_update_elem() и подобными API.

С другой стороны, если мы объявили раздел карты в программе BPF и используем API карты, карты будут сохранены в ядре и им будут присвоены идентификаторы.

Итак, в этом случае у нас будет две карты с двумя разными идентификаторами: одна создана в результате bpf_prog_load() из bpftool, а другая из пользовательского приложения bpf_create_map() (при условии, что приложение продолжает работать, например, обновляет карты, и не вернуться в оболочку).

Должен ли быть способ обойти эту двусмысленность?


person Mark    schedule 05.01.2018    source источник


Ответы (1)


Я не совсем уверен, что понимаю ваш вопрос, позвольте мне попытаться перефразировать это.

  • Вы загружаете программу eBPF с помощью bpftool, которая создает все карты, необходимые программе. bpftool является приложением пользовательского пространства и в конечном итоге создает карты с помощью системного вызова bpf(BPF_MAP_CREATE, …).
  • У вас есть другое приложение пользовательского пространства foobar, которое взаимодействует с этими картами, возможно, с помощью libbpf (которая, в свою очередь, выполняет bpf(BPF_MAP_*, …) системных вызовов) для поиска, обновления или удаления элементов из карт.
  • Насколько я понимаю, это второе приложение foobar тоже пытается создавать карты. Следовательно, у вас есть конфликт между картами, созданными bpftool, и картой, созданной foobar.

Если это так, то решение «простое»: не создавать карты дважды.

Это означает, что вы должны либо удалить вызовы bpf_create_map() из другого вашего приложения foobar, либо загрузить в свои программы что-то другое, кроме bpftool. Обычно рабочий процесс состоит в том, что карты описываются в объектном файле eBPF и создаются тем же приложением, которое загружает программу, непосредственно перед загрузкой — это то, что делает bpftool. Тогда приложение имеет дескриптор файла для карты и может работать с ним.

В качестве альтернативы можно закрепить карту в виртуальной файловой системе BPF (/sys/fs/bpf/), чтобы другое приложение могло получить дескриптор файла, а также получить доступ к этой карте. Это делается с помощью системного вызова bpf(BPF_OBJ_GET, …) (в настоящее время он еще не задокументирован на справочной странице, по крайней мере, в моей системе).

Если я прав, использование закрепленных карт также может позволить повторно использовать уже существующую карту при загрузке новой программы eBPF. Я полагаю, что tc из пакета iproute2 намеревается сделать это, если описанная карта существует и уже закреплена (см. файл lib/bpf.c, но код не совсем легко читается). Обычно это делается во время переезда.

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

Надеюсь это поможет!

person Qeole    schedule 05.01.2018