ethdev: add probing finish function
authorThomas Monjalon <thomas@monjalon.net>
Thu, 10 May 2018 23:58:30 +0000 (01:58 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 14 May 2018 21:31:53 +0000 (22:31 +0100)
A new hook function is added and called inside the PMDs at the end
of the device probing:
- in primary process, after allocating, init and config
- in secondary process, after attaching and local init

This new function is almost empty for now.
It will be used later to add some post-initialization processing.

For the PMDs calling the helpers rte_eth_dev_create() or
rte_eth_dev_pci_generic_probe(), the hook rte_eth_dev_probing_finish()
is called from here, and not in the PMD itself.

Note that the helper rte_eth_dev_create() could be used more,
especially for vdevs, avoiding some code duplication in PMDs.

Cc: stable@dpdk.org
Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Stephen Hemminger <stephen@networkplumber.org>
29 files changed:
drivers/net/af_packet/rte_eth_af_packet.c
drivers/net/ark/ark_ethdev.c
drivers/net/bonding/rte_eth_bond_pmd.c
drivers/net/cxgbe/cxgbe_ethdev.c
drivers/net/cxgbe/cxgbe_main.c
drivers/net/cxgbe/cxgbevf_ethdev.c
drivers/net/cxgbe/cxgbevf_main.c
drivers/net/dpaa/dpaa_ethdev.c
drivers/net/dpaa2/dpaa2_ethdev.c
drivers/net/failsafe/failsafe.c
drivers/net/kni/rte_eth_kni.c
drivers/net/mlx4/mlx4.c
drivers/net/mlx5/mlx5.c
drivers/net/mvpp2/mrvl_ethdev.c
drivers/net/nfp/nfp_net.c
drivers/net/null/rte_eth_null.c
drivers/net/octeontx/octeontx_ethdev.c
drivers/net/pcap/rte_eth_pcap.c
drivers/net/ring/rte_eth_ring.c
drivers/net/softnic/rte_eth_softnic.c
drivers/net/szedata2/rte_eth_szedata2.c
drivers/net/tap/rte_eth_tap.c
drivers/net/vhost/rte_eth_vhost.c
drivers/net/virtio/virtio_user_ethdev.c
lib/librte_ethdev/rte_ethdev.c
lib/librte_ethdev/rte_ethdev_driver.h
lib/librte_ethdev/rte_ethdev_pci.h
lib/librte_ethdev/rte_ethdev_version.map
test/test/virtual_pmd.c

index 12a0865..ea47abb 100644 (file)
@@ -911,6 +911,7 @@ rte_eth_from_packet(struct rte_vdev_device *dev,
        eth_dev->rx_pkt_burst = eth_af_packet_rx;
        eth_dev->tx_pkt_burst = eth_af_packet_tx;
 
+       rte_eth_dev_probing_finish(eth_dev);
        return 0;
 }
 
@@ -934,6 +935,7 @@ rte_pmd_af_packet_probe(struct rte_vdev_device *dev)
                }
                /* TODO: request info from primary to set up Rx and Tx */
                eth_dev->dev_ops = &ops;
+               rte_eth_dev_probing_finish(eth_dev);
                return 0;
        }
 
index d275ab7..62e4fd3 100644 (file)
@@ -422,6 +422,8 @@ eth_ark_dev_init(struct rte_eth_dev *dev)
                        ark->user_data[eth_dev->data->port_id] =
                                ark->user_ext.dev_init(dev, ark->a_bar, p);
                }
+
+               rte_eth_dev_probing_finish(eth_dev);
        }
 
        return ret;
index 0c44a92..d0941c8 100644 (file)
@@ -3052,6 +3052,7 @@ bond_probe(struct rte_vdev_device *dev)
                }
                /* TODO: request info from primary to set up Rx and Tx */
                eth_dev->dev_ops = &default_dev_ops;
+               rte_eth_dev_probing_finish(eth_dev);
                return 0;
        }
 
@@ -3124,6 +3125,7 @@ bond_probe(struct rte_vdev_device *dev)
                rte_eth_bond_8023ad_agg_selection_set(port_id, AGG_STABLE);
        }
 
+       rte_eth_dev_probing_finish(&rte_eth_devices[port_id]);
        RTE_BOND_LOG(INFO, "Create bonded device %s on port %d in mode %u on "
                        "socket %u.",   name, port_id, bonding_mode, socket_id);
        return 0;
index fadf684..14011bb 100644 (file)
@@ -1107,6 +1107,7 @@ static int eth_cxgbe_dev_init(struct rte_eth_dev *eth_dev)
                                        eth_dev->rx_pkt_burst;
                                rest_eth_dev->tx_pkt_burst =
                                        eth_dev->tx_pkt_burst;
