[dpdk-dev] [PATCH v4] ethdev: check Rx/Tx offloads

Zhang, Qi Z qi.z.zhang at intel.com
Thu Apr 26 09:59:32 CEST 2018



> -----Original Message-----
> From: Yigit, Ferruh
> Sent: Thursday, April 26, 2018 1:05 AM
> To: Dai, Wei <wei.dai at intel.com>; thomas at monjalon.net; Zhang, Qi Z
> <qi.z.zhang at intel.com>
> Cc: dev at dpdk.org
> Subject: Re: [PATCH v4] ethdev: check Rx/Tx offloads
> 
> On 4/25/2018 12:50 PM, Wei Dai wrote:
> > This patch check if a requested offloading is supported in the device
> > capability.
> > Any offloading is disabled by default if it is not set in
> > rte_eth_dev_configure( ) and rte_eth_[rt]x_queue_setup().
> > A per port offloading can only be enabled in rte_eth_dev_configure().
> > If a per port offloading is sent to rte_eth_[rt]x_queue_setup( ),
> > return error.
> > Only per queue offloading can be sent to rte_eth_[rt]x_queue_setup( ).
> > A per queue offloading is enabled only if it is enabled in
> > rte_eth_dev_configure( ) OR if it is enabled in
> > rte_eth_[rt]x_queue_setup( ).
> > If a per queue offloading is enabled in rte_eth_dev_configure(), it
> > can't be disabled in rte_eth_[rt]x_queue_setup( ).
> > If a per queue offloading is disabled in rte_eth_dev_configure( ), it
> > can be enabled or disabled( ) in rte_eth_[rt]x_queue_setup( ).
> >
> > This patch can make such checking in a common way in rte_ethdev layer
> > to avoid same checking in underlying PMD.
> 
> Hi Wei,
> 
> For clarification, there is existing API for rc1, and there is a suggested update
> in API for rc2. I guess this patch is for suggested update in rc2?
> 
> > Signed-off-by: Wei Dai <wei.dai at intel.com>
> >
> > ---
> > v4: fix a wrong description in git log message.
> >
> > v3: rework according to dicision of offloading API in community
> >
> > v2: add offloads checking in rte_eth_dev_configure( ).
> >     check if a requested offloading is supported.
> > ---
> >  lib/librte_ether/rte_ethdev.c | 76
> > +++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 76 insertions(+)
> >
> > diff --git a/lib/librte_ether/rte_ethdev.c
> > b/lib/librte_ether/rte_ethdev.c index f0f53d4..70a7904 100644
> > --- a/lib/librte_ether/rte_ethdev.c
> > +++ b/lib/librte_ether/rte_ethdev.c
> > @@ -1196,6 +1196,28 @@ rte_eth_dev_configure(uint16_t port_id,
> uint16_t nb_rx_q, uint16_t nb_tx_q,
> >  							ETHER_MAX_LEN;
> >  	}
> >
> > +	/* Any requested offload must be within its device capability */
> > +	if ((local_conf.rxmode.offloads & dev_info.rx_offload_capa) !=
> > +	     local_conf.rxmode.offloads) {
> > +		RTE_PMD_DEBUG_TRACE("ethdev port_id=%d requested Rx
> offloads "
> > +				    "0x%" PRIx64 " doesn't match Rx offloads "
> > +				    "capability 0x%" PRIx64 "\n",
> > +				    port_id,
> > +				    local_conf.rxmode.offloads,
> > +				    dev_info.rx_offload_capa);
> > +		return -EINVAL;
> > +	}
> > +	if ((local_conf.txmode.offloads & dev_info.tx_offload_capa) !=
> > +	     local_conf.txmode.offloads) {
> > +		RTE_PMD_DEBUG_TRACE("ethdev port_id=%d requested Tx
> offloads "
> > +				    "0x%" PRIx64 " doesn't match Tx offloads "
> > +				    "capability 0x%" PRIx64 "\n",
> > +				    port_id,
> > +				    local_conf.txmode.offloads,
> > +				    dev_info.tx_offload_capa);
> > +		return -EINVAL;
> > +	}
> +1 having these checks here.
> 
> > +
> >  	/*
> >  	 * Setup new number of RX/TX queues and reconfigure device.
> >  	 */
> > @@ -1547,6 +1569,33 @@ rte_eth_rx_queue_setup(uint16_t port_id,
> uint16_t rx_queue_id,
> >  						    &local_conf.offloads);
> >  	}
> >
> > +	/*
> > +	 * Only per-queue offload can be enabled from application.
> > +	 * If any pure per-port offload is sent to this function, return -EINVAL
> > +	 */
> > +	if ((local_conf.offloads & dev_info.rx_queue_offload_capa) !=
> > +	     local_conf.offloads) {
> > +		RTE_PMD_DEBUG_TRACE("Ethdev port_id=%d rx_queue_id=%d "
> > +				    "Requested offload 0x%" PRIx64 "doesn't "
> > +				    "match per-queue capability 0x%" PRIx64
> > +				    " in rte_eth_rx_queue_setup( )\n",
> > +				    port_id,
> > +				    rx_queue_id,
> > +				    local_conf.offloads,
> > +				    dev_info.rx_queue_offload_capa);
> > +		return -EINVAL;
> > +	}
> 
> There is a change here. If requested offload is already enabled in port level,
> instead of returning error, ignore it.
> So this removes the restriction for apps that "only an offload from queue
> capabilities can be send for queue_setup() functions". This is not
> requirement for application as it has been before, but this is allowed for app
> now.
> 
> If app tried to enable a port offload in queue level that is not already enabled,
> it should still return error.
> 
> > +
> > +	/*
> > +	 * If a per-queue offload is enabled in rte_eth_dev_configure( ),
> > +	 * it is also enabled on all queues and can't be disabled here.
> > +	 * If it is diabled in rte_eth_dev_configure( ), it can be enabled
> > +	 * or disabled here.
> > +	 * If a per-port offload is enabled in rte_eth_dev_configure( ),
> > +	 * it is also enabled for all queues here.
> > +	 */
> > +	local_conf.offloads |= dev->data->dev_conf.rxmode.offloads;
> 
> I didn't get this one, why add rxmode.offloads into queue offloads?
> 
> Based on above change Thomas has an suggestion [1]:
> 
> "
> In the case of offload already enabled at port level and repeated in queue
> setup, ethdev can avoid passing it to the PMD queue setup function.
> "
> 
> So almost reverse of what you are doing, strip rxmode.offloads from
> local_conf.offloads for PMDs. What do you think?

Should we do like below
	local_conf.offloads |= dev->data->dev_conf.rxmode.offloads;
	local_conf.offloads &= dev_info.rx_queue_offload_capa

I thinks it's better to only strip port offloads. But keep all queue offload,
 since this is exact we going to configure the queue and during device start, it can simply iterate on each bit on local_conf.offloads to
turn on queue offload and don't need to worry about rxmode.offloads.

Regards
Qi.

> 
> 
> [1]
> https://dpdk.org/ml/archives/dev/2018-April/098956.html


More information about the dev mailing list