net/ice/base: add hook to send AdminQ command
[dpdk.git] / drivers / net / vhost / rte_eth_vhost.c
index 307de2c..458ed58 100644 (file)
@@ -95,7 +95,6 @@ struct vhost_queue {
 
 struct pmd_internal {
        rte_atomic32_t dev_attached;
-       char *dev_name;
        char *iface_name;
        uint64_t flags;
        uint64_t disable_flags;
@@ -877,14 +876,19 @@ vhost_driver_setup(struct rte_eth_dev *eth_dev)
        unsigned int numa_node = eth_dev->device->numa_node;
        const char *name = eth_dev->device->name;
 
+       /* Don't try to setup again if it has already been done. */
+       list = find_internal_resource(internal->iface_name);
+       if (list)
+               return 0;
+
        list = rte_zmalloc_socket(name, sizeof(*list), 0, numa_node);
        if (list == NULL)
-               goto error;
+               return -1;
 
        vring_state = rte_zmalloc_socket(name, sizeof(*vring_state),
                                         0, numa_node);
        if (vring_state == NULL)
-               goto error;
+               goto free_list;
 
        list->eth_dev = eth_dev;
        pthread_mutex_lock(&internal_list_lock);
@@ -895,30 +899,37 @@ vhost_driver_setup(struct rte_eth_dev *eth_dev)
        vring_states[eth_dev->data->port_id] = vring_state;
 
        if (rte_vhost_driver_register(internal->iface_name, internal->flags))
-               goto error;
+               goto list_remove;
 
        if (internal->disable_flags) {
                if (rte_vhost_driver_disable_features(internal->iface_name,
                                                      internal->disable_flags))
-                       goto error;
+                       goto drv_unreg;
        }
 
        if (rte_vhost_driver_callback_register(internal->iface_name,
                                               &vhost_ops) < 0) {
                VHOST_LOG(ERR, "Can't register callbacks\n");
-               goto error;
+               goto drv_unreg;
        }
 
        if (rte_vhost_driver_start(internal->iface_name) < 0) {
                VHOST_LOG(ERR, "Failed to start driver for %s\n",
                          internal->iface_name);
-               goto error;
+               goto drv_unreg;
        }
 
        return 0;
 
-error:
+drv_unreg:
+       rte_vhost_driver_unregister(internal->iface_name);
+list_remove:
+       vring_states[eth_dev->data->port_id] = NULL;
+       pthread_mutex_lock(&internal_list_lock);
+       TAILQ_REMOVE(&internal_list, list, next);
+       pthread_mutex_unlock(&internal_list_lock);
        rte_free(vring_state);
+free_list:
        rte_free(list);
 
        return -1;
@@ -1073,7 +1084,6 @@ eth_dev_close(struct rte_eth_dev *dev)
                for (i = 0; i < dev->data->nb_tx_queues; i++)
                        rte_free(dev->data->tx_queues[i]);
 
-       free(internal->dev_name);
        rte_free(internal->iface_name);
        rte_free(internal);
 
@@ -1307,9 +1317,6 @@ eth_dev_vhost_create(struct rte_vdev_device *dev, char *iface_name,
         * - and point eth_dev structure to new eth_dev_data structure
         */
        internal = eth_dev->data->dev_private;
-       internal->dev_name = strdup(name);
-       if (internal->dev_name == NULL)
-               goto error;
        internal->iface_name = rte_malloc_socket(name, strlen(iface_name) + 1,
                                                 0, numa_node);
        if (internal->iface_name == NULL)
@@ -1335,10 +1342,8 @@ eth_dev_vhost_create(struct rte_vdev_device *dev, char *iface_name,
        return 0;
 
 error:
-       if (internal) {
+       if (internal)
                rte_free(internal->iface_name);
-               free(internal->dev_name);
-       }
        rte_eth_dev_release_port(eth_dev);
 
        return -1;