[dpdk-dev,20/22] net/tap: enable port detach on secondary process
Checks
Commit Message
Previously, detach port on secondary process will mess primary
process and cause same device can't be attached again, by take
advantage of rte_eth_release_port_local, we can support this with
minor change.
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
---
drivers/net/tap/rte_eth_tap.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
Comments
> On Jun 7, 2018, at 5:38 AM, Qi Zhang <qi.z.zhang@intel.com> wrote:
>
> Previously, detach port on secondary process will mess primary
> process and cause same device can't be attached again, by take
> advantage of rte_eth_release_port_local, we can support this with
> minor change.
Previously, detach ports on secondary process will mess with the primary
process and cause the device to be not able to attach again. Taking
advantage of the rte_eth_release_port_local call we can fix the problem
with minor changes.
>
> Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
> ---
> drivers/net/tap/rte_eth_tap.c | 17 +++++++++++++++--
> 1 file changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
> index 5531fe9d9..56d3b6cc9 100644
> --- a/drivers/net/tap/rte_eth_tap.c
> +++ b/drivers/net/tap/rte_eth_tap.c
> @@ -1759,6 +1759,7 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev)
> }
> /* TODO: request info from primary to set up Rx and Tx */
> eth_dev->dev_ops = &ops;
> + eth_dev->device = &dev->device;
> rte_eth_dev_probing_finish(eth_dev);
> return 0;
> }
> @@ -1827,12 +1828,24 @@ rte_pmd_tap_remove(struct rte_vdev_device *dev)
> {
> struct rte_eth_dev *eth_dev = NULL;
> struct pmd_internals *internals;
> + const char *name;
> int i;
>
> + name = rte_vdev_device_name(dev);
> /* find the ethdev entry */
> - eth_dev = rte_eth_dev_allocated(rte_vdev_device_name(dev));
> + eth_dev = rte_eth_dev_allocated(name);
> if (!eth_dev)
> - return 0;
> + return -ENODEV;
> +
> + if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
> + /* detach device on local pprocess only */
/pprocess/process/
> + if (strlen(rte_vdev_device_args(dev)) == 0)
What does strlen() do with a null string returned by rte_vdev_device_args(), I believe it just returns with zero, but we need to make sure. If it does not then we must protect strlen().
> + return rte_eth_dev_release_port_local(eth_dev);
> + /**
> + * else this is a private device for current process
> + * so continue with normal detach scenario
> + */
> + }
>
> internals = eth_dev->data->dev_private;
>
> --
> 2.13.6
>
Regards,
Keith
@@ -1759,6 +1759,7 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev)
}
/* TODO: request info from primary to set up Rx and Tx */
eth_dev->dev_ops = &ops;
+ eth_dev->device = &dev->device;
rte_eth_dev_probing_finish(eth_dev);
return 0;
}
@@ -1827,12 +1828,24 @@ rte_pmd_tap_remove(struct rte_vdev_device *dev)
{
struct rte_eth_dev *eth_dev = NULL;
struct pmd_internals *internals;
+ const char *name;
int i;
+ name = rte_vdev_device_name(dev);
/* find the ethdev entry */
- eth_dev = rte_eth_dev_allocated(rte_vdev_device_name(dev));
+ eth_dev = rte_eth_dev_allocated(name);
if (!eth_dev)
- return 0;
+ return -ENODEV;
+
+ if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
+ /* detach device on local pprocess only */
+ if (strlen(rte_vdev_device_args(dev)) == 0)
+ return rte_eth_dev_release_port_local(eth_dev);
+ /**
+ * else this is a private device for current process
+ * so continue with normal detach scenario
+ */
+ }
internals = eth_dev->data->dev_private;