Hi, Lukáš

I think this message is important to notify users that something is going as 
not expected.
Either queue size or inline length should be adjusted by user/developer.
To suppress the message in your specific case (with max queue) the devarg 
"txq_inline_max=18"
can be used. So, the message encourages us to recognize the inline data length 
is truncated.

With best regards,
Slava

> -----Original Message-----
> From: Lukáš Šišmiš <sis...@cesnet.cz>
> Sent: Friday, April 25, 2025 2:55 PM
> To: Slava Ovsiienko <viachesl...@nvidia.com>; dev@dpdk.org
> Cc: Raslan Darawsheh <rasl...@nvidia.com>; Matan Azrad
> <ma...@nvidia.com>; Suanming Mou <suanmi...@nvidia.com>; Dariusz
> Sosnowski <dsosnow...@nvidia.com>
> Subject: Re: [PATCH v2] net/mlx5: mitigate the Tx queue parameter
> adjustment
> 
> Hello all,
> 
> I tested v1 patch on CX-4 card and I can confirm my application boots now!
> For traceability I am adding the original discussion thread:
> https://mails.dpdk.org/archives/users/2025-April/008242.html
> 
> Probably a some other problem, but it still outputs these logs:
> 
> Config: dpdk: 0000:b3:00.0: setting up TX queue 0: tx_desc: 32768 tx:
> offloads: 0x10000 hthresh: 0 pthresh: 0 wthresh: 0 tx_free_thresh: 0
> tx_rs_thresh: 0 txq_deferred_start: 0
> [DeviceConfigureQueues:runmode-dpdk.c:1487]
> mlx5_net: adjust txq_inline_max (290->18) due to large Tx queue on port 1
> Config: dpdk: 0000:b3:00.0: setting up TX queue 1: tx_desc: 32768 tx:
> offloads: 0x10000 hthresh: 0 pthresh: 0 wthresh: 0 tx_free_thresh: 0
> tx_rs_thresh: 0 txq_deferred_start: 0
> [DeviceConfigureQueues:runmode-dpdk.c:1487]
> mlx5_net: adjust txq_inline_max (290->18) due to large Tx queue on port 1
> Config: dpdk: 0000:b3:00.0: setting up TX queue 2: tx_desc: 32768 tx:
> offloads: 0x10000 hthresh: 0 pthresh: 0 wthresh: 0 tx_free_thresh: 0
> tx_rs_thresh: 0 txq_deferred_start: 0
> [DeviceConfigureQueues:runmode-dpdk.c:1487]
> mlx5_net: adjust txq_inline_max (290->18) due to large Tx queue on port 1
> 
> Is there any way how I can avoid these logs?
> 
> Thank you.
> 
> Lukas
> 
> On 4/24/25 15:31, Viacheslav Ovsiienko wrote:
> > he DPDK API rte_eth_tx_queue_setup() has a parameter nb_tx_desc
> > specifying the desired queue capacity, measured in packets.
> >
> > The ConnectX NIC series has a hardware-imposed queue size
> > limit of 32K WQEs (packet hardware descriptors). Typically,
> > one packet requires one WQE to be sent.
> >
> > There is a special offload option, data-inlining, to improve
> > performance for small packets. Also, NICs in some configurations
> > require a minimum amount of inline data for the steering engine
> > to operate correctly.
> >
> > In the case of inline data, more than one WQEs might be required
> > to send a single packet. The mlx5 PMD takes this into account
> > and adjusts the number of queue WQEs accordingly.
> >
> > If the requested queue capacity can't be satisfied due to
> > the hardware queue size limit, the mlx5 PMD rejected the queue
> > creation, causing unresolvable application failure.
> >
> > The patch provides the following:
> >
> > - fixes the calculation of the number of required WQEs
> >    to send a single packet with inline data, making it more precise
> >    and extending the painless operating range.
> >
> > - If the requested queue capacity can't be satisfied due to WQE
> >    number adjustment for inline data, it no longer causes a severe
> >    error. Instead, a warning message is emitted, and the queue
> >    is created with the maximum available size, with a reported success.
> >
> >    Please note that the inline data size depends on many options
> >    (NIC configuration, queue offload flags, packet offload flags,
> >     packet size, etc.), so the actual queue capacity might not be
> >     impacted at all.
> >
> > Signed-off-by: Viacheslav Ovsiienko <viachesl...@nvidia.com>
> > Acked-by: Dariusz Sosnowski <dsosnow...@nvidia.com>
> >
> > ---
> > v2: diagnostics messages made less wordy
> > ---
> >   drivers/net/mlx5/mlx5_txq.c | 74 +++++++++++--------------------------
> >   1 file changed, 22 insertions(+), 52 deletions(-)
> >
> > diff --git a/drivers/net/mlx5/mlx5_txq.c b/drivers/net/mlx5/mlx5_txq.c
> > index 3e93517323..eebf3c2534 100644
> > --- a/drivers/net/mlx5/mlx5_txq.c
> > +++ b/drivers/net/mlx5/mlx5_txq.c
> > @@ -731,7 +731,7 @@ txq_calc_inline_max(struct mlx5_txq_ctrl *txq_ctrl)
> >     if (!wqe_size)
> >             return 0;
> >     /*
> > -    * This calculation is derived from tthe source of
> > +    * This calculation is derived from the source of
> >      * mlx5_calc_send_wqe() in rdma_core library.
> >      */
> >     wqe_size = wqe_size * MLX5_WQE_SIZE -
> > @@ -739,7 +739,7 @@ txq_calc_inline_max(struct mlx5_txq_ctrl *txq_ctrl)
> >                MLX5_WQE_ESEG_SIZE -
> >                MLX5_WSEG_SIZE -
> >                MLX5_WSEG_SIZE +
> > -              MLX5_DSEG_MIN_INLINE_SIZE;
> > +              MLX5_ESEG_MIN_INLINE_SIZE;
> >     return wqe_size;
> >   }
> >
> > @@ -964,11 +964,8 @@ txq_set_params(struct mlx5_txq_ctrl *txq_ctrl)
> >    *
> >    * @param txq_ctrl
> >    *   Pointer to Tx queue control structure.
> > - *
> > - * @return
> > - *   Zero on success, otherwise the parameters can not be adjusted.
> >    */
> > -static int
> > +static void
> >   txq_adjust_params(struct mlx5_txq_ctrl *txq_ctrl)
> >   {
> >     struct mlx5_priv *priv = txq_ctrl->priv;
> > @@ -981,82 +978,56 @@ txq_adjust_params(struct mlx5_txq_ctrl *txq_ctrl)
> >              * Inline data feature is not engaged at all.
> >              * There is nothing to adjust.
> >              */
> > -           return 0;
> > +           return;
> >     }
> >     if (txq_ctrl->max_inline_data <= max_inline) {
> >             /*
> >              * The requested inline data length does not
> >              * exceed queue capabilities.
> >              */
> > -           return 0;
> > +           return;
> >     }
> >     if (txq_ctrl->txq.inlen_mode > max_inline) {
> > -           DRV_LOG(ERR,
> > -                   "minimal data inline requirements (%u) are not"
> > -                   " satisfied (%u) on port %u, try the smaller"
> > -                   " Tx queue size (%d)",
> > -                   txq_ctrl->txq.inlen_mode, max_inline,
> > -                   priv->dev_data->port_id, priv->sh-
> >dev_cap.max_qp_wr);
> > -           goto error;
> > +           DRV_LOG(WARNING,
> > +                   "minimal data inline requirements (%u) are not
> satisfied (%u) on port %u",
> > +                   txq_ctrl->txq.inlen_mode, max_inline, priv-
> >dev_data->port_id);
> >     }
> >     if (txq_ctrl->txq.inlen_send > max_inline &&
> >         config->txq_inline_max != MLX5_ARG_UNSET &&
> >         config->txq_inline_max > (int)max_inline) {
> > -           DRV_LOG(ERR,
> > -                   "txq_inline_max requirements (%u) are not"
> > -                   " satisfied (%u) on port %u, try the smaller"
> > -                   " Tx queue size (%d)",
> > -                   txq_ctrl->txq.inlen_send, max_inline,
> > -                   priv->dev_data->port_id, priv->sh-
> >dev_cap.max_qp_wr);
> > -           goto error;
> > +           DRV_LOG(WARNING,
> > +                   "txq_inline_max requirements (%u) are not satisfied
> (%u) on port %u",
> > +                   txq_ctrl->txq.inlen_send, max_inline, priv->dev_data-
> >port_id);
> >     }
> >     if (txq_ctrl->txq.inlen_empw > max_inline &&
> >         config->txq_inline_mpw != MLX5_ARG_UNSET &&
> >         config->txq_inline_mpw > (int)max_inline) {
> > -           DRV_LOG(ERR,
> > -                   "txq_inline_mpw requirements (%u) are not"
> > -                   " satisfied (%u) on port %u, try the smaller"
> > -                   " Tx queue size (%d)",
> > -                   txq_ctrl->txq.inlen_empw, max_inline,
> > -                   priv->dev_data->port_id, priv->sh-
> >dev_cap.max_qp_wr);
> > -           goto error;
> > +           DRV_LOG(WARNING,
> > +                   "txq_inline_mpw requirements (%u) are not satisfied
> (%u) on port %u",
> > +                   txq_ctrl->txq.inlen_empw, max_inline, priv-
> >dev_data->port_id);
> >     }
> >     if (txq_ctrl->txq.tso_en && max_inline < MLX5_MAX_TSO_HEADER) {
> > -           DRV_LOG(ERR,
> > -                   "tso header inline requirements (%u) are not"
> > -                   " satisfied (%u) on port %u, try the smaller"
> > -                   " Tx queue size (%d)",
> > -                   MLX5_MAX_TSO_HEADER, max_inline,
> > -                   priv->dev_data->port_id, priv->sh-
> >dev_cap.max_qp_wr);
> > -           goto error;
> > +           DRV_LOG(WARNING,
> > +                   "tso header inline requirements (%u) are not satisfied
> (%u) on port %u",
> > +                   MLX5_MAX_TSO_HEADER, max_inline, priv-
> >dev_data->port_id);
> >     }
> >     if (txq_ctrl->txq.inlen_send > max_inline) {
> >             DRV_LOG(WARNING,
> > -                   "adjust txq_inline_max (%u->%u)"
> > -                   " due to large Tx queue on port %u",
> > -                   txq_ctrl->txq.inlen_send, max_inline,
> > -                   priv->dev_data->port_id);
> > +                   "adjust txq_inline_max (%u->%u) due to large Tx
> queue on port %u",
> > +                   txq_ctrl->txq.inlen_send, max_inline, priv->dev_data-
> >port_id);
> >             txq_ctrl->txq.inlen_send = max_inline;
> >     }
> >     if (txq_ctrl->txq.inlen_empw > max_inline) {
> >             DRV_LOG(WARNING,
> > -                   "adjust txq_inline_mpw (%u->%u)"
> > -                   "due to large Tx queue on port %u",
> > -                   txq_ctrl->txq.inlen_empw, max_inline,
> > -                   priv->dev_data->port_id);
> > +                   "adjust txq_inline_mpw (%u->%u) due to large Tx
> queue on port %u",
> > +                   txq_ctrl->txq.inlen_empw, max_inline, priv-
> >dev_data->port_id);
> >             txq_ctrl->txq.inlen_empw = max_inline;
> >     }
> >     txq_ctrl->max_inline_data = RTE_MAX(txq_ctrl->txq.inlen_send,
> >                                         txq_ctrl->txq.inlen_empw);
> > -   MLX5_ASSERT(txq_ctrl->max_inline_data <= max_inline);
> > -   MLX5_ASSERT(txq_ctrl->txq.inlen_mode <= max_inline);
> >     MLX5_ASSERT(txq_ctrl->txq.inlen_mode <= txq_ctrl->txq.inlen_send);
> >     MLX5_ASSERT(txq_ctrl->txq.inlen_mode <= txq_ctrl->txq.inlen_empw
> ||
> >                 !txq_ctrl->txq.inlen_empw);
> > -   return 0;
> > -error:
> > -   rte_errno = ENOMEM;
> > -   return -ENOMEM;
> >   }
> >
> >   /**
> > @@ -1105,8 +1076,7 @@ mlx5_txq_new(struct rte_eth_dev *dev, uint16_t
> idx, uint16_t desc,
> >     tmpl->txq.port_id = dev->data->port_id;
> >     tmpl->txq.idx = idx;
> >     txq_set_params(tmpl);
> > -   if (txq_adjust_params(tmpl))
> > -           goto error;
> > +   txq_adjust_params(tmpl);
> >     if (txq_calc_wqebb_cnt(tmpl) >
> >         priv->sh->dev_cap.max_qp_wr) {
> >             DRV_LOG(ERR,

Reply via email to