0

我正在使用 Mellanox ConnectX-5 100G 开发 DPDK 程序。

我的程序启动了 N 个 worker(每个内核一个),每个 worker 处理自己的专用 TX 和 RX 队列,因此我需要设置 N TX 和 N RX 队列。

我正在使用 flow director 和 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返回: 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 函数(对于 DPDK 18.11)。

谢谢你的帮助!

4

1 回答 1

0

该问题与 MLX5 驱动程序的 TX 内联功能有关,该功能仅在队列数 >=8 时启用。TX 内联使用 DMA 将数据包直接发送到主机内存缓冲区。

使用 TX 内联,如果使用大量描述符,则底层动词库(在 QP 创建期间从 DPDK 调用)中的一些检查会失败。所以一种解决方法是使用更少的描述符。

我使用的是 32768 描述符,因为其中的广告价值dev_info.rx_desc_lim.nb_max更高。

使用 1024 描述符解决了该问题。

于 2019-04-10T19:54:39.987 回答