>-----Original Message----- >From: dev <dev-boun...@dpdk.org> On Behalf Of Andrew Rybchenko >Sent: Tuesday, October 29, 2019 12:36 PM >To: Pavan Nikhilesh Bhagavatula <pbhagavat...@marvell.com>; >ferruh.yi...@intel.com; Jerin Jacob Kollanukkaran ><jer...@marvell.com>; Thomas Monjalon <tho...@monjalon.net> >Cc: dev@dpdk.org >Subject: Re: [dpdk-dev] [PATCH v14 3/7] ethdev: log offloads that can't >be disabled by PMD > >Hi Pavan, > >thanks for the patch. Please, see my review notes below. > >On 10/29/19 8:03 AM, pbhagavat...@marvell.com wrote: >> From: Pavan Nikhilesh <pbhagavat...@marvell.com> >> >> Some PMD can't work when certain offloads are disabled, to work >around >> this the PMD auto enable the offloads internally and expose it >through >> dev->data->dev_conf.rxmode.offloads. >> After dev_configure is called compare the requested offloads to the >> enabled offloads and log any offloads that have been enabled by the >PMD. >> >> Suggested-by: Andrew Rybchenko <arybche...@solarflare.com> >> Signed-off-by: Pavan Nikhilesh <pbhagavat...@marvell.com> >> --- >> lib/librte_ethdev/rte_ethdev.c | 22 ++++++++++++++++++++++ >> 1 file changed, 22 insertions(+) >> >> diff --git a/lib/librte_ethdev/rte_ethdev.c >b/lib/librte_ethdev/rte_ethdev.c >> index fef1dbb61..7dfc2f691 100644 >> --- a/lib/librte_ethdev/rte_ethdev.c >> +++ b/lib/librte_ethdev/rte_ethdev.c >> @@ -1142,6 +1142,8 @@ rte_eth_dev_configure(uint16_t port_id, >uint16_t nb_rx_q, uint16_t nb_tx_q, >> struct rte_eth_dev *dev; >> struct rte_eth_dev_info dev_info; >> struct rte_eth_conf orig_conf; >> + uint64_t offloads_force_ena; >> + uint64_t offload; >> int diag; >> int ret; >> >> @@ -1357,6 +1359,26 @@ rte_eth_dev_configure(uint16_t port_id, >uint16_t nb_rx_q, uint16_t nb_tx_q, >> goto rollback; >> } >> >> + /* Extract Rx offload bits that can't be disabled and log them */ >> + offloads_force_ena = dev_conf->rxmode.offloads ^ >> + dev->data->dev_conf.rxmode.offloads; > >Strictly speaking XOR returns diff and in theory the diff could >catch requested but not enabled offload in fact. >So, I think the variable name should be offloads_diff. >Yes, it is unexpected and very bad, but it adds even more >value to the check. >May be requested but not enabled offloads should be checked first: >((dev_conf->rxmode.offloads & ~dev->data- >>dev_conf.rxmode.offloads) != 0)
Isn't the above already taken care through " /* Any requested offloading must be within its device capabilities */ if ((dev_conf->rxmode.offloads & dev_info.rx_offload_capa) != dev_conf->rxmode.offloads) { RTE_ETHDEV_LOG(ERR, "Ethdev port_id=%u requested Rx offloads 0x%"PRIx64" doesn't match Rx offloads " "capabilities 0x%"PRIx64" in %s()\n", port_id, dev_conf->rxmode.offloads, dev_info.rx_offload_capa, __func__); ret = -EINVAL; goto rollback; } if ((dev_conf->txmode.offloads & dev_info.tx_offload_capa) != dev_conf->txmode.offloads) { RTE_ETHDEV_LOG(ERR, "Ethdev port_id=%u requested Tx offloads 0x%"PRIx64" doesn't match Tx offloads " "capabilities 0x%"PRIx64" in %s()\n", port_id, dev_conf->txmode.offloads, dev_info.tx_offload_capa, __func__); ret = -EINVAL; goto rollback; } " Do you think PMDs will advertise but not enable? >but I think it would be useful to log these offloads as well to help >debugging, >so, it should be handled below. > >> + while (__builtin_popcount(offloads_force_ena)) { > >If we really need it, __builtin_popcountll() should be used, but I think >we >don't need it here in fact since all we want to know if offloads_diff is >0 or not. >So, comparison to 0 will do the job without any builtins. Yes, we can skip using __builtin_popcount. > >> + offload = 1ULL << __builtin_ctzll(offloads_force_ena); >> + offloads_force_ena &= ~offload; > >Below we should differentiate if the offload is requested but not >enabled (error) >and if the offload is not requested but enabled (info or warning as >Ferruh >suggested). >I think ret should be set to some error if we find any requested, but not >enabled offload and finally configure should fail (after logging of all >violations) since it is a strong violation. > >Same for Tx below. > >Also I think that it is better to factor out these checks into a separate >function sinceĀ rte_eth_dev_configure() is already too long. >It looks like that parameters should port ID, requested and >result offloads. > I will move it to static function in next iteration. >> + RTE_ETHDEV_LOG(INFO, "Port %u can't disable Rx >offload %s\n", >> + port_id, >rte_eth_dev_rx_offload_name(offload)); >> + } >> + >> + /* Extract Tx offload bits that can't be disabled and log them */ >> + offloads_force_ena = dev_conf->txmode.offloads ^ >> + dev->data- >>dev_conf.txmode.offloads; >> + while (__builtin_popcount(offloads_force_ena)) { >> + offload = 1ULL << __builtin_ctzll(offloads_force_ena); >> + offloads_force_ena &= ~offload; >> + RTE_ETHDEV_LOG(INFO, "Port %u can't disable Tx >offload %s\n", >> + port_id, >rte_eth_dev_tx_offload_name(offload)); >> + } >> + >> return 0; >> >> rollback: