Skip to content

Commit

Permalink
drivers/net: enable hotplug on secondary process
Browse files Browse the repository at this point in the history
Attach port from secondary should ignore devargs since the private
device is not necessary to support. Also previously, detach port on
a secondary process will mess primary process and cause the same
device can't be attached back again. A secondary process should use
rte_eth_dev_release_port_secondary to release a port.

Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
  • Loading branch information
qzhan16 authored and tmonjalo committed Oct 17, 2018
1 parent ac9e4a1 commit 4852aa8
Show file tree
Hide file tree
Showing 8 changed files with 37 additions and 15 deletions.
6 changes: 4 additions & 2 deletions drivers/net/af_packet/rte_eth_af_packet.c
Expand Up @@ -926,8 +926,7 @@ rte_pmd_af_packet_probe(struct rte_vdev_device *dev)

PMD_LOG(INFO, "Initializing pmd_af_packet for %s", name);

if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
strlen(rte_vdev_device_args(dev)) == 0) {
if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
eth_dev = rte_eth_dev_attach_secondary(name);
if (!eth_dev) {
PMD_LOG(ERR, "Failed to probe %s", name);
Expand Down Expand Up @@ -987,6 +986,9 @@ rte_pmd_af_packet_remove(struct rte_vdev_device *dev)
if (eth_dev == NULL)
return -1;

if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return rte_eth_dev_release_port_secondary(eth_dev);

internals = eth_dev->data->dev_private;
for (q = 0; q < internals->nb_queues; q++) {
rte_free(internals->rx_queue[q].rd);
Expand Down
6 changes: 4 additions & 2 deletions drivers/net/bonding/rte_eth_bond_pmd.c
Expand Up @@ -3152,8 +3152,7 @@ bond_probe(struct rte_vdev_device *dev)
name = rte_vdev_device_name(dev);
RTE_BOND_LOG(INFO, "Initializing pmd_bond for %s", name);

if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
strlen(rte_vdev_device_args(dev)) == 0) {
if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
eth_dev = rte_eth_dev_attach_secondary(name);
if (!eth_dev) {
RTE_BOND_LOG(ERR, "Failed to probe %s", name);
Expand Down Expand Up @@ -3268,6 +3267,9 @@ bond_remove(struct rte_vdev_device *dev)
if (eth_dev == NULL)
return -ENODEV;

if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return rte_eth_dev_release_port_secondary(eth_dev);

RTE_ASSERT(eth_dev->device == &dev->device);

internals = eth_dev->data->dev_private;
Expand Down
6 changes: 4 additions & 2 deletions drivers/net/kni/rte_eth_kni.c
Expand Up @@ -410,8 +410,7 @@ eth_kni_probe(struct rte_vdev_device *vdev)
params = rte_vdev_device_args(vdev);
PMD_LOG(INFO, "Initializing eth_kni for %s", name);

if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
strlen(params) == 0) {
if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
eth_dev = rte_eth_dev_attach_secondary(name);
if (!eth_dev) {
PMD_LOG(ERR, "Failed to probe %s", name);
Expand Down Expand Up @@ -464,6 +463,9 @@ eth_kni_remove(struct rte_vdev_device *vdev)
if (eth_dev == NULL)
return -1;

if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return rte_eth_dev_release_port_secondary(eth_dev);

eth_kni_dev_stop(eth_dev);

internals = eth_dev->data->dev_private;
Expand Down
6 changes: 4 additions & 2 deletions drivers/net/null/rte_eth_null.c
Expand Up @@ -614,8 +614,7 @@ rte_pmd_null_probe(struct rte_vdev_device *dev)
params = rte_vdev_device_args(dev);
PMD_LOG(INFO, "Initializing pmd_null for %s", name);

if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
strlen(params) == 0) {
if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
eth_dev = rte_eth_dev_attach_secondary(name);
if (!eth_dev) {
PMD_LOG(ERR, "Failed to probe %s", name);
Expand Down Expand Up @@ -680,6 +679,9 @@ rte_pmd_null_remove(struct rte_vdev_device *dev)
if (eth_dev == NULL)
return -1;

if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return rte_eth_dev_release_port_secondary(eth_dev);

rte_free(eth_dev->data->dev_private);

rte_eth_dev_release_port(eth_dev);
Expand Down
8 changes: 8 additions & 0 deletions drivers/net/octeontx/octeontx_ethdev.c
Expand Up @@ -1133,6 +1133,11 @@ octeontx_remove(struct rte_vdev_device *dev)
if (eth_dev == NULL)
return -ENODEV;

if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
rte_eth_dev_release_port_secondary(eth_dev);
continue;
}

nic = octeontx_pmd_priv(eth_dev);
rte_event_dev_stop(nic->evdev);
PMD_INIT_LOG(INFO, "Closing octeontx device %s", octtx_name);
Expand All @@ -1143,6 +1148,9 @@ octeontx_remove(struct rte_vdev_device *dev)
rte_event_dev_close(nic->evdev);
}

if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return 0;

/* Free FC resource */
octeontx_pko_fc_free();

Expand Down
6 changes: 4 additions & 2 deletions drivers/net/pcap/rte_eth_pcap.c
Expand Up @@ -1122,8 +1122,7 @@ pmd_pcap_probe(struct rte_vdev_device *dev)
start_cycles = rte_get_timer_cycles();
hz = rte_get_timer_hz();

if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
strlen(rte_vdev_device_args(dev)) == 0) {
if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
eth_dev = rte_eth_dev_attach_secondary(name);
if (!eth_dev) {
PMD_LOG(ERR, "Failed to probe %s", name);
Expand Down Expand Up @@ -1229,6 +1228,9 @@ pmd_pcap_remove(struct rte_vdev_device *dev)
if (eth_dev == NULL)
return -1;

if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return rte_eth_dev_release_port_secondary(eth_dev);

internals = eth_dev->data->dev_private;
if (internals && internals->phy_mac)
rte_free(eth_dev->data->mac_addrs);
Expand Down
8 changes: 5 additions & 3 deletions drivers/net/tap/rte_eth_tap.c
Expand Up @@ -1992,8 +1992,7 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev)
name = rte_vdev_device_name(dev);
params = rte_vdev_device_args(dev);

if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
strlen(params) == 0) {
if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
eth_dev = rte_eth_dev_attach_secondary(name);
if (!eth_dev) {
TAP_LOG(ERR, "Failed to probe %s", name);
Expand Down Expand Up @@ -2075,7 +2074,10 @@ rte_pmd_tap_remove(struct rte_vdev_device *dev)
/* find the ethdev entry */
eth_dev = rte_eth_dev_allocated(rte_vdev_device_name(dev));
if (!eth_dev)
return 0;
return -ENODEV;

if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return rte_eth_dev_release_port_secondary(eth_dev);

internals = eth_dev->data->dev_private;

Expand Down
6 changes: 4 additions & 2 deletions drivers/net/vhost/rte_eth_vhost.c
Expand Up @@ -1344,8 +1344,7 @@ rte_pmd_vhost_probe(struct rte_vdev_device *dev)

VHOST_LOG(INFO, "Initializing pmd_vhost for %s\n", name);

if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
strlen(rte_vdev_device_args(dev)) == 0) {
if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
eth_dev = rte_eth_dev_attach_secondary(name);
if (!eth_dev) {
VHOST_LOG(ERR, "Failed to probe %s\n", name);
Expand Down Expand Up @@ -1436,6 +1435,9 @@ rte_pmd_vhost_remove(struct rte_vdev_device *dev)
if (eth_dev == NULL)
return -ENODEV;

if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return rte_eth_dev_release_port_secondary(eth_dev);

eth_dev_close(eth_dev);

rte_free(vring_states[eth_dev->data->port_id]);
Expand Down

0 comments on commit 4852aa8

Please sign in to comment.