On 11/14/2018 7:56 PM, Qi Zhang wrote: > This is prework for data path enabling for secondary process. > To prevent pcap handler opened by one process be overwritten by > another process, each process should have their private copy, > `rte_eth_dev->process_private` is exactly what we needed. > > Signed-off-by: Qi Zhang <qi.z.zh...@intel.com>
<...> > @@ -646,8 +652,10 @@ eth_rx_queue_setup(struct rte_eth_dev *dev, > struct rte_mempool *mb_pool) > { > struct pmd_internals *internals = dev->data->dev_private; > + struct pmd_process_private *pp = dev->process_private; > struct pcap_rx_queue *pcap_q = &internals->rx_queue[rx_queue_id]; > > + pcap_q->pcap = pp->rx_pcap[rx_queue_id]; > pcap_q->mb_pool = mb_pool; > dev->data->rx_queues[rx_queue_id] = pcap_q; > pcap_q->in_port = dev->data->port_id; > @@ -663,8 +671,12 @@ eth_tx_queue_setup(struct rte_eth_dev *dev, > const struct rte_eth_txconf *tx_conf __rte_unused) > { > struct pmd_internals *internals = dev->data->dev_private; > + struct pmd_process_private *pp = dev->process_private; > + struct pcap_tx_queue *pcap_q = &internals->tx_queue[tx_queue_id]; > > - dev->data->tx_queues[tx_queue_id] = &internals->tx_queue[tx_queue_id]; > + pcap_q->pcap = pp->tx_pcap[tx_queue_id]; > + pcap_q->dumper = pp->tx_dumper[tx_queue_id]; > + dev->data->tx_queues[tx_queue_id] = pcap_q; We can't do this, this will be same thing as not using process_private at all, dev->data is shared between primary and secondary. Handlers need to be accessed directly from process_private in burst functions. To able to match queue with handlers in process_private, queue may need to include queue_index. tap pmd has similar implementation already.