Just a quick comment: There are probably some ideas to take from what was done for tap.
13/11/2018 17:56, Ferruh Yigit: > On 11/12/2018 4:51 PM, Qi Zhang wrote: > > Private vdev on secondary is never supported by the new shared > > device mode but pdump still relies on a private pcap PMD on secondary. > > The patch enables pcap PMD's data path on secondary so that pdump can > > work as usual. > > It would be great if you described the problem a little more. > > Private vdev was the way previously, when pdump developed, now with shared > device mode on virtual devices, pcap data path in secondary is not working. > > What exactly not working is (please correct me if I am wrong): > When secondary adds a virtual device, related data transferred to primary and > primary creates the device and shares device back with secondary. > When pcap device created in primary, pcap handlers (pointers) are process > local > and they are not valid for secondary process. This breaks secondary. > > So we can't directly share the pcap handlers, but need to create a new set of > handlers for secondary, that is what you are doing in this patch, although I > have some comments, please check below. > > Since there is single storage for pcap handlers that primary and secondary > shares and they can't share the handlers, you can't make both primary and > secondary data path work. Also freeing handlers is another concern. What is > needed is `rte_eth_dev->process_private` which has been added in this release. > > > > > Signed-off-by: Qi Zhang <qi.z.zh...@intel.com> > > Tested-by: Yufeng Mo <yufengx...@intel.com> > > <...> > > > @@ -934,6 +935,10 @@ pmd_init_internals(struct rte_vdev_device *vdev, > > */ > > (*eth_dev)->dev_ops = &ops; > > > > + /* store a copy of devargs for secondary process */ > > + strlcpy(internals->devargs, rte_vdev_device_args(vdev), > > + ETH_PCAP_ARG_MAXLEN); > > Why we need to cover this in PMD level? > > Why secondary probe isn't getting devargs? Can't we fix this in eal level? > It can be OK to workaround in the PMD taking account of the time of the > release, > but for long term I think this should be fixed in eal. > > <...> > > > @@ -1122,23 +1126,37 @@ pmd_pcap_probe(struct rte_vdev_device *dev) > > start_cycles = rte_get_timer_cycles(); > > hz = rte_get_timer_hz(); > > > > - if (rte_eal_process_type() == RTE_PROC_SECONDARY) { > > + if (rte_eal_process_type() == RTE_PROC_PRIMARY) { > > + kvlist = rte_kvargs_parse(rte_vdev_device_args(dev), > > + valid_arguments); > > + if (kvlist == NULL) > > + return -EINVAL; > > + if (rte_kvargs_count(kvlist, ETH_PCAP_IFACE_ARG) == 1) > > + nb_rx_queue = 1; > > + else > > + nb_rx_queue = > > + rte_kvargs_count(kvlist, > > + ETH_PCAP_RX_PCAP_ARG) ? 1 : 0; > > + nb_tx_queue = 1; > > This part is wrong. pcap pmd supports multi queue, you can't hardcode the > number > of queues. Also for Tx why it ignores `rx_iface` argument? > This is just hacking the driver for a specific use case breaking others. > > > + ret = pmd_init_internals(dev, nb_rx_queue, > > + nb_tx_queue, ð_dev); > > I think it is not required to move pmd_init_internals() here. > This can be done simpler, I will send a draft patch as a reply to this mail > for > possible solution. > But again that can't be final solution, we need to use `process_private` > > <...> >