[dpdk-dev] [PATCH 2/3] ethdev: fail if Tx queue offload is not supported at all

Shahaf Shuler shahafs at mellanox.com
Sun May 13 15:30:25 CEST 2018


Sunday, May 13, 2018 8:38 AM, Shahaf Shuler:
> Subject: Re: [dpdk-dev] [PATCH 2/3] ethdev: fail if Tx queue offload is not
> supported at all
> > -----Original Message-----
> > From: Andrew Rybchenko <arybchenko at solarflare.com>
> > Sent: Friday, May 11, 2018 7:26 PM
> > To: dev at dpdk.org
> > Cc: Ferruh Yigit <ferruh.yigit at intel.com>; Thomas Monjalon
> > <thomas at monjalon.net>; Shahaf Shuler <shahafs at mellanox.com>; Wei
> Dai
> > <wei.dai at intel.com>
> > Subject: [PATCH 2/3] ethdev: fail if Tx queue offload is not supported
> > at all
> >
> > Do not allow to request unsupported Tx offload since all checks are
> > removed from PMDs because of consistency check in ethdev.
> > Otherwise application may rely on offload which is not actually
> > supported and send traffic with, for example, wrong checksums,
> > truncated packets or packets with garbage.
> >
> > Fixes: d04dd6d4ed67 ("ethdev: new Rx/Tx offloads API")
> >
> > Signed-off-by: Andrew Rybchenko <arybchenko at solarflare.com>
> > ---
> >  lib/librte_ethdev/rte_ethdev.c | 10 ++++++++++
> >  1 file changed, 10 insertions(+)
> >
> > diff --git a/lib/librte_ethdev/rte_ethdev.c
> > b/lib/librte_ethdev/rte_ethdev.c index dd36e6270..60577efcf 100644
> > --- a/lib/librte_ethdev/rte_ethdev.c
> > +++ b/lib/librte_ethdev/rte_ethdev.c
> > @@ -1744,6 +1744,16 @@ rte_eth_tx_queue_setup(uint16_t port_id,
> > uint16_t tx_queue_id,
> >  				local_conf.offloads,
> >  				dev_info.tx_queue_offload_capa,
> >  				__func__);
> > +		/*
> > +		 * Applications which are not converted yet to the new
> > +		 * Tx offload API may request device level offloads on
> > +		 * queue level (and nothing is requested on device level).
> > +		 * However, if the offload is not supported at all Tx
> > +		 * queue setup must fail.
> > +		 */
> > +		if ((local_conf.offloads & dev_info.tx_offload_capa) !=
> > +		    local_conf.offloads)
> > +			return -EINVAL;
> 
> Not converted application doesn't have a clue what are per-queue offloads,
> and this is the error they will get when the Tx queue configuration will fail.
> 
> How about using ETH_TXQ_FLAGS_IGNORE flag, which explicitly says
> "application converted to the new Tx offloads API". and have 2 different
> checks:
> 1. for converted application the already exist check[1] with the related error.
> 2. for not converted application your check with a related error.
> 
> 

As a suggestion maybe the below diff can be squashed into this one:

diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index b3dac067c5..4763718b9c 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -1727,25 +1727,29 @@ rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
         */
        local_conf.offloads &= ~dev->data->dev_conf.txmode.offloads;
 
-       /*
-        * New added offloadings for this queue are those not enabled in
-        * rte_eth_dev_configure( ) and they must be per-queue type.
-        * A pure per-port offloading can't be enabled on a queue while
-        * disabled on another queue. A pure per-port offloading can't
-        * be enabled for any queue as new added one if it hasn't been
-        * enabled in rte_eth_dev_configure( ).
-        */
-       if ((local_conf.offloads & dev_info.tx_queue_offload_capa) !=
-            local_conf.offloads) {
-               ethdev_log(ERR, "Ethdev port_id=%d tx_queue_id=%d, new "
-                               "added offloads 0x%" PRIx64 " must be "
-                               "within pre-queue offload capabilities 0x%"
-                               PRIx64 " in %s( )\n",
-                               port_id,
-                               tx_queue_id,
-                               local_conf.offloads,
-                               dev_info.tx_queue_offload_capa,
-                               __func__);
+       if (tx_conf->txq_flags & ETH_TXQ_FLAGS_IGNORE) {
+               /*
+                * New added offloadings for this queue are those not enabled in
+                * rte_eth_dev_configure( ) and they must be per-queue type.
+                * A pure per-port offloading can't be enabled on a queue while
+                * disabled on another queue. A pure per-port offloading can't
+                * be enabled for any queue as new added one if it hasn't been
+                * enabled in rte_eth_dev_configure( ).
+                */
+               if ((local_conf.offloads & dev_info.tx_queue_offload_capa) !=
+                               local_conf.offloads) {
+                       ethdev_log(ERR, "Ethdev port_id=%d tx_queue_id=%d, new "
+                                       "added offloads 0x%" PRIx64 " must be "
+                                       "within pre-queue offload capabilities "
+                                       " 0x%" PRIx64 " in %s( )\n",
+                                       port_id,
+                                       tx_queue_id,
+                                       local_conf.offloads,
+                                       dev_info.tx_queue_offload_capa,
+                                       __func__);
+                       return -EINVAL;
+               }
+       } else {
                /*
                 * Applications which are not converted yet to the new
                 * Tx offload API may request device level offloads on
@@ -1754,8 +1758,18 @@ rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
                 * queue setup must fail.



More information about the dev mailing list