Hi,

On 03/21/2018 04:03 AM, zhiyong.y...@intel.com wrote:
When vhost user PMD works in client mode to connect/reconnect virtio-user
with server mode, new thread sometimes may run to new_device before
queue_setup has been done, So have to wait until memory allocation is
done.

Release note is updated in the patch.

Signed-off-by: Zhiyong Yang <zhiyong.y...@intel.com>
---
  doc/guides/rel_notes/release_18_05.rst | 7 +++++++
  drivers/net/vhost/rte_eth_vhost.c      | 9 +++++++++
  2 files changed, 16 insertions(+)

diff --git a/doc/guides/rel_notes/release_18_05.rst 
b/doc/guides/rel_notes/release_18_05.rst
index 3923dc253..7b301f021 100644
--- a/doc/guides/rel_notes/release_18_05.rst
+++ b/doc/guides/rel_notes/release_18_05.rst
@@ -41,6 +41,13 @@ New Features
       Also, make sure to start the actual text at the margin.
       =========================================================
+* **Added support for virtio-user server mode.**
+
+  In a container environment if the vhost-user backend restarts, there's no way
+  for it to reconnect to virtio-user. To address this, support for server mode
+  is added. In this mode the socket file is created by virtio-user, which the
+  backend then connects to. This means that if the backend restarts, it can
+  reconnect to virtio-user and continue communications.

I think this shouldn't be part of this patch.

API Changes
  -----------
diff --git a/drivers/net/vhost/rte_eth_vhost.c 
b/drivers/net/vhost/rte_eth_vhost.c
index 3aae01c39..2490bad0b 100644
--- a/drivers/net/vhost/rte_eth_vhost.c
+++ b/drivers/net/vhost/rte_eth_vhost.c
@@ -580,6 +580,15 @@ new_device(int vid)
                eth_dev->data->numa_node = newnode;
  #endif
+ /* The thread may run here before eth_dev->data->rx_queues or
+        * eth_dev->data->tx_queues have gotten valid memory, so have to
+        * wait until memory allocation is done.
+        */
+       while (!eth_dev->data->rx_queues ||
+              !eth_dev->data->tx_queues) {
+               usleep(1);
+       }
+
        for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
                vq = eth_dev->data->rx_queues[i];
                if (vq == NULL)


I don't like the idea of polling here.
It looks like Junjie is addressing the problem in a different way [0],
do you confirm it would work in your case?

Thanks,
Maxime

[0]: http://dpdk.org/dev/patchwork/patch/36643/

Reply via email to