> -----Original Message----- > From: Wang, Xiao W > Sent: Tuesday, March 28, 2017 11:59 AM > To: Chen, Jing D <jing.d.c...@intel.com> > Cc: dev@dpdk.org; Wang, Xiao W <xiao.w.w...@intel.com>; sta...@dpdk.org > Subject: [PATCH] net/fm10k: fix secondary process crash > > If the primary process has initialized all the queues to vector pmd mode, the > secondary process should not use scalar code path, because the per queue data > structures haven't been prepared for that, e.g. txq->ops is for vector Tx > rather > than scalar Tx. > > Fixes: a6ce64a97520 ("fm10k: introduce vector driver") > Cc: sta...@dpdk.org > > Signed-off-by: Xiao Wang <xiao.w.w...@intel.com> > --- > drivers/net/fm10k/fm10k_ethdev.c | 28 ++++++++++++++++++++++++++-- > 1 file changed, 26 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/fm10k/fm10k_ethdev.c > b/drivers/net/fm10k/fm10k_ethdev.c > index 388f929..680d617 100644 > --- a/drivers/net/fm10k/fm10k_ethdev.c > +++ b/drivers/net/fm10k/fm10k_ethdev.c > @@ -2750,6 +2750,21 @@ static void __attribute__((cold)) > int use_sse = 1; > uint16_t tx_ftag_en = 0; > > + if (rte_eal_process_type() != RTE_PROC_PRIMARY) { > + /* primary process has set the ftag flag and txq_flags */ > + txq = dev->data->tx_queues[0]; > + if (fm10k_tx_vec_condition_check(txq)) { > + dev->tx_pkt_burst = fm10k_xmit_pkts; > + dev->tx_pkt_prepare = fm10k_prep_pkts; > + PMD_INIT_LOG(DEBUG, "Use regular Tx func"); > + } else { > + PMD_INIT_LOG(DEBUG, "Use vector Tx func"); > + dev->tx_pkt_burst = fm10k_xmit_pkts_vec; > + dev->tx_pkt_prepare = NULL; > + } > + return; > + } > +
Why we need to check process type? What would happen if no changes made here? > if (fm10k_check_ftag(dev->device->devargs)) > tx_ftag_en = 1; > > @@ -2810,6 +2825,9 @@ static void __attribute__((cold)) > else > PMD_INIT_LOG(DEBUG, "Use regular Rx func"); > > + if (rte_eal_process_type() != RTE_PROC_PRIMARY) > + return; > + > for (i = 0; i < dev->data->nb_rx_queues; i++) { > struct fm10k_rx_queue *rxq = dev->data->rx_queues[i]; > > @@ -2856,9 +2874,15 @@ static void __attribute__((cold)) > dev->tx_pkt_burst = &fm10k_xmit_pkts; > dev->tx_pkt_prepare = &fm10k_prep_pkts; > > - /* only initialize in the primary process */ > - if (rte_eal_process_type() != RTE_PROC_PRIMARY) > + /* > + * Primary process does the whole initialization, for secondary > + * processes, we just select the same Rx and Tx function as primary. > + */ > + if (rte_eal_process_type() != RTE_PROC_PRIMARY) { > + fm10k_set_rx_function(dev); > + fm10k_set_tx_function(dev); > return 0; > + } > > rte_eth_copy_pci_info(dev, pdev); > dev->data->dev_flags |= RTE_ETH_DEV_DETACHABLE; > -- > 1.8.3.1