AF-XDP: внедрение общих Umem-сокетов - PullRequest
0 голосов
/ 10 марта 2020

Я хочу реализовать XDP_SHARED_UMEM: https://www.kernel.org/doc/html/latest/networking/af_xdp.html#xdp -shared-umem-bind-flag

Библиотечная функция libbpf xsk_socket__create (https://github.com/libbpf/libbpf/blob/master/src/xsk.c) проверяет значение xsk_umem->refcount. Если оно больше 1, устанавливается XDP_SHARED_UMEM параметр struct sockaddr_xdp.

Так что, насколько я понимаю, мне просто нужно передать исходную структуру umem сокета I хочу поделиться с umem, а остальное делает libbpf.

Я пытался сделать так, чтобы первый процесс скопировал свою umem -структуру в область разделяемой памяти, где Второй процесс может загрузить его из. Но поскольку struct xsk_umem определено в xsk.c, оно скрыто от пользователя, и я не могу сделать что-то вроде этого:

memcpy(shdm_ptr, umem, sizeof(struct xsk_umem))

Я не знаю, как они ожидаете, что кто-то будет использовать функцию общего доступа umem?

1 Ответ

1 голос
/ 12 марта 2020

Итак, это обсуждалось в списке рассылки xdp-newbies . Отчет здесь для записи.

Не рекомендуется go с многопроцессорной настройкой, как вы пытаетесь это сделать. Бьорн говорит:

Обратите внимание, что если вы хотите выполнить настройку с несколькими процессами с общим умом, вам: необходим процесс управления, который управляет заполнением / завершением звонит и синхронизирует между процессами, ИЛИ повторно отображает кольцо заполнения / завершения из сокета, которому принадлежит umem, в нескольких процессах и синхронизируют доступ к ним. Ни то, ни другое не радует.

Честно говоря, я бы не рекомендовал такую ​​установку.

И он добавляет:

Просто для полноты; Чтобы настроить общий umem:

  1. создайте сокет 0 и зарегистрируйте umem для этого.
  2. mmap для fr / cr с использованием сокета 0
  3. create socket 1, 2, n и обратитесь к сокету 0 для обозначения.

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

Я не советую идти по этому пути.

(Кредиты Бьёрну.)

...