From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from out1-smtp.messagingengine.com (out1-smtp.messagingengine.com [66.111.4.25]) by dpdk.org (Postfix) with ESMTP id 1D6F72BAF for ; Sun, 20 May 2018 13:00:50 +0200 (CEST) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 9AAD122341; Sun, 20 May 2018 07:00:49 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Sun, 20 May 2018 07:00:49 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h= date:from:in-reply-to:message-id:references:subject:to :x-me-sender:x-me-sender:x-sasl-enc; s=mesmtp; bh=uKYSI9lUa8cKIf WOZy1l2Juq+cK2NkFb5Vrw3yYiokA=; b=k1xSgX0VdVVzZIhXUWklbQR10IwQda 8nA8olazXsTbwpkCB8eY4+nasMnYYZEeLkVAKXftFWpLjS27297AhIzbuCuZTcbt NH2tLG+yqNM+z+VC8NXI7H/BwCHLY5m9CqZPcKUiPL/jfk2St3nhgDCo7XVmOI+e Ni9p0dPVHSKZc= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=date:from:in-reply-to:message-id :references:subject:to:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; bh=uKYSI9lUa8cKIfWOZy1l2Juq+cK2NkFb5Vrw3yYiokA=; b=i+dcnseH SaELFaqhxP+h8wbL7bs/udZ2tMzpW8LoIRusrRuBYIRL/+aoIMOtnhRP31FIuPuY jyzpB8gaNGsNkh84VInXpj2vLNaarJ8a99ZIxzWLjS0Qqh+Usu+QsDJeL4XkstY6 0yCvQE/soh1C8cOqdWmob87M7ILflMripuSCsDYumMOuv1HsH7LQc2McQBEQvBHX cQrzHO0i67V0P56+Cih/9PQGcH6mYKpQuaNHyiYEW4mBZBhhID4B+7KyBbSubBWp DCpi4QVdwE1PrtglZNQ1Y7D+ZUPyOThPuc7Al8aWv+GWFxMjyNN9Xw1kW3norcDB lJk0y2cUfC5C+A== X-ME-Proxy: X-ME-Proxy: X-ME-Proxy: X-ME-Proxy: X-ME-Proxy: X-ME-Proxy: X-ME-Sender: Received: from xps.monjalon.net (114.149.6.93.rev.sfr.net [93.6.149.114]) by mail.messagingengine.com (Postfix) with ESMTPA id 3A10D10265 for ; Sun, 20 May 2018 07:00:48 -0400 (EDT) From: Thomas Monjalon To: stable@dpdk.org Date: Sun, 20 May 2018 13:00:03 +0200 Message-Id: <20180520110006.9026-2-thomas@monjalon.net> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180520110006.9026-1-thomas@monjalon.net> References: <20180520110006.9026-1-thomas@monjalon.net> Subject: [dpdk-stable] [PATCH 18.02 1/4] ethdev: add probing finish function X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 20 May 2018 11:00:50 -0000 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. Signed-off-by: Thomas Monjalon Reviewed-by: Andrew Rybchenko Reviewed-by: Stephen Hemminger --- drivers/net/af_packet/rte_eth_af_packet.c | 1 + drivers/net/ark/ark_ethdev.c | 2 ++ drivers/net/bonding/rte_eth_bond_pmd.c | 1 + drivers/net/cxgbe/cxgbe_ethdev.c | 1 + drivers/net/cxgbe/cxgbe_main.c | 5 +++++ drivers/net/dpaa/dpaa_ethdev.c | 5 ++++- drivers/net/dpaa2/dpaa2_ethdev.c | 4 +++- drivers/net/failsafe/failsafe.c | 1 + drivers/net/kni/rte_eth_kni.c | 1 + drivers/net/mlx4/mlx4.c | 1 + drivers/net/mlx5/mlx5.c | 2 ++ drivers/net/mrvl/mrvl_ethdev.c | 1 + drivers/net/nfp/nfp_net.c | 2 ++ drivers/net/null/rte_eth_null.c | 1 + drivers/net/octeontx/octeontx_ethdev.c | 2 ++ drivers/net/pcap/rte_eth_pcap.c | 1 + drivers/net/ring/rte_eth_ring.c | 1 + drivers/net/softnic/rte_eth_softnic.c | 2 ++ drivers/net/tap/rte_eth_tap.c | 1 + drivers/net/vhost/rte_eth_vhost.c | 1 + drivers/net/virtio/virtio_user_ethdev.c | 3 +++ lib/librte_ether/rte_ethdev.c | 7 +++++++ lib/librte_ether/rte_ethdev_driver.h | 10 ++++++++++ lib/librte_ether/rte_ethdev_pci.h | 2 ++ lib/librte_ether/rte_ethdev_version.map | 1 + test/test/virtual_pmd.c | 2 ++ 26 files changed, 59 insertions(+), 2 deletions(-) diff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c index 7694b21ca..76e6ca21f 100644 --- a/drivers/net/af_packet/rte_eth_af_packet.c +++ b/drivers/net/af_packet/rte_eth_af_packet.c @@ -917,6 +917,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; } diff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c index ff87c20e2..9fdfce680 100644 --- a/drivers/net/ark/ark_ethdev.c +++ b/drivers/net/ark/ark_ethdev.c @@ -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; diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c index 324753484..7af5166b2 100644 --- a/drivers/net/bonding/rte_eth_bond_pmd.c +++ b/drivers/net/bonding/rte_eth_bond_pmd.c @@ -3088,6 +3088,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_LOG(INFO, EAL, "Create bonded device %s on port %d in mode %u on " "socket %u.\n", name, port_id, bonding_mode, socket_id); return 0; diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c index 423a6957b..ed2f027c4 100644 --- a/drivers/net/cxgbe/cxgbe_ethdev.c +++ b/drivers/net/cxgbe/cxgbe_ethdev.c @@ -1027,6 +1027,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; diff --git a/drivers/net/cxgbe/cxgbe_main.c b/drivers/net/cxgbe/cxgbe_main.c index 28db6c061..3fecc08c2 100644 --- a/drivers/net/cxgbe/cxgbe_main.c +++ b/drivers/net/cxgbe/cxgbe_main.c @@ -1318,6 +1318,11 @@ int cxgbe_probe(struct adapter *adapter) 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) { diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c index 7f841bd0c..b15c13d8b 100644 --- a/drivers/net/dpaa/dpaa_ethdev.c +++ b/drivers/net/dpaa/dpaa_ethdev.c @@ -1321,6 +1321,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; } @@ -1370,8 +1371,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); diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c index 182fcf329..59b526c6e 100644 --- a/drivers/net/dpaa2/dpaa2_ethdev.c +++ b/drivers/net/dpaa2/dpaa2_ethdev.c @@ -2016,8 +2016,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); diff --git a/drivers/net/failsafe/failsafe.c b/drivers/net/failsafe/failsafe.c index da2c7f07a..785e373f3 100644 --- a/drivers/net/failsafe/failsafe.c +++ b/drivers/net/failsafe/failsafe.c @@ -266,6 +266,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); diff --git a/drivers/net/kni/rte_eth_kni.c b/drivers/net/kni/rte_eth_kni.c index 57f3c50e3..5b53b920e 100644 --- a/drivers/net/kni/rte_eth_kni.c +++ b/drivers/net/kni/rte_eth_kni.c @@ -429,6 +429,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: diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index bc12b6030..7b3616e3c 100644 --- a/drivers/net/mlx4/mlx4.c +++ b/drivers/net/mlx4/mlx4.c @@ -733,6 +733,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); diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index 81057f438..f1f8006b7 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -757,6 +757,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; } DEBUG("using port %u (%08" PRIx32 ")", port, test); @@ -948,6 +949,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, mlx5_link_update(eth_dev, 0); /* Store device configuration on private structure. */ priv->config = config; + rte_eth_dev_probing_finish(eth_dev); continue; port_error: if (priv) diff --git a/drivers/net/mrvl/mrvl_ethdev.c b/drivers/net/mrvl/mrvl_ethdev.c index 4226f83a4..917dc3581 100644 --- a/drivers/net/mrvl/mrvl_ethdev.c +++ b/drivers/net/mrvl/mrvl_ethdev.c @@ -2281,6 +2281,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); diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c index 16adbb29e..a010f223c 100644 --- a/drivers/net/nfp/nfp_net.c +++ b/drivers/net/nfp/nfp_net.c @@ -3008,6 +3008,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); diff --git a/drivers/net/null/rte_eth_null.c b/drivers/net/null/rte_eth_null.c index 181785b48..1ba5ca473 100644 --- a/drivers/net/null/rte_eth_null.c +++ b/drivers/net/null/rte_eth_null.c @@ -564,6 +564,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; } diff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c index 311e9ce4c..93d57e3e4 100644 --- a/drivers/net/octeontx/octeontx_ethdev.c +++ b/drivers/net/octeontx/octeontx_ethdev.c @@ -1051,6 +1051,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; } @@ -1145,6 +1146,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: diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c index 814beedc8..026d29574 100644 --- a/drivers/net/pcap/rte_eth_pcap.c +++ b/drivers/net/pcap/rte_eth_pcap.c @@ -899,6 +899,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; } diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c index 311ec3d5a..947c8f13c 100644 --- a/drivers/net/ring/rte_eth_ring.c +++ b/drivers/net/ring/rte_eth_ring.c @@ -335,6 +335,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; diff --git a/drivers/net/softnic/rte_eth_softnic.c b/drivers/net/softnic/rte_eth_softnic.c index d8ecfc2f0..a1ae81f73 100644 --- a/drivers/net/softnic/rte_eth_softnic.c +++ b/drivers/net/softnic/rte_eth_softnic.c @@ -529,6 +529,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; } diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c index 7f85d4133..6ce02c9b6 100644 --- a/drivers/net/tap/rte_eth_tap.c +++ b/drivers/net/tap/rte_eth_tap.c @@ -1506,6 +1506,7 @@ eth_dev_tap_create(struct rte_vdev_device *vdev, char *tap_name, } } + rte_eth_dev_probing_finish(dev); return 0; disable_rte_flow: diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index 1a1d532e7..8a9653875 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -1130,6 +1130,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: diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 263649006..d8ee70528 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -482,6 +482,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) @@ -494,6 +495,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: diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 25fd3bc46..365540d3f 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -3375,6 +3375,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) { diff --git a/lib/librte_ether/rte_ethdev_driver.h b/lib/librte_ether/rte_ethdev_driver.h index 45f08c65e..77297f331 100644 --- a/lib/librte_ether/rte_ethdev_driver.h +++ b/lib/librte_ether/rte_ethdev_driver.h @@ -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. diff --git a/lib/librte_ether/rte_ethdev_pci.h b/lib/librte_ether/rte_ethdev_pci.h index 6565ae7d3..6ea401da4 100644 --- a/lib/librte_ether/rte_ethdev_pci.h +++ b/lib/librte_ether/rte_ethdev_pci.h @@ -163,6 +163,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; } diff --git a/lib/librte_ether/rte_ethdev_version.map b/lib/librte_ether/rte_ethdev_version.map index 87f02fb74..d7143a0a7 100644 --- a/lib/librte_ether/rte_ethdev_version.map +++ b/lib/librte_ether/rte_ethdev_version.map @@ -201,6 +201,7 @@ DPDK_18.02 { global: rte_eth_dev_filter_ctrl; + rte_eth_dev_probing_finish; } DPDK_17.11; diff --git a/test/test/virtual_pmd.c b/test/test/virtual_pmd.c index 2f5b31dba..3d16c7197 100644 --- a/test/test/virtual_pmd.c +++ b/test/test/virtual_pmd.c @@ -589,6 +589,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: -- 2.16.2