X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fvhost%2Frte_eth_vhost.c;h=458ed58f5fca940f133e6676a693c0a2b0ef458d;hb=c5dccda9f2ae6ecc716892c233a0dadc94e013da;hp=307de2c68205d81d3ed431d5b3b751ecbe43c7b0;hpb=75ad5aadbd64fa89d35fa4a38d54e10cdd8e838e;p=dpdk.git diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index 307de2c682..458ed58f5f 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -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;