Start a vhost server once during devinit instead of during device start and stop. Some vhost clients, QEMU, don't re-attaching to sockets when the vhost server is stopped and later started. Preserve existing behavior for vhost clients.
Fixes: ee584e9710b9 ("vhost: add driver on top of the library") Signed-off-by: Chas Williams <ciwil...@brocade.com> --- drivers/net/vhost/rte_eth_vhost.c | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index ba559ff..914d83f 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -772,9 +772,8 @@ vhost_driver_session_stop(void) } static int -eth_dev_start(struct rte_eth_dev *dev) +vhost_dev_start(struct pmd_internal *internal) { - struct pmd_internal *internal = dev->data->dev_private; int ret = 0; if (rte_atomic16_cmpset(&internal->once, 0, 1)) { @@ -792,10 +791,8 @@ eth_dev_start(struct rte_eth_dev *dev) } static void -eth_dev_stop(struct rte_eth_dev *dev) +vhost_dev_stop(struct pmd_internal *internal) { - struct pmd_internal *internal = dev->data->dev_private; - if (rte_atomic16_cmpset(&internal->once, 1, 0)) { rte_vhost_driver_unregister(internal->iface_name); @@ -805,6 +802,27 @@ eth_dev_stop(struct rte_eth_dev *dev) } static int +eth_dev_start(struct rte_eth_dev *dev) +{ + struct pmd_internal *internal = dev->data->dev_private; + int ret = 0; + + if (internal->flags & RTE_VHOST_USER_CLIENT) + ret = vhost_dev_start(internal); + + return ret; +} + +static void +eth_dev_stop(struct rte_eth_dev *dev) +{ + struct pmd_internal *internal = dev->data->dev_private; + + if (internal->flags & RTE_VHOST_USER_CLIENT) + vhost_dev_stop(internal); +} + +static int eth_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id, uint16_t nb_rx_desc __rte_unused, unsigned int socket_id, @@ -1079,6 +1097,11 @@ eth_dev_vhost_create(const char *name, char *iface_name, int16_t queues, eth_dev->rx_pkt_burst = eth_vhost_rx; eth_dev->tx_pkt_burst = eth_vhost_tx; + if ((flags & RTE_VHOST_USER_CLIENT) == 0) { + if (vhost_dev_start(internal)) + goto error; + } + return data->port_id; error: @@ -1216,6 +1239,9 @@ rte_pmd_vhost_remove(const char *name) eth_dev_stop(eth_dev); + if ((internal->flags & RTE_VHOST_USER_CLIENT) == 0) + vhost_dev_stop(internal); + rte_free(vring_states[eth_dev->data->port_id]); vring_states[eth_dev->data->port_id] = NULL; -- 2.1.4