X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fmlx5%2Fmlx5_rxq.c;h=bd26ee2fe7ee43c045d3d22d070a4a3f4d8fb742;hb=50c00baff763532a1397958baa5ac0521c71ed0e;hp=dc878f2411643a521e5afc8c3cf461cfad70782c;hpb=721c953018205e228ab87a5e46d053ce7a6f02f6;p=dpdk.git diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c index dc878f2411..bd26ee2fe7 100644 --- a/drivers/net/mlx5/mlx5_rxq.c +++ b/drivers/net/mlx5/mlx5_rxq.c @@ -1543,37 +1543,35 @@ exit: 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",