If ovs-vswitchd crashes, it will not be able to recreate the same
vhost user ports, since the socket will still be in the file system.

This forces netdev-dpdk to create vhost-user sockets in
unique temporaty directories created by mkdtemp().

Signed-off-by: Ilya Maximets <i.maxim...@samsung.com>
---

This is the most proper solution that I come up with.
Code doesn't clean enough. Just a PoC.
Also, we need a proper way to notify user about path.
(Log messages - not a good solution)

 lib/netdev-dpdk.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index d115de2..deeac0e 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -230,6 +230,7 @@ struct netdev_dpdk {
 
     /* Identifier used to distinguish vhost devices from each other */
     char vhost_id[PATH_MAX];
+    char vhost_temp_dir[PATH_MAX];
 
     /* In dpdk_list. */
     struct ovs_list list_node OVS_GUARDED_BY(dpdk_mutex);
@@ -672,29 +673,47 @@ netdev_dpdk_vhost_cuse_construct(struct netdev *netdev_)
     return err;
 }
 
+typedef void (hook_cb)(void *);
+
 static int
 netdev_dpdk_vhost_user_construct(struct netdev *netdev_)
 {
     struct netdev_dpdk *netdev = netdev_dpdk_cast(netdev_);
     int err;
+    static const char template[] = "vhost_XXXXXX";
+    char *res;
 
     ovs_mutex_lock(&dpdk_mutex);
+
+    /* Make unique temporary directory for new socket. */
+    snprintf(netdev->vhost_temp_dir, sizeof(netdev->vhost_temp_dir), "%s/%s",
+             vhost_sock_dir, template);
+    res = mkdtemp(netdev->vhost_temp_dir);
+    if (!res) {
+        VLOG_ERR("Can't create temporary directory for vhost-user socket %s\n",
+                 netdev_->name);
+        err = -1;
+        goto unlock;
+    }
     /* Take the name of the vhost-user port and append it to the location where
      * the socket is to be created, then register the socket.
      */
     snprintf(netdev->vhost_id, sizeof(netdev->vhost_id), "%s/%s",
-            vhost_sock_dir, netdev_->name);
+             netdev->vhost_temp_dir, netdev_->name);
     err = rte_vhost_driver_register(netdev->vhost_id);
     if (err) {
         VLOG_ERR("vhost-user socket device setup failure for socket %s\n",
                  netdev->vhost_id);
+        rmdir(netdev->vhost_temp_dir);
     } else {
         fatal_signal_add_file_to_unlink(netdev->vhost_id);
+        fatal_signal_add_hook((hook_cb *)&rmdir, NULL, netdev->vhost_temp_dir, 
true);
         VLOG_INFO("Socket %s created for vhost-user port %s\n",
                   netdev->vhost_id, netdev_->name);
         err = vhost_construct_helper(netdev_);
     }
 
+unlock:
     ovs_mutex_unlock(&dpdk_mutex);
     return err;
 }
@@ -752,6 +771,7 @@ netdev_dpdk_vhost_destruct(struct netdev *netdev_)
         VLOG_ERR("Unable to remove vhost-user socket %s", dev->vhost_id);
     } else {
         fatal_signal_remove_file_to_unlink(dev->vhost_id);
+        rmdir(dev->vhost_temp_dir);
     }
 
     ovs_mutex_lock(&dpdk_mutex);
-- 
2.5.0

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to