xenvirt: support port hotplug
authorBernard Iremonger <bernard.iremonger@intel.com>
Tue, 27 Oct 2015 16:03:13 +0000 (16:03 +0000)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Fri, 30 Oct 2015 16:52:50 +0000 (17:52 +0100)
Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
Acked-by: Huawei Xie <huawei.xie@intel.com>
doc/guides/rel_notes/release_2_2.rst
drivers/net/xenvirt/rte_eth_xenvirt.c
drivers/net/xenvirt/rte_xen_lib.c
drivers/net/xenvirt/rte_xen_lib.h

index 0c0d2ff..0fc413a 100644 (file)
@@ -35,6 +35,9 @@ New Features
 
 * **Added vhost-user multiple queue support.**
 
+* **Added port hotplug support to xenvirt.**
+
+
 Resolved Issues
 ---------------
 
index 73e8bce..191a91c 100644 (file)
@@ -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);
index b3932f0..5900b53 100644 (file)
@@ -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,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)
 {
index 0ba7148..d973eac 100644 (file)
@@ -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);