[dpdk-dev] [PATCH v2 2/4] bus/net: implement hotplug bus operations
Gaetan Rivet
gaetan.rivet at 6wind.com
Thu Jun 8 02:00:59 CEST 2017
Signed-off-by: Gaetan Rivet <gaetan.rivet at 6wind.com>
---
drivers/bus/net/rte_bus_net.c | 60 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 60 insertions(+)
diff --git a/drivers/bus/net/rte_bus_net.c b/drivers/bus/net/rte_bus_net.c
index 27a43f4..f5c7c95 100644
--- a/drivers/bus/net/rte_bus_net.c
+++ b/drivers/bus/net/rte_bus_net.c
@@ -253,11 +253,71 @@ rte_bus_net_pci_xfrm(const struct rte_devargs *src,
return ret < 0 || ret > (int)sizeof(dst->name) || dst->args == NULL;
}
+static struct rte_device *
+net_plug(struct rte_devargs *da)
+{
+ struct rte_net_device *dev;
+
+ dev = net_scan_one(da->name);
+ if (dev == NULL) {
+ rte_errno = EFAULT;
+ return NULL;
+ }
+ if (net_probe_one(dev)) {
+ rte_errno = ENODEV;
+ return NULL;
+ }
+ return dev->sh_dev;
+}
+
+static int
+net_unplug(struct rte_device *dev)
+{
+ struct rte_net_device *ndev;
+ void *tmp;
+ int ret;
+ int err;
+
+ FOREACH_NET_DEVICE_SAFE(ndev, tmp) {
+ struct rte_device *rdev;
+ struct rte_devargs *da;
+ struct rte_devargs *sub;
+
+ if (dev != &ndev->device &&
+ dev != ndev->sh_dev)
+ continue;
+ rdev = ndev->sh_dev;
+ if (rdev == NULL)
+ continue;
+ da = ndev->device.devargs;
+ sub = rdev->devargs;
+ ret = sub->bus->unplug(rdev);
+ if (ret) {
+ err = rte_errno;
+ ERROR("unplug failed");
+ rte_errno = err;
+ return ret;
+ }
+ free(sub);
+ rte_eal_devargs_rmv(da);
+ REMOVE_NET_DEVICE(ndev);
+ free(ndev);
+ break;
+ }
+ if (ndev == NULL) {
+ ERROR("no such device");
+ return -ENODEV;
+ }
+ return 0;
+}
+
struct rte_bus rte_bus_net = {
.scan = net_scan,
.probe = net_probe,
.find_device = net_find_device,
.parse = net_parse,
+ .plug = net_plug,
+ .unplug = net_unplug,
.conf = {
.scan_mode = RTE_BUS_SCAN_UNDEFINED,
},
--
2.1.4
More information about the dev
mailing list