On 5/5/2020 4:09 AM, Rasesh Mody wrote: > Fix to assign dummy Rx/Tx handlers in dev_stop. > For MTU set, assignment of the appropriate Rx/Tx handlers will be > handled by dev_start/dev_stop. > > Fixes: 81f8804992c9 ("net/qede: enhance Rx CPU utilization") > Fixes: 8de0c4201926 ("net/qede: fix odd number of queues usage in 100G mode") > Cc: sta...@dpdk.org > > Signed-off-by: Rasesh Mody <rm...@marvell.com> > Signed-off-by: Igor Russkikh <irussk...@marvell.com> > --- > drivers/net/qede/qede_ethdev.c | 33 ++++++++++++++++----------------- > 1 file changed, 16 insertions(+), 17 deletions(-) > > diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c > index e71fa1e6a..726daa3e3 100644 > --- a/drivers/net/qede/qede_ethdev.c > +++ b/drivers/net/qede/qede_ethdev.c > @@ -320,13 +320,19 @@ qede_interrupt_handler(void *param) > } > > static void > -qede_assign_rxtx_handlers(struct rte_eth_dev *dev) > +qede_assign_rxtx_handlers(struct rte_eth_dev *dev, bool is_dummy) > { > uint64_t tx_offloads = dev->data->dev_conf.txmode.offloads; > struct qede_dev *qdev = dev->data->dev_private; > struct ecore_dev *edev = &qdev->edev; > bool use_tx_offload = false; > > + if (is_dummy) { > + dev->rx_pkt_burst = qede_rxtx_pkts_dummy; > + dev->tx_pkt_burst = qede_rxtx_pkts_dummy; > + return; > + } > + > if (ECORE_IS_CMT(edev)) { > dev->rx_pkt_burst = qede_recv_pkts_cmt; > dev->tx_pkt_burst = qede_xmit_pkts_cmt; > @@ -1150,7 +1156,9 @@ static int qede_dev_start(struct rte_eth_dev *eth_dev) > /* Start/resume traffic */ > qede_fastpath_start(edev); > > - qede_assign_rxtx_handlers(eth_dev); > + /* Assign I/O handlers */ > + qede_assign_rxtx_handlers(eth_dev, false); > + > DP_INFO(edev, "Device started\n"); > > return 0; > @@ -1166,6 +1174,11 @@ static void qede_dev_stop(struct rte_eth_dev *eth_dev) > > PMD_INIT_FUNC_TRACE(edev); > > + /* Replace I/O functions with dummy ones. It cannot > + * be set to NULL because rte_eth_rx_burst() doesn't check for NULL. > + */ > + qede_assign_rxtx_handlers(eth_dev, true); > +
Why need to assign dummy handlers on stop(), what happens if you keep them as they are as many PMD does? > /* Disable vport */ > if (qede_activate_vport(eth_dev, false)) > return; > @@ -2316,11 +2329,6 @@ static int qede_set_mtu(struct rte_eth_dev *dev, > uint16_t mtu) > dev->data->min_rx_buf_size); > return -EINVAL; > } > - /* Temporarily replace I/O functions with dummy ones. It cannot > - * be set to NULL because rte_eth_rx_burst() doesn't check for NULL. > - */ > - dev->rx_pkt_burst = qede_rxtx_pkts_dummy; > - dev->tx_pkt_burst = qede_rxtx_pkts_dummy; > if (dev->data->dev_started) { > dev->data->dev_started = 0; > qede_dev_stop(dev); > @@ -2359,15 +2367,6 @@ static int qede_set_mtu(struct rte_eth_dev *dev, > uint16_t mtu) > /* update max frame size */ > dev->data->dev_conf.rxmode.max_rx_pkt_len = max_rx_pkt_len; > > - /* Reassign back */ > - qede_assign_rxtx_handlers(dev); > - if (ECORE_IS_CMT(edev)) { > - dev->rx_pkt_burst = qede_recv_pkts_cmt; > - dev->tx_pkt_burst = qede_xmit_pkts_cmt; > - } else { > - dev->rx_pkt_burst = qede_recv_pkts; > - dev->tx_pkt_burst = qede_xmit_pkts; > - } > return 0; > } > > @@ -2570,7 +2569,7 @@ static int qede_common_dev_init(struct rte_eth_dev > *eth_dev, bool is_vf) > strncpy((char *)params.name, QEDE_PMD_VER_PREFIX, > QEDE_PMD_DRV_VER_STR_SIZE); > > - qede_assign_rxtx_handlers(eth_dev); > + qede_assign_rxtx_handlers(eth_dev, true); > eth_dev->tx_pkt_prepare = qede_xmit_prep_pkts; > > /* For CMT mode device do periodic polling for slowpath events. >