Hi Mark, > -----Original Message----- > From: Chen, Jing D > Sent: Friday, March 31, 2017 9:30 AM > To: Wang, Xiao W <xiao.w.w...@intel.com> > Cc: dev@dpdk.org; sta...@dpdk.org > Subject: RE: [PATCH] net/fm10k: fix secondary process crash > > > > > -----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 no change, then this function will re-set some fields of txq structure. e.g. for (i = 0; i < dev->data->nb_tx_queues; i++) { txq = dev->data->tx_queues[i]; fm10k_txq_vec_setup(txq); } Though these fields would be re-set to the same value, it doesn't look good. In secondary, we just read the queues and do not write them. Best Regards, Xiao > > > 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