+                               rte_eth_dev_probing_finish(rest_eth_dev);
                        }
                }
                return 0;
index 74bccd5..9ad5e54 100644 (file)
@@ -1435,6 +1435,11 @@ allocate_mac:
                        err = -1;
                        goto out_free;
                }
+
+               if (i > 0) {
+                       /* First port will be notified by upper layer */
+                       rte_eth_dev_probing_finish(eth_dev);
+               }
        }
 
        if (adapter->flags & FW_OK) {
index 4885b97..a942ba6 100644 (file)
@@ -138,6 +138,7 @@ static int eth_cxgbevf_dev_init(struct rte_eth_dev *eth_dev)
                                        eth_dev->rx_pkt_burst;
                                rest_eth_dev->tx_pkt_burst =
                                        eth_dev->tx_pkt_burst;
+                               rte_eth_dev_probing_finish(rest_eth_dev);
                        }
                }
                return 0;
index 6c81fd1..5b3fb53 100644 (file)
@@ -267,6 +267,11 @@ allocate_mac:
                        err = -ENOMEM;
                        goto out_free;
                }
+
+               if (i > 0) {
+                       /* First port will be notified by upper layer */
+                       rte_eth_dev_probing_finish(eth_dev);
+               }
        }
 
        if (adapter->flags & FW_OK) {
index d1d765f..d014a11 100644 (file)
@@ -1372,6 +1372,7 @@ rte_dpaa_probe(struct rte_dpaa_driver *dpaa_drv,
                eth_dev = rte_eth_dev_attach_secondary(dpaa_dev->name);
                if (!eth_dev)
                        return -ENOMEM;
+               rte_eth_dev_probing_finish(eth_dev);
                return 0;
        }
 
@@ -1421,8 +1422,10 @@ rte_dpaa_probe(struct rte_dpaa_driver *dpaa_drv,
 
        /* Invoke PMD device initialization function */
        diag = dpaa_dev_init(eth_dev);
-       if (diag == 0)
+       if (diag == 0) {
+               rte_eth_dev_probing_finish(eth_dev);
                return 0;
+       }
 
        if (rte_eal_process_type() == RTE_PROC_PRIMARY)
                rte_free(eth_dev->data->dev_private);
index ec96a1c..9297725 100644 (file)
@@ -2018,8 +2018,10 @@ rte_dpaa2_probe(struct rte_dpaa2_driver *dpaa2_drv,
 
        /* Invoke PMD device initialization function */
        diag = dpaa2_dev_init(eth_dev);
-       if (diag == 0)
+       if (diag == 0) {
+               rte_eth_dev_probing_finish(eth_dev);
                return 0;
+       }
 
        if (rte_eal_process_type() == RTE_PROC_PRIMARY)
                rte_free(eth_dev->data->dev_private);
index 3a747c2..b35471d 100644 (file)
@@ -259,6 +259,7 @@ fs_eth_dev_create(struct rte_vdev_device *vdev)
                .fd = -1,
                .type = RTE_INTR_HANDLE_EXT,
        };
+       rte_eth_dev_probing_finish(dev);
        return 0;
 cancel_alarm:
        failsafe_hotplug_alarm_cancel(dev);
@@ -313,6 +314,7 @@ rte_pmd_failsafe_probe(struct rte_vdev_device *vdev)
                }
                /* TODO: request info from primary to set up Rx and Tx */
                eth_dev->dev_ops = &failsafe_ops;
+               rte_eth_dev_probing_finish(eth_dev);
                return 0;
        }
 
index b468138..ab63ea4 100644 (file)
@@ -419,6 +419,7 @@ eth_kni_probe(struct rte_vdev_device *vdev)
                }
                /* TODO: request info from primary to set up Rx and Tx */
                eth_dev->dev_ops = &eth_kni_ops;
+               rte_eth_dev_probing_finish(eth_dev);
                return 0;
        }
 
@@ -437,6 +438,7 @@ eth_kni_probe(struct rte_vdev_device *vdev)
        eth_dev->rx_pkt_burst = eth_kni_rx;
        eth_dev->tx_pkt_burst = eth_kni_tx;
 
+       rte_eth_dev_probing_finish(eth_dev);
        return 0;
 
 kni_uninit:
index abed2f5..9f8ecd0 100644 (file)
@@ -761,6 +761,7 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                /* Update link status once if waiting for LSC. */
                if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
                        mlx4_link_update(eth_dev, 0);
+               rte_eth_dev_probing_finish(eth_dev);
                continue;
 port_error:
                rte_free(priv);
