From 8d30fe7fa7370d60bb85af34a8a4189c63e74178 Mon Sep 17 00:00:00 2001 From: Bernard Iremonger Date: Mon, 27 Jul 2015 16:54:34 +0100 Subject: [PATCH] bonding: support port hotplug This patch depends on the Port Hotplug Framework. It implements the rte_dev_uninit_t() function for the link bonding pmd. Signed-off-by: Bernard Iremonger Acked-by: Declan Doherty --- drivers/net/bonding/rte_eth_bond.h | 13 +++- drivers/net/bonding/rte_eth_bond_api.c | 80 +++++++++++++------- drivers/net/bonding/rte_eth_bond_pmd.c | 25 +++++- drivers/net/bonding/rte_eth_bond_private.h | 10 ++- drivers/net/bonding/rte_eth_bond_version.map | 7 ++ 5 files changed, 102 insertions(+), 33 deletions(-) diff --git a/drivers/net/bonding/rte_eth_bond.h b/drivers/net/bonding/rte_eth_bond.h index d688fc3afd..8efbf0713c 100644 --- a/drivers/net/bonding/rte_eth_bond.h +++ b/drivers/net/bonding/rte_eth_bond.h @@ -1,7 +1,7 @@ /*- * BSD LICENSE * - * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. + * Copyright(c) 2010-2015 Intel Corporation. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -130,6 +130,17 @@ extern "C" { int rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id); +/** + * Free a bonded rte_eth_dev device + * + * @param name Name of the link bonding device. + * + * @return + * 0 on success, negative value otherwise + */ +int +rte_eth_bond_free(const char *name); + /** * Add a rte_eth_dev device as a slave to the bonded device * diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c index f6026582cb..4ca26ddf36 100644 --- a/drivers/net/bonding/rte_eth_bond_api.c +++ b/drivers/net/bonding/rte_eth_bond_api.c @@ -1,7 +1,7 @@ /*- * BSD LICENSE * - * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. + * Copyright(c) 2010-2015 Intel Corporation. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -163,7 +163,22 @@ number_of_sockets(void) return ++sockets; } -const char *pmd_bond_driver_name = "Link Bonding PMD"; +const char pmd_bond_driver_name[] = "rte_bond_pmd"; + +static struct rte_pci_id pci_id_table = { + .device_id = PCI_ANY_ID, + .subsystem_device_id = PCI_ANY_ID, + .vendor_id = PCI_ANY_ID, + .subsystem_vendor_id = PCI_ANY_ID, +}; + +static struct eth_driver rte_bond_pmd = { + .pci_drv = { + .name = pmd_bond_driver_name, + .drv_flags = RTE_PCI_DRV_INTR_LSC | RTE_PCI_DRV_DETACHABLE, + .id_table = &pci_id_table, + }, +}; int rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id) @@ -171,9 +186,8 @@ rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id) struct rte_pci_device *pci_dev = NULL; struct bond_dev_private *internals = NULL; struct rte_eth_dev *eth_dev = NULL; - struct eth_driver *eth_drv = NULL; struct rte_pci_driver *pci_drv = NULL; - struct rte_pci_id *pci_id_table = NULL; + /* now do all data allocation - for eth_dev structure, dummy pci driver * and internal (private) data */ @@ -195,26 +209,7 @@ rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id) goto err; } - eth_drv = rte_zmalloc_socket(name, sizeof(*eth_drv), 0, socket_id); - if (eth_drv == NULL) { - RTE_BOND_LOG(ERR, "Unable to malloc eth_drv on socket"); - goto err; - } - - pci_drv = ð_drv->pci_drv; - - pci_id_table = rte_zmalloc_socket(name, sizeof(*pci_id_table), 0, socket_id); - if (pci_id_table == NULL) { - RTE_BOND_LOG(ERR, "Unable to malloc pci_id_table on socket"); - goto err; - } - pci_id_table->device_id = PCI_ANY_ID; - pci_id_table->subsystem_device_id = PCI_ANY_ID; - pci_id_table->vendor_id = PCI_ANY_ID; - pci_id_table->subsystem_vendor_id = PCI_ANY_ID; - - pci_drv->id_table = pci_id_table; - pci_drv->drv_flags = RTE_PCI_DRV_INTR_LSC; + pci_drv = &rte_bond_pmd.pci_drv; internals = rte_zmalloc_socket(name, sizeof(*internals), 0, socket_id); if (internals == NULL) { @@ -233,7 +228,7 @@ rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id) pci_drv->name = pmd_bond_driver_name; pci_dev->driver = pci_drv; - eth_dev->driver = eth_drv; + eth_dev->driver = &rte_bond_pmd; eth_dev->data->dev_private = internals; eth_dev->data->nb_rx_queues = (uint16_t)1; eth_dev->data->nb_tx_queues = (uint16_t)1; @@ -289,13 +284,44 @@ rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id) err: rte_free(pci_dev); - rte_free(pci_id_table); - rte_free(eth_drv); rte_free(internals); + rte_free(eth_dev->data->mac_addrs); return -1; } +int +rte_eth_bond_free(const char *name) +{ + struct rte_eth_dev *eth_dev = NULL; + + /* now free all data allocation - for eth_dev structure, + * dummy pci driver and internal (private) data + */ + + /* find an ethdev entry */ + eth_dev = rte_eth_dev_allocated(name); + if (eth_dev == NULL) + return -ENODEV; + + if (eth_dev->data->dev_started == 1) { + bond_ethdev_stop(eth_dev); + bond_ethdev_close(eth_dev); + } + + eth_dev->dev_ops = NULL; + eth_dev->rx_pkt_burst = NULL; + eth_dev->tx_pkt_burst = NULL; + + rte_free(eth_dev->pci_dev); + rte_free(eth_dev->data->dev_private); + rte_free(eth_dev->data->mac_addrs); + + rte_eth_dev_release_port(eth_dev); + + return 0; +} + static int __eth_bond_slave_add_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id) { diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c index 9cafe65fd9..e1a9e7bcc7 100644 --- a/drivers/net/bonding/rte_eth_bond_pmd.c +++ b/drivers/net/bonding/rte_eth_bond_pmd.c @@ -1,7 +1,7 @@ /*- * BSD LICENSE * - * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. + * Copyright(c) 2010-2015 Intel Corporation. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -1512,7 +1512,7 @@ bond_ethdev_start(struct rte_eth_dev *eth_dev) return 0; } -static void +void bond_ethdev_stop(struct rte_eth_dev *eth_dev) { struct bond_dev_private *internals = eth_dev->data->dev_private; @@ -1552,7 +1552,7 @@ bond_ethdev_stop(struct rte_eth_dev *eth_dev) eth_dev->data->dev_started = 0; } -static void +void bond_ethdev_close(struct rte_eth_dev *dev __rte_unused) { } @@ -2042,6 +2042,24 @@ parse_error: return -1; } +static int +bond_uninit(const char *name) +{ + int ret; + + if (name == NULL) + return -EINVAL; + + RTE_LOG(INFO, EAL, "Uninitializing pmd_bond for %s\n", name); + + /* free link bonding eth device */ + ret = rte_eth_bond_free(name); + if (ret < 0) + RTE_LOG(ERR, EAL, "Failed to free %s\n", name); + + return ret; +} + /* this part will resolve the slave portids after all the other pdev and vdev * have been allocated */ static int @@ -2268,6 +2286,7 @@ static struct rte_driver bond_drv = { .name = "eth_bond", .type = PMD_VDEV, .init = bond_init, + .uninit = bond_uninit, }; PMD_REGISTER_DRIVER(bond_drv); diff --git a/drivers/net/bonding/rte_eth_bond_private.h b/drivers/net/bonding/rte_eth_bond_private.h index c531e878c3..9f57f4dd17 100644 --- a/drivers/net/bonding/rte_eth_bond_private.h +++ b/drivers/net/bonding/rte_eth_bond_private.h @@ -1,7 +1,7 @@ /*- * BSD LICENSE * - * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. + * Copyright(c) 2010-2015 Intel Corporation. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -62,7 +62,7 @@ extern const char *pmd_bond_init_valid_arguments[]; -extern const char *pmd_bond_driver_name; +extern const char pmd_bond_driver_name[]; /** Port Queue Mapping Structure */ struct bond_rx_queue { @@ -284,4 +284,10 @@ bond_tlb_enable(struct bond_dev_private *internals); void bond_tlb_activate_slave(struct bond_dev_private *internals); +void +bond_ethdev_stop(struct rte_eth_dev *eth_dev); + +void +bond_ethdev_close(struct rte_eth_dev *dev __rte_unused); + #endif diff --git a/drivers/net/bonding/rte_eth_bond_version.map b/drivers/net/bonding/rte_eth_bond_version.map index 135999e137..22bd92008a 100644 --- a/drivers/net/bonding/rte_eth_bond_version.map +++ b/drivers/net/bonding/rte_eth_bond_version.map @@ -20,3 +20,10 @@ DPDK_2.0 { local: *; }; + +DPDK_2.1 { + global: + + rte_eth_bond_free; + +} DPDK_2.0; -- 2.20.1