@@ -228,38 +228,44 @@ get_eth_conf(struct rte_eth_conf *eth_conf, uint32_t num_devices)
* for the device to be re-used
*/
static void
-unregister_device(int socket_num)
+unregister_drivers(int socket_num)
{
- int ret;
+ int i, ret;
- if (vhost_pmd) {
- char drv_name[RTE_ETH_NAME_MAX_LEN];
- struct vhost_dev *vdev = NULL;
- uint16_t port_id;
-
- snprintf(drv_name, RTE_ETH_NAME_MAX_LEN,
- "net_vhost%d", socket_num);
- ret = rte_eth_dev_get_port_by_name(drv_name, &port_id);
- if (ret != 0)
- rte_exit(EXIT_FAILURE,
- "vhost device port id get failed.\n");
+ for (i = 0; i < socket_num; i++) {
+ if (vhost_pmd) {
+ char drv_name[RTE_ETH_NAME_MAX_LEN];
+ struct vhost_dev *vdev = NULL;
+ uint16_t port_id;
- TAILQ_FOREACH(vdev, &vhost_dev_list, global_vdev_entry) {
- if (vdev->eth_dev_id == port_id) {
- vdev->remove = 1;
- break;
+ snprintf(drv_name, RTE_ETH_NAME_MAX_LEN,
+ "net_vhost%d", socket_num);
+ ret = rte_eth_dev_get_port_by_name(drv_name, &port_id);
+ if (ret != 0) {
+ RTE_LOG(ERR, VHOST_CONFIG,
+ "Fail to get vhost port id for %s\n",
+ drv_name);
+ continue;
}
- }
- /* Close the Ethernet device */
- rte_eth_dev_close(port_id);
- } else {
- ret = rte_vhost_driver_unregister(socket_files +
- socket_num * PATH_MAX);
- if (ret != 0)
- RTE_LOG(ERR, VHOST_CONFIG,
- "Fail to unregister vhost driver for %s.\n",
- socket_files + socket_num * PATH_MAX);
+ TAILQ_FOREACH(vdev, &vhost_dev_list,
+ global_vdev_entry) {
+ if (vdev->eth_dev_id == port_id) {
+ vdev->remove = 1;
+ break;
+ }
+ }
+
+ /* unregister the device */
+ rte_eth_dev_close(port_id);
+ } else {
+ ret = rte_vhost_driver_unregister(
+ socket_files + i * PATH_MAX);
+ if (ret != 0)
+ RTE_LOG(ERR, VHOST_CONFIG,
+ "Fail to unregister vhost driver for %s.\n",
+ socket_files + i * PATH_MAX);
+ }
}
}
@@ -268,7 +274,7 @@ unregister_device(int socket_num)
* coming from the mbuf_pool passed as parameter
*/
static inline int
-port_init_v2(uint16_t portid)
+vhost_pmd_port_init(uint16_t portid)
{
struct rte_eth_rxconf rxq_conf;
struct rte_eth_txconf txq_conf;
@@ -289,10 +295,12 @@ port_init_v2(uint16_t portid)
fflush(stdout);
ret = rte_eth_dev_info_get(portid, &dev_info);
- if (ret != 0)
- rte_exit(EXIT_FAILURE,
+ if (ret != 0) {
+ RTE_LOG(ERR, VHOST_CONFIG,
"Error during getting device (port %u) info: %s\n",
portid, strerror(-ret));
+ return ret;
+ }
if (strncmp(dev_info.driver_name, "net_vhost",
sizeof("net_vhost")) == 0)
@@ -301,26 +309,33 @@ port_init_v2(uint16_t portid)
vhost_device_event_callback, NULL);
ret = rte_eth_dev_configure(portid, 1, 1, &port_conf);
- if (ret < 0)
- rte_exit(EXIT_FAILURE, "Cannot configure device: err=%d, port=%u\n",
- ret, portid);
+ if (ret < 0) {
+ RTE_LOG(ERR, VHOST_CONFIG,
+ "Cannot configure device: err=%d, port=%u\n",
+ ret, portid);
+ return ret;
+ }
nb_rxd = RTE_TEST_RX_DESC_DEFAULT;
nb_txd = RTE_TEST_TX_DESC_DEFAULT;
ret = rte_eth_dev_adjust_nb_rx_tx_desc(portid, &nb_rxd,
&nb_txd);
- if (ret < 0)
- rte_exit(EXIT_FAILURE,
- "Cannot adjust number of descriptors: err=%d, port=%u\n",
- ret, portid);
+ if (ret < 0) {
+ RTE_LOG(ERR, VHOST_CONFIG,
+ "Cannot adjust number of descriptors: err=%d, port=%u\n",
+ ret, portid);
+ return ret;
+ }
ret = rte_eth_macaddr_get(portid,
&vmdq_ports_eth_addr[portid]);
- if (ret < 0)
- rte_exit(EXIT_FAILURE,
- "Cannot get MAC address: err=%d, port=%u\n",
- ret, portid);
+ if (ret < 0) {
+ RTE_LOG(ERR, VHOST_CONFIG,
+ "Cannot get MAC address: err=%d, port=%u\n",
+ ret, portid);
+ return ret;
+ }
/* init RX queue */
fflush(stdout);
@@ -330,9 +345,12 @@ port_init_v2(uint16_t portid)
rte_eth_dev_socket_id(portid),
&rxq_conf,
mbuf_pool);
- if (ret < 0)
- rte_exit(EXIT_FAILURE, "rte_eth_rx_queue_setup:err=%d, port=%u\n",
- ret, portid);
+ if (ret < 0) {
+ RTE_LOG(ERR, VHOST_CONFIG,
+ "rte_eth_rx_queue_setup: err=%d, port=%u\n",
+ ret, portid);
+ return ret;
+ }
/* init TX queue */
fflush(stdout);
@@ -341,27 +359,29 @@ port_init_v2(uint16_t portid)
ret = rte_eth_tx_queue_setup(portid, 0, nb_txd,
rte_eth_dev_socket_id(portid),
&txq_conf);
- if (ret < 0)
- rte_exit(EXIT_FAILURE, "rte_eth_tx_queue_setup:err=%d, port=%u\n",
+ if (ret < 0) {
+ RTE_LOG(ERR, VHOST_CONFIG,
+ "rte_eth_rx_queue_setup: err=%d, port=%u\n",
ret, portid);
+ return ret;
+ }
/* Start device */
ret = rte_eth_dev_start(portid);
- if (ret < 0)
- rte_exit(EXIT_FAILURE, "rte_eth_dev_start:err=%d, port=%u\n",
- ret, portid);
+ if (ret < 0) {
+ RTE_LOG(ERR, VHOST_CONFIG,
+ "rte_eth_dev_start: err=%d, port=%u\n",
+ ret, portid);
+ return ret;
+ }
if (promiscuous) {
ret = rte_eth_promiscuous_enable(portid);
if ((ret != 0) && (ret != -ENOTSUP)) {
- uint8_t i;
-
- for (i = 0; i < nb_sockets; i++)
- unregister_device(i);
-
- rte_exit(EXIT_FAILURE,
- "rte_eth_promiscuous_enable:err=%s, port=%u\n",
- rte_strerror(-ret), portid);
+ RTE_LOG(ERR, VHOST_CONFIG,
+ "rte_eth_promiscuous_enable: err=%d, port=%u\n",
+ ret, portid);
+ return ret;
}
}
@@ -1207,6 +1227,8 @@ drain_eth_rx(struct vhost_dev *vdev)
return;
if (vhost_pmd) {
+ uint32_t idx;
+
enqueue_count = rte_eth_tx_burst(vdev->eth_dev_id, 0,
pkts, rx_count);
if (unlikely(enqueue_count < rx_count)) {
@@ -1222,7 +1244,6 @@ drain_eth_rx(struct vhost_dev *vdev)
break;
}
/* Drop the remaining packets */
- uint32_t idx;
for (idx = enqueue_count; idx < rx_count; idx++)
rte_pktmbuf_free(pkts[idx]);
}
@@ -1620,10 +1641,7 @@ static void
sigint_handler(__rte_unused int signum)
{
/* Unregister vhost driver. */
- uint8_t i;
-
- for (i = 0; i < nb_sockets; i++)
- unregister_device(i);
+ unregister_drivers(nb_sockets);
exit(0);
}
@@ -1806,25 +1824,26 @@ main(int argc, char *argv[])
ret = rte_dev_probe(dev_name);
if (ret != 0) {
+ unregister_drivers(i);
rte_exit(EXIT_FAILURE,
"vhost user device probe failed\n");
}
ret = rte_eth_dev_get_port_by_name(drv_name, &port);
if (ret != 0) {
- unregister_device(i);
+ unregister_drivers(i+1);
rte_exit(EXIT_FAILURE,
"vhost device port id get failed.\n");
}
- ret = port_init_v2(port);
+ ret = vhost_pmd_port_init(port);
if (ret != 0) {
- unregister_device(i);
+ unregister_drivers(i+1);
rte_exit(EXIT_FAILURE,
"vhost device port initialization failed.\n");
}
} else {
ret = rte_vhost_driver_register(file, flags);
if (ret != 0) {
- unregister_device(i);
+ unregister_drivers(i);
rte_exit(EXIT_FAILURE,
"vhost driver register failure.\n");
}
@@ -1862,11 +1881,13 @@ main(int argc, char *argv[])
ret = rte_vhost_driver_callback_register(file,
&virtio_net_device_ops);
if (ret != 0) {
+ unregister_drivers(i+1);
rte_exit(EXIT_FAILURE,
"failed to register vhost driver callbacks.\n");
}
if (rte_vhost_driver_start(file) < 0) {
+ unregister_drivers(i+1);
rte_exit(EXIT_FAILURE,
"failed to start vhost driver.\n");
}