index 8cd2bc0..8aa91cc 100644 (file)
@@ -932,6 +932,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
                                mlx5_select_rx_function(eth_dev);
                        eth_dev->tx_pkt_burst =
                                mlx5_select_tx_function(eth_dev);
+                       rte_eth_dev_probing_finish(eth_dev);
                        continue;
                }
                DRV_LOG(DEBUG, "using port %u (%08" PRIx32 ")", port, test);
@@ -1177,6 +1178,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
                        goto port_error;
                }
                priv->config.max_verbs_prio = verb_priorities;
+               rte_eth_dev_probing_finish(eth_dev);
                continue;
 port_error:
                if (priv)
index c9d85ca..ea6a786 100644 (file)
@@ -2515,6 +2515,7 @@ mrvl_eth_dev_create(struct rte_vdev_device *vdev, const char *name)
        eth_dev->device = &vdev->device;
        eth_dev->dev_ops = &mrvl_ops;
 
+       rte_eth_dev_probing_finish(eth_dev);
        return 0;
 out_free_mac:
        rte_free(eth_dev->data->mac_addrs);
index d3b8ec0..ff6aad0 100644 (file)
@@ -2967,6 +2967,8 @@ nfp_pf_create_dev(struct rte_pci_device *dev, int port, int ports,
 
        if (ret)
                rte_eth_dev_release_port(eth_dev);
+       else
+               rte_eth_dev_probing_finish(eth_dev);
 
        rte_free(port_name);
 
index f04a7d7..1d2e6b9 100644 (file)
@@ -559,6 +559,7 @@ eth_dev_null_create(struct rte_vdev_device *dev,
                eth_dev->tx_pkt_burst = eth_null_tx;
        }
 
+       rte_eth_dev_probing_finish(eth_dev);
        return 0;
 }
 
@@ -622,6 +623,7 @@ rte_pmd_null_probe(struct rte_vdev_device *dev)
                }
                /* TODO: request info from primary to set up Rx and Tx */
                eth_dev->dev_ops = &ops;
+               rte_eth_dev_probing_finish(eth_dev);
                return 0;
        }
 
index 3199975..1eb453b 100644 (file)
@@ -1016,6 +1016,7 @@ octeontx_create(struct rte_vdev_device *dev, int port, uint8_t evdev,
 
                eth_dev->tx_pkt_burst = octeontx_xmit_pkts;
                eth_dev->rx_pkt_burst = octeontx_recv_pkts;
+               rte_eth_dev_probing_finish(eth_dev);
                return 0;
        }
 
@@ -1100,6 +1101,7 @@ octeontx_create(struct rte_vdev_device *dev, int port, uint8_t evdev,
        rte_octeontx_pchan_map[(nic->base_ochan >> 8) & 0x7]
                [(nic->base_ochan >> 4) & 0xF] = data->port_id;
 
+       rte_eth_dev_probing_finish(eth_dev);
        return data->port_id;
 
 err:
@@ -1180,6 +1182,7 @@ octeontx_probe(struct rte_vdev_device *dev)
                }
                /* TODO: request info from primary to set up Rx and Tx */
                eth_dev->dev_ops = &octeontx_dev_ops;
+               rte_eth_dev_probing_finish(eth_dev);
                return 0;
        }
 
index 44c4d8e..6bd4a7d 100644 (file)
@@ -893,6 +893,7 @@ eth_from_pcaps(struct rte_vdev_device *vdev,
        else
                eth_dev->tx_pkt_burst = eth_pcap_tx;
 
+       rte_eth_dev_probing_finish(eth_dev);
        return 0;
 }
 
@@ -924,6 +925,7 @@ pmd_pcap_probe(struct rte_vdev_device *dev)
                }
                /* TODO: request info from primary to set up Rx and Tx */
                eth_dev->dev_ops = &ops;
+               rte_eth_dev_probing_finish(eth_dev);
                return 0;
        }
 
index be934cf..35b837c 100644 (file)
@@ -329,6 +329,7 @@ do_eth_dev_ring_create(const char *name,
        eth_dev->rx_pkt_burst = eth_ring_rx;
        eth_dev->tx_pkt_burst = eth_ring_tx;
 
+       rte_eth_dev_probing_finish(eth_dev);
        *eth_dev_p = eth_dev;
 
        return data->port_id;
index b1f2780..6b3c13e 100644 (file)
@@ -535,6 +535,8 @@ pmd_ethdev_register(struct rte_vdev_device *vdev,
        soft_dev->data->kdrv = RTE_KDRV_NONE;
        soft_dev->data->numa_node = numa_node;
 
+       rte_eth_dev_probing_finish(soft_dev);
+
        return 0;
 }
 
@@ -748,6 +750,7 @@ pmd_probe(struct rte_vdev_device *vdev)
                }
                /* TODO: request info from primary to set up Rx and Tx */
                eth_dev->dev_ops = &pmd_ops;
