DPDK MLX5 驱动程序 - QP 创建失败
DPDK MLX5 driver - QP creation failure
我正在使用 Mellanox ConnectX-5 100G 开发 DPDK 程序。
我的程序启动了 N 个 worker(每个内核一个),每个 worker 处理自己专用的 TX 和 RX 队列,因此我需要设置 N TX 和 N RX 队列。
我正在使用流导向器和 rte_flow API 将入口流量发送到不同的队列。
我为每个 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
returns:
Unknown error -12
和以下日志消息:
net_mlx5: port 0 Tx queue 0 QP creation failure
net_mlx5: port 0 Tx queue allocation failed: Cannot allocate memory
我试过了:
- 增加 Hugepages 的数量(最多 64x1G)
- 以不同方式更改池大小
- DPDK 18.05 和 18.11
- 将 TX/RX 描述符的数量从 32768 更改为 16384
但没有成功。
你可以看到我的port_init函数here(对于DPDK 18.11)。
感谢您的帮助!
该问题与 MLX5 驱动程序的 TX 内联功能有关,该功能仅在队列数 >=8 时启用。
TX 内联使用 DMA 将数据包直接发送到主机内存缓冲区。
使用 TX 内联,如果使用大量描述符,底层动词库(在 QP 创建期间从 DPDK 调用)中有一些检查会失败。因此,解决方法是使用更少的描述符。
我使用了 32768 个描述符,因为 dev_info.rx_desc_lim.nb_max
中的广告值更高。
问题已使用 1024 个描述符解决。
我正在使用 Mellanox ConnectX-5 100G 开发 DPDK 程序。
我的程序启动了 N 个 worker(每个内核一个),每个 worker 处理自己专用的 TX 和 RX 队列,因此我需要设置 N TX 和 N RX 队列。
我正在使用流导向器和 rte_flow API 将入口流量发送到不同的队列。
我为每个 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
returns:
Unknown error -12
和以下日志消息:
net_mlx5: port 0 Tx queue 0 QP creation failure
net_mlx5: port 0 Tx queue allocation failed: Cannot allocate memory
我试过了:
- 增加 Hugepages 的数量(最多 64x1G)
- 以不同方式更改池大小
- DPDK 18.05 和 18.11
- 将 TX/RX 描述符的数量从 32768 更改为 16384
但没有成功。
你可以看到我的port_init函数here(对于DPDK 18.11)。
感谢您的帮助!
该问题与 MLX5 驱动程序的 TX 内联功能有关,该功能仅在队列数 >=8 时启用。 TX 内联使用 DMA 将数据包直接发送到主机内存缓冲区。
使用 TX 内联,如果使用大量描述符,底层动词库(在 QP 创建期间从 DPDK 调用)中有一些检查会失败。因此,解决方法是使用更少的描述符。
我使用了 32768 个描述符,因为 dev_info.rx_desc_lim.nb_max
中的广告值更高。
问题已使用 1024 个描述符解决。