Message ID | 1610555333-18961-2-git-send-email-michaelba@nvidia.com (mailing list archive) |
---|---|
State | Superseded, archived |
Delegated to: | Raslan Darawsheh |
Headers | show |
Series | net/mlx4: fix PCI probe and remove functions | expand |
Context | Check | Description |
---|---|---|
ci/checkpatch | success | coding style OK |
On Wed, Jan 13, 2021 at 5:29 PM Michael Baum <michaelba@nvidia.com> wrote: > > When mlx4 device is probed, 2 different ethdev ports may be created for > the 2 physical ports of the device. > > Wrongly, when the device is removed, the created ports are not released. > > Close and release the ethdev ports in remove process. > Missing a reference to bug 488. > Fixes: 7fae69eeff13 ("mlx4: new poll mode driver") Odd that it never worked, but if Matan acked, I guess this is ok. > Cc: stable@dpdk.org > > Reported-by: David Marchand <david.marchand@redhat.com> > Signed-off-by: Michael Baum <michaelba@nvidia.com> > Acked-by: Matan Azrad <matan@nvidia.com>
On Thu, Jan 14, 2021 at 9:32 AM David Marchand <david.marchand@redhat.com> wrote: > > On Wed, Jan 13, 2021 at 5:29 PM Michael Baum <michaelba@nvidia.com> wrote: > > > > When mlx4 device is probed, 2 different ethdev ports may be created for > > the 2 physical ports of the device. > > > > Wrongly, when the device is removed, the created ports are not released. > > > > Close and release the ethdev ports in remove process. > > > > Missing a reference to bug 488. > > > Fixes: 7fae69eeff13 ("mlx4: new poll mode driver") > > Odd that it never worked, but if Matan acked, I guess this is ok. > > > Cc: stable@dpdk.org > > > > Reported-by: David Marchand <david.marchand@redhat.com> > > Signed-off-by: Michael Baum <michaelba@nvidia.com> > > Acked-by: Matan Azrad <matan@nvidia.com> Forgot to add my tag.. Tested-by: David Marchand <david.marchand@redhat.com> Thanks for fixing.
diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index d5d8c96..7460afa 100644 --- a/drivers/net/mlx4/mlx4.c +++ b/drivers/net/mlx4/mlx4.c @@ -375,8 +375,10 @@ struct mlx4_conf { struct mlx4_priv *priv = dev->data->dev_private; unsigned int i; - if (rte_eal_process_type() != RTE_PROC_PRIMARY) + if (rte_eal_process_type() == RTE_PROC_SECONDARY) { + rte_eth_dev_release_port(dev); return 0; + } DEBUG("%p: closing device \"%s\"", (void *)dev, ((priv->ctx != NULL) ? priv->ctx->device->name : "")); @@ -1123,6 +1125,36 @@ struct mlx4_conf { return -err; } +/** + * DPDK callback to remove a PCI device. + * + * This function removes all Ethernet devices belong to a given PCI device. + * + * @param[in] pci_dev + * Pointer to the PCI device. + * + * @return + * 0 on success, the function cannot fail. + */ +static int +mlx4_pci_remove(struct rte_pci_device *pci_dev) +{ + uint16_t port_id; + int ret = 0; + + RTE_ETH_FOREACH_DEV_OF(port_id, &pci_dev->device) { + /* + * mlx4_dev_close() is not registered to secondary process, + * call the close function explicitly for secondary process. + */ + if (rte_eal_process_type() == RTE_PROC_SECONDARY) + ret |= mlx4_dev_close(&rte_eth_devices[port_id]); + else + ret |= rte_eth_dev_close(port_id); + } + return ret == 0 ? 0 : -EIO; +} + static const struct rte_pci_id mlx4_pci_id_map[] = { { RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX, @@ -1147,6 +1179,7 @@ struct mlx4_conf { }, .id_table = mlx4_pci_id_map, .probe = mlx4_pci_probe, + .remove = mlx4_pci_remove, .drv_flags = RTE_PCI_DRV_INTR_LSC | RTE_PCI_DRV_INTR_RMV, };