From: Bernard Iremonger Date: Tue, 27 Oct 2015 16:03:13 +0000 (+0000) Subject: xenvirt: support port hotplug X-Git-Tag: spdx-start~8277 X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=5ad78a66c1778ef19d832d0d0dd02d9d88bc9ed7;p=dpdk.git xenvirt: support port hotplug Signed-off-by: Bernard Iremonger Acked-by: Huawei Xie --- diff --git a/doc/guides/rel_notes/release_2_2.rst b/doc/guides/rel_notes/release_2_2.rst index 0c0d2ff2c5..0fc413a6c5 100644 --- a/doc/guides/rel_notes/release_2_2.rst +++ b/doc/guides/rel_notes/release_2_2.rst @@ -35,6 +35,9 @@ New Features * **Added vhost-user multiple queue support.** +* **Added port hotplug support to xenvirt.** + + Resolved Issues --------------- diff --git a/drivers/net/xenvirt/rte_eth_xenvirt.c b/drivers/net/xenvirt/rte_eth_xenvirt.c index 73e8bce02a..191a91c633 100644 --- a/drivers/net/xenvirt/rte_eth_xenvirt.c +++ b/drivers/net/xenvirt/rte_eth_xenvirt.c @@ -668,6 +668,7 @@ eth_dev_xenvirt_create(const char *name, const char *params, eth_dev->data = data; eth_dev->dev_ops = &ops; + eth_dev->data->dev_flags = RTE_PCI_DRV_DETACHABLE; eth_dev->pci_dev = pci_dev; eth_dev->rx_pkt_burst = eth_xenvirt_rx; @@ -687,6 +688,38 @@ err: } +static int +eth_dev_xenvirt_free(const char *name, const unsigned numa_node) +{ + struct rte_eth_dev *eth_dev = NULL; + + RTE_LOG(DEBUG, PMD, + "Free virtio rings backed ethdev on numa socket %u\n", + numa_node); + + /* find an ethdev entry */ + eth_dev = rte_eth_dev_allocated(name); + if (eth_dev == NULL) + return -1; + + if (eth_dev->data->dev_started == 1) { + eth_dev_stop(eth_dev); + eth_dev_close(eth_dev); + } + + eth_dev->rx_pkt_burst = NULL; + eth_dev->tx_pkt_burst = NULL; + eth_dev->dev_ops = NULL; + + rte_free(eth_dev->data); + rte_free(eth_dev->data->dev_private); + rte_free(eth_dev->data->mac_addrs); + + virtio_idx--; + + return 0; +} + /*TODO: Support multiple process model */ static int rte_pmd_xenvirt_devinit(const char *name, const char *params) @@ -705,10 +738,25 @@ rte_pmd_xenvirt_devinit(const char *name, const char *params) return 0; } +static int +rte_pmd_xenvirt_devuninit(const char *name) +{ + eth_dev_xenvirt_free(name, rte_socket_id()); + + if (virtio_idx == 0) { + if (xenstore_uninit() != 0) + RTE_LOG(ERR, PMD, "%s: xenstore uninit failed\n", __func__); + + gntalloc_close(); + } + return 0; +} + static struct rte_driver pmd_xenvirt_drv = { .name = "eth_xenvirt", .type = PMD_VDEV, .init = rte_pmd_xenvirt_devinit, + .uninit = rte_pmd_xenvirt_devuninit, }; PMD_REGISTER_DRIVER(pmd_xenvirt_drv); diff --git a/drivers/net/xenvirt/rte_xen_lib.c b/drivers/net/xenvirt/rte_xen_lib.c index b3932f0e06..5900b53df2 100644 --- a/drivers/net/xenvirt/rte_xen_lib.c +++ b/drivers/net/xenvirt/rte_xen_lib.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 @@ -50,6 +50,7 @@ #include #include +#include #include "rte_xen_lib.h" @@ -72,6 +73,8 @@ int gntalloc_fd = -1; static char *dompath = NULL; /* handle to xenstore read/write operations */ static struct xs_handle *xs = NULL; +/* flag to indicate if xenstore cleanup is required */ +static bool is_xenstore_cleaned_up; /* * Reserve a virtual address space. @@ -275,7 +278,6 @@ xenstore_init(void) { unsigned int len, domid; char *buf; - static int cleanup = 0; char *end; xs = xs_domain_open(); @@ -301,15 +303,31 @@ xenstore_init(void) xs_transaction_start(xs); /* When to stop transaction */ - if (cleanup == 0) { + if (is_xenstore_cleaned_up == 0) { if (xenstore_cleanup()) return -1; - cleanup = 1; + is_xenstore_cleaned_up = 1; } return 0; } +int +xenstore_uninit(void) +{ + xs_close(xs); + + if (is_xenstore_cleaned_up == 0) { + if (xenstore_cleanup()) + return -1; + is_xenstore_cleaned_up = 1; + } + free(dompath); + dompath = NULL; + + return 0; +} + int xenstore_write(const char *key_str, const char *val_str) { diff --git a/drivers/net/xenvirt/rte_xen_lib.h b/drivers/net/xenvirt/rte_xen_lib.h index 0ba7148af9..d973eacbb1 100644 --- a/drivers/net/xenvirt/rte_xen_lib.h +++ b/drivers/net/xenvirt/rte_xen_lib.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 @@ -92,6 +92,9 @@ gntfree(void *va, size_t sz, uint64_t start_index); int xenstore_init(void); +int +xenstore_uninit(void); + int xenstore_write(const char *key_str, const char *val_str);