net/mlx5: limit LRO size to maximum Rx packet
The field max_rx_pkt_len in Rx configuration indicates the maximum size for Rx packet to be received. There was no any field to indicate the maximum size of LRO packet to be received by the application. Assuming the user configures max_rx_pkt_len as the maximum LRO packet length when LRO is configured on the port, the PMD limits the maximum LRO packet size received from HW to be max_rx_pkt_len. Signed-off-by: Matan Azrad <matan@mellanox.com> Acked-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
This commit is contained in:
parent
721c953018
commit
50c00baff7
@ -1465,6 +1465,11 @@ enum {
|
||||
MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST = 0x2,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_LRO_MAX_MSG_SIZE_START_FROM_L4 = 0x0,
|
||||
MLX5_LRO_MAX_MSG_SIZE_START_FROM_L2 = 0x1,
|
||||
};
|
||||
|
||||
struct mlx5_ifc_tirc_bits {
|
||||
u8 reserved_at_0[0x20];
|
||||
u8 disp_type[0x4];
|
||||
|
@ -1543,37 +1543,35 @@ mlx5_mprq_alloc_mp(struct rte_eth_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define MLX5_MAX_LRO_SIZE (UINT8_MAX * 256u)
|
||||
#define MLX5_MAX_TCP_HDR_OFFSET ((unsigned int)(sizeof(struct rte_ether_hdr) + \
|
||||
sizeof(struct rte_vlan_hdr) * 2 + \
|
||||
sizeof(struct rte_ipv6_hdr)))
|
||||
/**
|
||||
* Adjust the maximum LRO massage size.
|
||||
* LRO massage is contained in the MPRQ strides.
|
||||
* While the LRO massage size cannot be bigger than 65280 according to the
|
||||
* PRM, the strides which contain it may be bigger.
|
||||
* Adjust the maximum LRO massage size to avoid the above option.
|
||||
*
|
||||
* @param dev
|
||||
* Pointer to Ethernet device.
|
||||
* @param strd_n
|
||||
* Number of strides per WQE..
|
||||
* @param strd_sz
|
||||
* The stride size.
|
||||
* @param max_lro_size
|
||||
* The maximum size for LRO packet.
|
||||
*/
|
||||
static void
|
||||
mlx5_max_lro_msg_size_adjust(struct rte_eth_dev *dev, uint32_t strd_n,
|
||||
uint32_t strd_sz)
|
||||
mlx5_max_lro_msg_size_adjust(struct rte_eth_dev *dev, uint32_t max_lro_size)
|
||||
{
|
||||
struct mlx5_priv *priv = dev->data->dev_private;
|
||||
uint32_t max_buf_len = strd_sz * strd_n;
|
||||
|
||||
if (max_buf_len > (uint64_t)UINT16_MAX)
|
||||
max_buf_len = RTE_ALIGN_FLOOR((uint32_t)UINT16_MAX, strd_sz);
|
||||
max_buf_len /= 256;
|
||||
max_buf_len = RTE_MIN(max_buf_len, (uint32_t)UINT8_MAX);
|
||||
assert(max_buf_len);
|
||||
if (priv->config.hca_attr.lro_max_msg_sz_mode ==
|
||||
MLX5_LRO_MAX_MSG_SIZE_START_FROM_L4 && max_lro_size >
|
||||
MLX5_MAX_TCP_HDR_OFFSET)
|
||||
max_lro_size -= MLX5_MAX_TCP_HDR_OFFSET;
|
||||
max_lro_size = RTE_MIN(max_lro_size, MLX5_MAX_LRO_SIZE);
|
||||
assert(max_lro_size >= 256u);
|
||||
max_lro_size /= 256u;
|
||||
if (priv->max_lro_msg_size)
|
||||
priv->max_lro_msg_size =
|
||||
RTE_MIN((uint32_t)priv->max_lro_msg_size, max_buf_len);
|
||||
RTE_MIN((uint32_t)priv->max_lro_msg_size, max_lro_size);
|
||||
else
|
||||
priv->max_lro_msg_size = max_buf_len;
|
||||
priv->max_lro_msg_size = max_lro_size;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1671,8 +1669,8 @@ mlx5_rxq_new(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
|
||||
tmpl->rxq.strd_headroom_en = strd_headroom_en;
|
||||
tmpl->rxq.mprq_max_memcpy_len = RTE_MIN(mb_len -
|
||||
RTE_PKTMBUF_HEADROOM, config->mprq.max_memcpy_len);
|
||||
mlx5_max_lro_msg_size_adjust(dev, (1 << tmpl->rxq.strd_num_n),
|
||||
(1 << tmpl->rxq.strd_sz_n));
|
||||
mlx5_max_lro_msg_size_adjust(dev, RTE_MIN(max_rx_pkt_len,
|
||||
(1u << tmpl->rxq.strd_num_n) * (1u << tmpl->rxq.strd_sz_n)));
|
||||
DRV_LOG(DEBUG,
|
||||
"port %u Rx queue %u: Multi-Packet RQ is enabled"
|
||||
" strd_num_n = %u, strd_sz_n = %u",
|
||||
|
Loading…
Reference in New Issue
Block a user