update release notes. Signed-off-by: Bernard Iremonger <bernard.iremonger at intel.com> --- doc/guides/rel_notes/release_2_2.rst | 2 ++ drivers/net/xenvirt/rte_eth_xenvirt.c | 49 ++++++++++++++++++++++++++++++++++- drivers/net/xenvirt/rte_xen_lib.c | 26 ++++++++++++++++--- drivers/net/xenvirt/rte_xen_lib.h | 5 +++- 4 files changed, 76 insertions(+), 6 deletions(-)
diff --git a/doc/guides/rel_notes/release_2_2.rst b/doc/guides/rel_notes/release_2_2.rst index 455b5a2..c88392b 100644 --- a/doc/guides/rel_notes/release_2_2.rst +++ b/doc/guides/rel_notes/release_2_2.rst @@ -13,6 +13,8 @@ New Features * This change required modifications to librte_ether and all vdev and pdev PMD's. +* **Added Port Hotplug support to xenvirt PMD.** + Resolved Issues --------------- diff --git a/drivers/net/xenvirt/rte_eth_xenvirt.c b/drivers/net/xenvirt/rte_eth_xenvirt.c index 1b13758..084a753 100644 --- a/drivers/net/xenvirt/rte_eth_xenvirt.c +++ b/drivers/net/xenvirt/rte_eth_xenvirt.c @@ -661,7 +661,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 = 0; + eth_dev->data->dev_flags = RTE_PCI_DRV_DETACHABLE; eth_dev->data->kdrv = RTE_KDRV_NONE; eth_dev->data->drv_name = NULL; eth_dev->driver = NULL; @@ -683,6 +683,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) @@ -701,10 +733,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 b3932f0..5900b53 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 <rte_common.h> #include <rte_string_fns.h> +#include <rte_malloc.h> #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,16 +303,32 @@ 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) { char grant_path[PATH_MAX]; diff --git a/drivers/net/xenvirt/rte_xen_lib.h b/drivers/net/xenvirt/rte_xen_lib.h index 0ba7148..d973eac 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 @@ -93,6 +93,9 @@ int xenstore_init(void); int +xenstore_uninit(void); + +int xenstore_write(const char *key_str, const char *val_str); int -- 1.9.1