On 9/11/2017 7:58 PM, John Daley wrote: > - Use rte_malloc() instead of malloc() for the per device 'vdev' structure > so that it can be shared across processes. > - Only initialize the device if the process type is RTE_PROC_PRIMARY > - Only allow the primary process to do queue setup, start/stop, promisc > allmulticast, mac add/del, mtu. > > Fixes: fefed3d1e62c ("enic: new driver") > Cc: sta...@dpdk.org > > Signed-off-by: John Daley <johnd...@cisco.com>
<...> > diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c > index da8fec2d0..33a3f87e2 100644 > --- a/drivers/net/enic/enic_ethdev.c > +++ b/drivers/net/enic/enic_ethdev.c > @@ -142,6 +142,10 @@ enicpmd_dev_filter_ctrl(struct rte_eth_dev *dev, > static void enicpmd_dev_tx_queue_release(void *txq) > { > ENICPMD_FUNC_TRACE(); > + > + if (rte_eal_process_type() != RTE_PROC_PRIMARY) > + return; > + Hi John, I am not sure about these updates. Agree that these functions should know process type, but all others PMDs don't do this. Added a few more people for comment, but as far I understand its application responsibility to NOT call these functions if it is secondary process. For device init/uninit, that is part of eal_init() and have to be called both for primary and secondary process and PMD needs to protect it, for other functions application's responsibility. > enic_free_wq(txq); > } > > @@ -196,6 +200,9 @@ static int enicpmd_dev_tx_queue_setup(struct rte_eth_dev > *eth_dev, > int ret; > struct enic *enic = pmd_priv(eth_dev); > > + if (rte_eal_process_type() != RTE_PROC_PRIMARY) > + return -E_RTE_SECONDARY; > + > ENICPMD_FUNC_TRACE(); > if (queue_idx >= ENIC_WQ_MAX) { > dev_err(enic, > @@ -272,6 +279,10 @@ static int enicpmd_dev_rx_queue_stop(struct rte_eth_dev > *eth_dev, > static void enicpmd_dev_rx_queue_release(void *rxq) > { > ENICPMD_FUNC_TRACE(); > + > + if (rte_eal_process_type() != RTE_PROC_PRIMARY) > + return; > + > enic_free_rq(rxq); > } > <...>