ethdev: add probing finish function
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>
This commit is contained in:
parent
01a98fdd08
commit
fbe90cdd77
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 = ð_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:
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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]);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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 */
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user