[ovs-dev] [PATCH RFC] netdev-dpdk: Use unique temporary directories for vhost-user sockets

Flavio Leitner fbl at sysclose.org
Wed Feb 3 23:51:28 UTC 2016


On Wed, 03 Feb 2016 17:44:55 +0300
Ilya Maximets <i.maximets at samsung.com> wrote:

> 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().

As already said, this will make life harder to use with qemu.

What about the patch below? (RFC, completely untested).

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index d115de2..7ec9745 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -684,6 +684,9 @@ netdev_dpdk_vhost_user_construct(struct netdev *netdev_)
      */
     snprintf(netdev->vhost_id, sizeof(netdev->vhost_id), "%s/%s",
             vhost_sock_dir, netdev_->name);
+
+    /* remove old socket */
+    unlink(netdev->vhost_id); 
     err = rte_vhost_driver_register(netdev->vhost_id);
     if (err) {
         VLOG_ERR("vhost-user socket device setup failure for socket %s\n",





> Signed-off-by: Ilya Maximets <i.maximets at 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);



-- 
fbl




More information about the dev mailing list