+               rte_eth_dev_probing_finish(eth_dev);
                return 0;
        }
 
index d105e50..910c64d 100644 (file)
@@ -1841,6 +1841,8 @@ static int szedata2_eth_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
                        rte_free(list_entry);
                        return ret;
                }
+
+               rte_eth_dev_probing_finish(eth_devs[i]);
        }
 
        /*
index 598dc67..d3d1111 100644 (file)
@@ -1468,6 +1468,7 @@ eth_dev_tap_create(struct rte_vdev_device *vdev, char *tap_name,
                }
        }
 
+       rte_eth_dev_probing_finish(dev);
        return 0;
 
 disable_rte_flow:
@@ -1664,6 +1665,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;
+               rte_eth_dev_probing_finish(eth_dev);
                return 0;
        }
 
index bd42eee..0d000c7 100644 (file)
@@ -1284,6 +1284,7 @@ eth_dev_vhost_create(struct rte_vdev_device *dev, char *iface_name,
                goto error;
        }
 
+       rte_eth_dev_probing_finish(eth_dev);
        return data->port_id;
 
 error:
@@ -1354,6 +1355,7 @@ rte_pmd_vhost_probe(struct rte_vdev_device *dev)
                }
                /* TODO: request info from primary to set up Rx and Tx */
                eth_dev->dev_ops = &ops;
+               rte_eth_dev_probing_finish(eth_dev);
                return 0;
        }
 
index 4e7b3c3..8eab909 100644 (file)
@@ -563,6 +563,7 @@ virtio_user_pmd_probe(struct rte_vdev_device *dev)
                        virtio_user_eth_dev_free(eth_dev);
                        goto end;
                }
+
        } else {
                eth_dev = rte_eth_dev_attach_secondary(rte_vdev_device_name(dev));
                if (!eth_dev)
@@ -575,6 +576,8 @@ virtio_user_pmd_probe(struct rte_vdev_device *dev)
                virtio_user_eth_dev_free(eth_dev);
                goto end;
        }
+
+       rte_eth_dev_probing_finish(eth_dev);
        ret = 0;
 
 end:
index 87fea92..e79de30 100644 (file)
@@ -3448,6 +3448,13 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
        return rc;
 }
 
+void
+rte_eth_dev_probing_finish(struct rte_eth_dev *dev)
+{
+       if (dev == NULL)
+               return;
+}
+
 int
 rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data)
 {
@@ -3562,6 +3569,8 @@ rte_eth_dev_create(struct rte_device *device, const char *name,
                goto probe_failed;
        }
 
+       rte_eth_dev_probing_finish(ethdev);
+
        return retval;
 probe_failed:
        /* free ports private data if primary process */
index da52b70..3821f0b 100644 (file)
@@ -101,6 +101,16 @@ void _rte_eth_dev_reset(struct rte_eth_dev *dev);
 int _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
                enum rte_eth_event_type event, void *ret_param);
 
+/**
+ * @internal
+ * This is the last step of device probing.
+ * It must be called after a port is allocated and initialized successfully.
+ *
+ * @param dev
+ *  New ethdev port.
+ */
+void rte_eth_dev_probing_finish(struct rte_eth_dev *dev);
+
 /**
  * Create memzone for HW rings.
  * malloc can't be used as the physical address is needed.
index 603287c..2cfd372 100644 (file)
@@ -175,6 +175,8 @@ rte_eth_dev_pci_generic_probe(struct rte_pci_device *pci_dev,
        ret = dev_init(eth_dev);
        if (ret)
                rte_eth_dev_pci_release(eth_dev);
+       else
+               rte_eth_dev_probing_finish(eth_dev);
 
        return ret;
 }
index 472658f..4f1f4c8 100644 (file)
@@ -199,6 +199,7 @@ DPDK_18.05 {
        global:
 
        rte_eth_dev_count_avail;
+       rte_eth_dev_probing_finish;
        rte_eth_find_next_owned_by;
        rte_flow_copy;
        rte_flow_create;
index 69b4ba0..f8ddc2d 100644 (file)
@@ -590,6 +590,8 @@ virtual_ethdev_create(const char *name, struct ether_addr *mac_addr,
        eth_dev->rx_pkt_burst = virtual_ethdev_rx_burst_success;
        eth_dev->tx_pkt_burst = virtual_ethdev_tx_burst_success;
 
+       rte_eth_dev_probing_finish(eth_dev);
+
        return eth_dev->data->port_id;
 
 err: