Драйвер DPDK MLX5 - ошибка создания QP
Я разрабатываю программу DPDK с использованием Mellanox ConnectX-5 100G.
Моя программа запускает N рабочих (по одному на ядро), и каждый рабочий имеет свои собственные выделенные очереди TX и RX, поэтому мне нужно настроить N TX и N RX очередей.
Я использую API-интерфейс flow Director и rte_flow для отправки входящего трафика в разные очереди.
Для каждой очереди RX я создаю пул mbuf с:
n = 262144
cache size = 512
priv_size = 0
data_room_size = RTE_MBUF_DEFAULT_BUF_SIZE
Для N<=4 все работает нормально, но с N=8, rte_eth_dev_start
возвращает:Unknown error -12
и следующее сообщение журнала:
net_mlx5: port 0 Tx queue 0 QP creation failure
net_mlx5: port 0 Tx queue allocation failed: Cannot allocate memory
Я старался:
- увеличить количество огромных страниц (до 64x1G)
- изменить размер пула разными способами
- оба DPDK 18.05 и 18.11
- изменить количество дескрипторов TX/RX с 32768 на 16384
но безуспешно
Вы можете увидеть мою функцию port_init здесь (для DPDK 18.11).
Спасибо за вашу помощь!
0 ответов
Эта проблема связана с функцией вставки TX драйвера MLX5, которая включается только тогда, когда количество очередей>=8. TX inline использует DMA для отправки пакета непосредственно в буфер памяти хоста.
С TX-инлайнингом есть некоторые проверки, которые не проходят в базовой библиотеке глаголов (которая вызывается из DPDK во время создания QP), если используется большое количество дескрипторов. Таким образом, обходной путь должен использовать меньше дескрипторов.
Я использовал 32768 дескрипторов, так как объявленное значение в dev_info.rx_desc_lim.nb_max
выше.
Проблема решена с использованием 1024 дескрипторов.