diff mbox

[ovs-dev] ovsdb: Expose vhost-user socket directory in ovsdb

Message ID 1463999326-3637-1-git-send-email-robertx.wojciechowicz@intel.com
State Changes Requested
Headers show

Commit Message

Robert Wojciechowicz May 23, 2016, 10:28 a.m. UTC
In order to correctly interoperate with Openstack and ODL,
the vhost-user socket directory must be exposed from OVS via OVSDB.
Different distros may package OVS in different ways,
so the locations of these sockets may vary depending on how
ovs-vswitchd has been started. Some clients need information where
the sockets are located when instantiating Qemu virtual machines.
The full vhost-user socket directory is constructed from current
OVS working directory and optionally from specified subdirectory.
This patch exposes vhost-user socket directory in Open_vSwitch
table in other_config column in two following keys:
1. ovs-run-dir    - OVS working directory
2. vhost-sock-dir - subdirectory of ovs-run-dir (might be empty)

Signed-off-by: Robert Wojciechowicz <robertx.wojciechowicz@intel.com>
---
 lib/netdev-dpdk.c    | 38 ++++++++++++++++++++++++++++++++++----
 lib/netdev-dpdk.h    |  9 +++++++++
 vswitchd/bridge.c    |  2 ++
 vswitchd/vswitch.xml | 11 +++++++++++
 4 files changed, 56 insertions(+), 4 deletions(-)

Comments

Robert Wojciechowicz May 23, 2016, 10:44 a.m. UTC | #1
Hi,

this patch is actually a supplement to the conversion of DPDK configuration
from command line to DB (http://openvswitch.org/pipermail/dev/2016-April/070308.html).
Currently the full vhost-user socket directory consists of two components:
ovs_rundir and subdirectory for vhost-user sockets. Combining them user can
determine the full vhost-sock directory. 
Currently the default vhost-sock directory is not available in OVSDB,
so I exposed those components in this patch.

Br,
Robert

> -----Original Message-----
> From: Wojciechowicz, RobertX
> Sent: Monday, May 23, 2016 12:29 PM
> To: dev@openvswitch.org
> Cc: Wojciechowicz, RobertX <robertx.wojciechowicz@intel.com>
> Subject: [PATCH] ovsdb: Expose vhost-user socket directory in ovsdb
> 
> In order to correctly interoperate with Openstack and ODL,
> the vhost-user socket directory must be exposed from OVS via OVSDB.
> Different distros may package OVS in different ways,
> so the locations of these sockets may vary depending on how
> ovs-vswitchd has been started. Some clients need information where
> the sockets are located when instantiating Qemu virtual machines.
> The full vhost-user socket directory is constructed from current
> OVS working directory and optionally from specified subdirectory.
> This patch exposes vhost-user socket directory in Open_vSwitch
> table in other_config column in two following keys:
> 1. ovs-run-dir    - OVS working directory
> 2. vhost-sock-dir - subdirectory of ovs-run-dir (might be empty)
> 
> Signed-off-by: Robert Wojciechowicz <robertx.wojciechowicz@intel.com>
> ---
>  lib/netdev-dpdk.c    | 38 ++++++++++++++++++++++++++++++++++----
>  lib/netdev-dpdk.h    |  9 +++++++++
>  vswitchd/bridge.c    |  2 ++
>  vswitchd/vswitch.xml | 11 +++++++++++
>  4 files changed, 56 insertions(+), 4 deletions(-)
> 
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index 9ffa7ff..4e68bd6 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -138,9 +138,13 @@ BUILD_ASSERT_DECL((MAX_NB_MBUF /
> ROUND_DOWN_POW2(MAX_NB_MBUF/MIN_NB_MBUF))
> 
>  #ifdef VHOST_CUSE
>  static char *cuse_dev_name = NULL;    /* Character device cuse_dev_name.
> */
> +#else
> +static char *sock_dir_subcomponent = NULL;   /* Subdir of OVS run dir
> +                                                for vhost-user sockets */
>  #endif
>  static char *vhost_sock_dir = NULL;   /* Location of vhost-user sockets */
> 
> +
>  /*
>   * Maximum amount of time in micro seconds to try and enqueue to vhost.
>   */
> @@ -3086,9 +3090,6 @@ dpdk_init__(const struct smap *ovs_other_config)
>      bool auto_determine = true;
>      int err = 0;
>      cpu_set_t cpuset;
> -#ifndef VHOST_CUSE
> -    char *sock_dir_subcomponent;
> -#endif
> 
>      if (!smap_get_bool(ovs_other_config, "dpdk-init", false)) {
>          VLOG_INFO("DPDK Disabled - to change this requires a restart.\n");
> @@ -3119,10 +3120,11 @@ dpdk_init__(const struct smap
> *ovs_other_config)
>              VLOG_ERR("vhost-user sock directory request '%s/%s' has invalid"
>                       "characters '..' - using %s instead.",
>                       ovs_rundir(), sock_dir_subcomponent, ovs_rundir());
> +            sock_dir_subcomponent = "";
>          }
> -        free(sock_dir_subcomponent);
>      } else {
>          vhost_sock_dir = sock_dir_subcomponent;
> +        sock_dir_subcomponent = "";
>  #endif
>      }
> 
> @@ -3244,6 +3246,34 @@ dpdk_init(const struct smap *ovs_other_config)
>      }
>  }
> 
> +void
> +dpdk_set_config(const struct ovsrec_open_vswitch *cfg)
> +{
> +    struct smap dpdk_args;
> +    const struct ovsdb_datum *datum;
> +    size_t i;
> +
> +    ovs_mutex_lock(&dpdk_mutex);
> +
> +    smap_init(&dpdk_args);
> +    /* read current values from database */
> +    datum = ovsrec_open_vswitch_get_other_config(cfg,
> OVSDB_TYPE_STRING,
> +                                                 OVSDB_TYPE_STRING);
> +    for (i = 0; i < datum->n; i++) {
> +      smap_add(&dpdk_args, datum->keys[i].string, datum->values[i].string);
> +    }
> +    /* add default paths to the database */
> +    smap_add_format(&dpdk_args, "ovs-run-dir", "%s", ovs_rundir());
> +    if (sock_dir_subcomponent) {
> +      smap_add_format(&dpdk_args, "vhost-sock-dir", "%s",
> +                      sock_dir_subcomponent);
> +    }
> +    ovsrec_open_vswitch_set_other_config(cfg, &dpdk_args);
> +    smap_destroy(&dpdk_args);
> +
> +    ovs_mutex_unlock(&dpdk_mutex);
> +}
> +
>  static const struct netdev_class dpdk_class =
>      NETDEV_DPDK_CLASS(
>          "dpdk",
> diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h
> index ee748e0..08abcac 100644
> --- a/lib/netdev-dpdk.h
> +++ b/lib/netdev-dpdk.h
> @@ -3,6 +3,8 @@
> 
>  #include <config.h>
> 
> +#include "lib/vswitch-idl.h"
> +
>  struct dp_packet;
>  struct smap;
> 
> @@ -25,6 +27,7 @@ struct smap;
> 
>  void netdev_dpdk_register(void);
>  void free_dpdk_buf(struct dp_packet *);
> +void dpdk_set_config(const struct ovsrec_open_vswitch *cfg);
>  int pmd_thread_setaffinity_cpu(unsigned cpu);
> 
>  #else
> @@ -45,6 +48,12 @@ free_dpdk_buf(struct dp_packet *buf OVS_UNUSED)
>      /* Nothing */
>  }
> 
> +static inline void
> +dpdk_set_config(const struct ovsrec_open_vswitch *cfg)
> +{
> +    /* Nothing */
> +}
> +
>  static inline int
>  pmd_thread_setaffinity_cpu(unsigned cpu OVS_UNUSED)
>  {
> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> index 41ec4ba..d248721 100644
> --- a/vswitchd/bridge.c
> +++ b/vswitchd/bridge.c
> @@ -393,6 +393,7 @@ bridge_init(const char *remote)
>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_db_version);
>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_type);
>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_version);
> +    ovsdb_idl_omit_alert(idl, &ovsrec_open_vswitch_col_other_config);
> 
>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_id);
>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_version);
> @@ -2957,6 +2958,7 @@ bridge_run(void)
> 
>          if (cfg) {
>              ovsrec_open_vswitch_set_cur_cfg(cfg, cfg->next_cfg);
> +            dpdk_set_config(cfg);
>              discover_types(cfg);
>          }
> 
> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> index 944d8ec..8d06d29 100644
> --- a/vswitchd/vswitch.xml
> +++ b/vswitchd/vswitch.xml
> @@ -311,6 +311,17 @@
>          </p>
>        </column>
> 
> +      <column name="other_config" key="ovs-run-dir"
> +              type='{"type": "string"}'>
> +        <p>
> +          Specifies the Open vSwitch run directory.
> +        </p>
> +        <p>
> +          Defaults to the working directory of the application. Changing this
> +          value requires restarting the daemon.
> +        </p>
> +      </column>
> +
>        <column name="other_config" key="n-handler-threads"
>                type='{"type": "integer", "minInteger": 1}'>
>          <p>
> --
> 1.8.3.1
Robert Wojciechowicz May 30, 2016, 10:15 a.m. UTC | #2
Hi,

did anyone by any chance have time to have a look at this patch?

Br,
Robert

> -----Original Message-----

> From: dev [mailto:dev-bounces@openvswitch.org] On Behalf Of

> Wojciechowicz, RobertX

> Sent: Monday, May 23, 2016 12:45 PM

> To: dev@openvswitch.org

> Subject: Re: [ovs-dev] [PATCH] ovsdb: Expose vhost-user socket directory in

> ovsdb

> 

> Hi,

> 

> this patch is actually a supplement to the conversion of DPDK configuration

> from command line to DB (http://openvswitch.org/pipermail/dev/2016-

> April/070308.html).

> Currently the full vhost-user socket directory consists of two components:

> ovs_rundir and subdirectory for vhost-user sockets. Combining them user

> can

> determine the full vhost-sock directory.

> Currently the default vhost-sock directory is not available in OVSDB,

> so I exposed those components in this patch.

> 

> Br,

> Robert

> 

> > -----Original Message-----

> > From: Wojciechowicz, RobertX

> > Sent: Monday, May 23, 2016 12:29 PM

> > To: dev@openvswitch.org

> > Cc: Wojciechowicz, RobertX <robertx.wojciechowicz@intel.com>

> > Subject: [PATCH] ovsdb: Expose vhost-user socket directory in ovsdb

> >

> > In order to correctly interoperate with Openstack and ODL,

> > the vhost-user socket directory must be exposed from OVS via OVSDB.

> > Different distros may package OVS in different ways,

> > so the locations of these sockets may vary depending on how

> > ovs-vswitchd has been started. Some clients need information where

> > the sockets are located when instantiating Qemu virtual machines.

> > The full vhost-user socket directory is constructed from current

> > OVS working directory and optionally from specified subdirectory.

> > This patch exposes vhost-user socket directory in Open_vSwitch

> > table in other_config column in two following keys:

> > 1. ovs-run-dir    - OVS working directory

> > 2. vhost-sock-dir - subdirectory of ovs-run-dir (might be empty)

> >

> > Signed-off-by: Robert Wojciechowicz <robertx.wojciechowicz@intel.com>

> > ---

> >  lib/netdev-dpdk.c    | 38 ++++++++++++++++++++++++++++++++++----

> >  lib/netdev-dpdk.h    |  9 +++++++++

> >  vswitchd/bridge.c    |  2 ++

> >  vswitchd/vswitch.xml | 11 +++++++++++

> >  4 files changed, 56 insertions(+), 4 deletions(-)

> >

> > diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c

> > index 9ffa7ff..4e68bd6 100644

> > --- a/lib/netdev-dpdk.c

> > +++ b/lib/netdev-dpdk.c

> > @@ -138,9 +138,13 @@ BUILD_ASSERT_DECL((MAX_NB_MBUF /

> > ROUND_DOWN_POW2(MAX_NB_MBUF/MIN_NB_MBUF))

> >

> >  #ifdef VHOST_CUSE

> >  static char *cuse_dev_name = NULL;    /* Character device

> cuse_dev_name.

> > */

> > +#else

> > +static char *sock_dir_subcomponent = NULL;   /* Subdir of OVS run dir

> > +                                                for vhost-user sockets */

> >  #endif

> >  static char *vhost_sock_dir = NULL;   /* Location of vhost-user sockets */

> >

> > +

> >  /*

> >   * Maximum amount of time in micro seconds to try and enqueue to vhost.

> >   */

> > @@ -3086,9 +3090,6 @@ dpdk_init__(const struct smap

> *ovs_other_config)

> >      bool auto_determine = true;

> >      int err = 0;

> >      cpu_set_t cpuset;

> > -#ifndef VHOST_CUSE

> > -    char *sock_dir_subcomponent;

> > -#endif

> >

> >      if (!smap_get_bool(ovs_other_config, "dpdk-init", false)) {

> >          VLOG_INFO("DPDK Disabled - to change this requires a restart.\n");

> > @@ -3119,10 +3120,11 @@ dpdk_init__(const struct smap

> > *ovs_other_config)

> >              VLOG_ERR("vhost-user sock directory request '%s/%s' has invalid"

> >                       "characters '..' - using %s instead.",

> >                       ovs_rundir(), sock_dir_subcomponent, ovs_rundir());

> > +            sock_dir_subcomponent = "";

> >          }

> > -        free(sock_dir_subcomponent);

> >      } else {

> >          vhost_sock_dir = sock_dir_subcomponent;

> > +        sock_dir_subcomponent = "";

> >  #endif

> >      }

> >

> > @@ -3244,6 +3246,34 @@ dpdk_init(const struct smap *ovs_other_config)

> >      }

> >  }

> >

> > +void

> > +dpdk_set_config(const struct ovsrec_open_vswitch *cfg)

> > +{

> > +    struct smap dpdk_args;

> > +    const struct ovsdb_datum *datum;

> > +    size_t i;

> > +

> > +    ovs_mutex_lock(&dpdk_mutex);

> > +

> > +    smap_init(&dpdk_args);

> > +    /* read current values from database */

> > +    datum = ovsrec_open_vswitch_get_other_config(cfg,

> > OVSDB_TYPE_STRING,

> > +                                                 OVSDB_TYPE_STRING);

> > +    for (i = 0; i < datum->n; i++) {

> > +      smap_add(&dpdk_args, datum->keys[i].string, datum-

> >values[i].string);

> > +    }

> > +    /* add default paths to the database */

> > +    smap_add_format(&dpdk_args, "ovs-run-dir", "%s", ovs_rundir());

> > +    if (sock_dir_subcomponent) {

> > +      smap_add_format(&dpdk_args, "vhost-sock-dir", "%s",

> > +                      sock_dir_subcomponent);

> > +    }

> > +    ovsrec_open_vswitch_set_other_config(cfg, &dpdk_args);

> > +    smap_destroy(&dpdk_args);

> > +

> > +    ovs_mutex_unlock(&dpdk_mutex);

> > +}

> > +

> >  static const struct netdev_class dpdk_class =

> >      NETDEV_DPDK_CLASS(

> >          "dpdk",

> > diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h

> > index ee748e0..08abcac 100644

> > --- a/lib/netdev-dpdk.h

> > +++ b/lib/netdev-dpdk.h

> > @@ -3,6 +3,8 @@

> >

> >  #include <config.h>

> >

> > +#include "lib/vswitch-idl.h"

> > +

> >  struct dp_packet;

> >  struct smap;

> >

> > @@ -25,6 +27,7 @@ struct smap;

> >

> >  void netdev_dpdk_register(void);

> >  void free_dpdk_buf(struct dp_packet *);

> > +void dpdk_set_config(const struct ovsrec_open_vswitch *cfg);

> >  int pmd_thread_setaffinity_cpu(unsigned cpu);

> >

> >  #else

> > @@ -45,6 +48,12 @@ free_dpdk_buf(struct dp_packet *buf

> OVS_UNUSED)

> >      /* Nothing */

> >  }

> >

> > +static inline void

> > +dpdk_set_config(const struct ovsrec_open_vswitch *cfg)

> > +{

> > +    /* Nothing */

> > +}

> > +

> >  static inline int

> >  pmd_thread_setaffinity_cpu(unsigned cpu OVS_UNUSED)

> >  {

> > diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c

> > index 41ec4ba..d248721 100644

> > --- a/vswitchd/bridge.c

> > +++ b/vswitchd/bridge.c

> > @@ -393,6 +393,7 @@ bridge_init(const char *remote)

> >      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_db_version);

> >      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_type);

> >      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_version);

> > +    ovsdb_idl_omit_alert(idl, &ovsrec_open_vswitch_col_other_config);

> >

> >      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_id);

> >      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_version);

> > @@ -2957,6 +2958,7 @@ bridge_run(void)

> >

> >          if (cfg) {

> >              ovsrec_open_vswitch_set_cur_cfg(cfg, cfg->next_cfg);

> > +            dpdk_set_config(cfg);

> >              discover_types(cfg);

> >          }

> >

> > diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml

> > index 944d8ec..8d06d29 100644

> > --- a/vswitchd/vswitch.xml

> > +++ b/vswitchd/vswitch.xml

> > @@ -311,6 +311,17 @@

> >          </p>

> >        </column>

> >

> > +      <column name="other_config" key="ovs-run-dir"

> > +              type='{"type": "string"}'>

> > +        <p>

> > +          Specifies the Open vSwitch run directory.

> > +        </p>

> > +        <p>

> > +          Defaults to the working directory of the application. Changing this

> > +          value requires restarting the daemon.

> > +        </p>

> > +      </column>

> > +

> >        <column name="other_config" key="n-handler-threads"

> >                type='{"type": "integer", "minInteger": 1}'>

> >          <p>

> > --

> > 1.8.3.1

> 

> _______________________________________________

> dev mailing list

> dev@openvswitch.org

> http://openvswitch.org/mailman/listinfo/dev
Fischetti, Antonio May 31, 2016, 1:23 p.m. UTC | #3
Hi Robert,
one comment below.
I've checked it applies cleanly to the latest master branch.
Also with utilities/checkpatch.py is ok.

Thanks,
Antonio

> -----Original Message-----

> From: dev [mailto:dev-bounces@openvswitch.org] On Behalf Of Robert

> Wojciechowicz

> Sent: Monday, May 23, 2016 11:29 AM

> To: dev@openvswitch.org

> Subject: [ovs-dev] [PATCH] ovsdb: Expose vhost-user socket directory

> in ovsdb

> 

> In order to correctly interoperate with Openstack and ODL,

> the vhost-user socket directory must be exposed from OVS via OVSDB.

> Different distros may package OVS in different ways,

> so the locations of these sockets may vary depending on how

> ovs-vswitchd has been started. Some clients need information where

> the sockets are located when instantiating Qemu virtual machines.

> The full vhost-user socket directory is constructed from current

> OVS working directory and optionally from specified subdirectory.

> This patch exposes vhost-user socket directory in Open_vSwitch

> table in other_config column in two following keys:

> 1. ovs-run-dir    - OVS working directory

> 2. vhost-sock-dir - subdirectory of ovs-run-dir (might be empty)

> 

> Signed-off-by: Robert Wojciechowicz <robertx.wojciechowicz@intel.com>

> ---

>  lib/netdev-dpdk.c    | 38 ++++++++++++++++++++++++++++++++++----

>  lib/netdev-dpdk.h    |  9 +++++++++

>  vswitchd/bridge.c    |  2 ++

>  vswitchd/vswitch.xml | 11 +++++++++++

>  4 files changed, 56 insertions(+), 4 deletions(-)

> 

> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c

> index 9ffa7ff..4e68bd6 100644

> --- a/lib/netdev-dpdk.c

> +++ b/lib/netdev-dpdk.c

> @@ -138,9 +138,13 @@ BUILD_ASSERT_DECL((MAX_NB_MBUF /

> ROUND_DOWN_POW2(MAX_NB_MBUF/MIN_NB_MBUF))

> 

>  #ifdef VHOST_CUSE

>  static char *cuse_dev_name = NULL;    /* Character device

> cuse_dev_name. */

> +#else

> +static char *sock_dir_subcomponent = NULL;   /* Subdir of OVS run

> dir

> +                                                for vhost-user

> sockets */

>  #endif

>  static char *vhost_sock_dir = NULL;   /* Location of vhost-user

> sockets */

> 

> +

>  /*

>   * Maximum amount of time in micro seconds to try and enqueue to

> vhost.

>   */

> @@ -3086,9 +3090,6 @@ dpdk_init__(const struct smap

> *ovs_other_config)

>      bool auto_determine = true;

>      int err = 0;

>      cpu_set_t cpuset;

> -#ifndef VHOST_CUSE

> -    char *sock_dir_subcomponent;

> -#endif

> 

>      if (!smap_get_bool(ovs_other_config, "dpdk-init", false)) {

>          VLOG_INFO("DPDK Disabled - to change this requires a

> restart.\n");

> @@ -3119,10 +3120,11 @@ dpdk_init__(const struct smap

> *ovs_other_config)


[Antonio F] Just wondering if inside the previous lines 
where the vhu sock does not exist, should we consider to 
restore vhost_sock_dir to ovs_rundir(), like:

            err = stat(vhost_sock_dir, &s);
            if (err) {
                VLOG_ERR("vhost-user sock directory '%s' does not exist.",
                         vhost_sock_dir);

+               vhost_sock_dir = xasprintf("%s", ovs_rundir());
+               sock_dir_subcomponent = "";

            }

?
Or is that ok to leave it as it is now?

>              VLOG_ERR("vhost-user sock directory request '%s/%s' has

> invalid"

>                       "characters '..' - using %s instead.",

>                       ovs_rundir(), sock_dir_subcomponent,

> ovs_rundir());

> +            sock_dir_subcomponent = "";

>          }

> -        free(sock_dir_subcomponent);

>      } else {

>          vhost_sock_dir = sock_dir_subcomponent;

> +        sock_dir_subcomponent = "";

>  #endif

>      }

> 

> @@ -3244,6 +3246,34 @@ dpdk_init(const struct smap *ovs_other_config)

>      }

>  }

> 

> +void

> +dpdk_set_config(const struct ovsrec_open_vswitch *cfg)

> +{

> +    struct smap dpdk_args;

> +    const struct ovsdb_datum *datum;

> +    size_t i;

> +

> +    ovs_mutex_lock(&dpdk_mutex);

> +

> +    smap_init(&dpdk_args);

> +    /* read current values from database */

> +    datum = ovsrec_open_vswitch_get_other_config(cfg,

> OVSDB_TYPE_STRING,

> +                                                 OVSDB_TYPE_STRING);

> +    for (i = 0; i < datum->n; i++) {

> +      smap_add(&dpdk_args, datum->keys[i].string, datum-

> >values[i].string);

> +    }

> +    /* add default paths to the database */

> +    smap_add_format(&dpdk_args, "ovs-run-dir", "%s", ovs_rundir());

> +    if (sock_dir_subcomponent) {

> +      smap_add_format(&dpdk_args, "vhost-sock-dir", "%s",

> +                      sock_dir_subcomponent);

> +    }

> +    ovsrec_open_vswitch_set_other_config(cfg, &dpdk_args);

> +    smap_destroy(&dpdk_args);

> +

> +    ovs_mutex_unlock(&dpdk_mutex);

> +}

> +

>  static const struct netdev_class dpdk_class =

>      NETDEV_DPDK_CLASS(

>          "dpdk",

> diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h

> index ee748e0..08abcac 100644

> --- a/lib/netdev-dpdk.h

> +++ b/lib/netdev-dpdk.h

> @@ -3,6 +3,8 @@

> 

>  #include <config.h>

> 

> +#include "lib/vswitch-idl.h"

> +

>  struct dp_packet;

>  struct smap;

> 

> @@ -25,6 +27,7 @@ struct smap;

> 

>  void netdev_dpdk_register(void);

>  void free_dpdk_buf(struct dp_packet *);

> +void dpdk_set_config(const struct ovsrec_open_vswitch *cfg);

>  int pmd_thread_setaffinity_cpu(unsigned cpu);

> 

>  #else

> @@ -45,6 +48,12 @@ free_dpdk_buf(struct dp_packet *buf OVS_UNUSED)

>      /* Nothing */

>  }

> 

> +static inline void

> +dpdk_set_config(const struct ovsrec_open_vswitch *cfg)

> +{

> +    /* Nothing */

> +}

> +

>  static inline int

>  pmd_thread_setaffinity_cpu(unsigned cpu OVS_UNUSED)

>  {

> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c

> index 41ec4ba..d248721 100644

> --- a/vswitchd/bridge.c

> +++ b/vswitchd/bridge.c

> @@ -393,6 +393,7 @@ bridge_init(const char *remote)

>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_db_version);

>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_type);

>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_version);

> +    ovsdb_idl_omit_alert(idl,

> &ovsrec_open_vswitch_col_other_config);

> 

>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_id);

>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_version);

> @@ -2957,6 +2958,7 @@ bridge_run(void)

> 

>          if (cfg) {

>              ovsrec_open_vswitch_set_cur_cfg(cfg, cfg->next_cfg);

> +            dpdk_set_config(cfg);

>              discover_types(cfg);

>          }

> 

> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml

> index 944d8ec..8d06d29 100644

> --- a/vswitchd/vswitch.xml

> +++ b/vswitchd/vswitch.xml

> @@ -311,6 +311,17 @@

>          </p>

>        </column>

> 

> +      <column name="other_config" key="ovs-run-dir"

> +              type='{"type": "string"}'>

> +        <p>

> +          Specifies the Open vSwitch run directory.

> +        </p>

> +        <p>

> +          Defaults to the working directory of the application.

> Changing this

> +          value requires restarting the daemon.

> +        </p>

> +      </column>

> +

>        <column name="other_config" key="n-handler-threads"

>                type='{"type": "integer", "minInteger": 1}'>

>          <p>

> --

> 1.8.3.1

> 

> _______________________________________________

> dev mailing list

> dev@openvswitch.org

> http://openvswitch.org/mailman/listinfo/dev
Aaron Conole May 31, 2016, 6:20 p.m. UTC | #4
"Fischetti, Antonio" <antonio.fischetti@intel.com> writes:

> Hi Robert,
> one comment below.
> I've checked it applies cleanly to the latest master branch.
> Also with utilities/checkpatch.py is ok.
>
> Thanks,
> Antonio
>
>> -----Original Message-----
>> From: dev [mailto:dev-bounces@openvswitch.org] On Behalf Of Robert
>> Wojciechowicz
>> Sent: Monday, May 23, 2016 11:29 AM
>> To: dev@openvswitch.org
>> Subject: [ovs-dev] [PATCH] ovsdb: Expose vhost-user socket directory
>> in ovsdb
>> 
>> In order to correctly interoperate with Openstack and ODL,
>> the vhost-user socket directory must be exposed from OVS via OVSDB.
>> Different distros may package OVS in different ways,
>> so the locations of these sockets may vary depending on how
>> ovs-vswitchd has been started. Some clients need information where
>> the sockets are located when instantiating Qemu virtual machines.
>> The full vhost-user socket directory is constructed from current
>> OVS working directory and optionally from specified subdirectory.
>> This patch exposes vhost-user socket directory in Open_vSwitch
>> table in other_config column in two following keys:
>> 1. ovs-run-dir    - OVS working directory
>> 2. vhost-sock-dir - subdirectory of ovs-run-dir (might be empty)
>> 
>> Signed-off-by: Robert Wojciechowicz <robertx.wojciechowicz@intel.com>
>> ---
>>  lib/netdev-dpdk.c    | 38 ++++++++++++++++++++++++++++++++++----
>>  lib/netdev-dpdk.h    |  9 +++++++++
>>  vswitchd/bridge.c    |  2 ++
>>  vswitchd/vswitch.xml | 11 +++++++++++
>>  4 files changed, 56 insertions(+), 4 deletions(-)
>> 
>> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
>> index 9ffa7ff..4e68bd6 100644
>> --- a/lib/netdev-dpdk.c
>> +++ b/lib/netdev-dpdk.c
>> @@ -138,9 +138,13 @@ BUILD_ASSERT_DECL((MAX_NB_MBUF /
>> ROUND_DOWN_POW2(MAX_NB_MBUF/MIN_NB_MBUF))
>> 
>>  #ifdef VHOST_CUSE
>>  static char *cuse_dev_name = NULL;    /* Character device
>> cuse_dev_name. */
>> +#else
>> +static char *sock_dir_subcomponent = NULL;   /* Subdir of OVS run
>> dir
>> +                                                for vhost-user
>> sockets */
>>  #endif
>>  static char *vhost_sock_dir = NULL;   /* Location of vhost-user
>> sockets */
>> 
>> +
>>  /*
>>   * Maximum amount of time in micro seconds to try and enqueue to
>> vhost.
>>   */
>> @@ -3086,9 +3090,6 @@ dpdk_init__(const struct smap
>> *ovs_other_config)
>>      bool auto_determine = true;
>>      int err = 0;
>>      cpu_set_t cpuset;
>> -#ifndef VHOST_CUSE
>> -    char *sock_dir_subcomponent;
>> -#endif
>> 
>>      if (!smap_get_bool(ovs_other_config, "dpdk-init", false)) {
>>          VLOG_INFO("DPDK Disabled - to change this requires a
>> restart.\n");
>> @@ -3119,10 +3120,11 @@ dpdk_init__(const struct smap
>> *ovs_other_config)
>
> [Antonio F] Just wondering if inside the previous lines 
> where the vhu sock does not exist, should we consider to 
> restore vhost_sock_dir to ovs_rundir(), like:
>
>             err = stat(vhost_sock_dir, &s);
>             if (err) {
>                 VLOG_ERR("vhost-user sock directory '%s' does not exist.",
>                          vhost_sock_dir);
>
> +               vhost_sock_dir = xasprintf("%s", ovs_rundir());
> +               sock_dir_subcomponent = "";
>
>             }
>
> ?
> Or is that ok to leave it as it is now?

I haven't reviewed the whole patch, but I don't think this would be an
appropriate change.  As it stands, if a user sees this error message,
they may simply mkdir the missing subdirectory, and then dpdk vhost-user
sockets will begin to work.  With your change, not only will the error
message be displayed, but user sockets will be popping up in unexpected
places, meaning a restart will be required to resolve the issue fully.

>>              VLOG_ERR("vhost-user sock directory request '%s/%s' has
>> invalid"
>>                       "characters '..' - using %s instead.",
>>                       ovs_rundir(), sock_dir_subcomponent,
>> ovs_rundir());
>> +            sock_dir_subcomponent = "";
>>          }
>> -        free(sock_dir_subcomponent);
>>      } else {
>>          vhost_sock_dir = sock_dir_subcomponent;
>> +        sock_dir_subcomponent = "";
>>  #endif
>>      }
>> 
>> @@ -3244,6 +3246,34 @@ dpdk_init(const struct smap *ovs_other_config)
>>      }
>>  }
>> 
>> +void
>> +dpdk_set_config(const struct ovsrec_open_vswitch *cfg)
>> +{
>> +    struct smap dpdk_args;
>> +    const struct ovsdb_datum *datum;
>> +    size_t i;
>> +
>> +    ovs_mutex_lock(&dpdk_mutex);
>> +
>> +    smap_init(&dpdk_args);
>> +    /* read current values from database */
>> +    datum = ovsrec_open_vswitch_get_other_config(cfg,
>> OVSDB_TYPE_STRING,
>> +                                                 OVSDB_TYPE_STRING);
>> +    for (i = 0; i < datum->n; i++) {
>> +      smap_add(&dpdk_args, datum->keys[i].string, datum-
>> >values[i].string);
>> +    }
>> +    /* add default paths to the database */
>> +    smap_add_format(&dpdk_args, "ovs-run-dir", "%s", ovs_rundir());
>> +    if (sock_dir_subcomponent) {
>> +      smap_add_format(&dpdk_args, "vhost-sock-dir", "%s",
>> +                      sock_dir_subcomponent);
>> +    }
>> +    ovsrec_open_vswitch_set_other_config(cfg, &dpdk_args);
>> +    smap_destroy(&dpdk_args);
>> +
>> +    ovs_mutex_unlock(&dpdk_mutex);
>> +}
>> +
>>  static const struct netdev_class dpdk_class =
>>      NETDEV_DPDK_CLASS(
>>          "dpdk",
>> diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h
>> index ee748e0..08abcac 100644
>> --- a/lib/netdev-dpdk.h
>> +++ b/lib/netdev-dpdk.h
>> @@ -3,6 +3,8 @@
>> 
>>  #include <config.h>
>> 
>> +#include "lib/vswitch-idl.h"
>> +
>>  struct dp_packet;
>>  struct smap;
>> 
>> @@ -25,6 +27,7 @@ struct smap;
>> 
>>  void netdev_dpdk_register(void);
>>  void free_dpdk_buf(struct dp_packet *);
>> +void dpdk_set_config(const struct ovsrec_open_vswitch *cfg);
>>  int pmd_thread_setaffinity_cpu(unsigned cpu);
>> 
>>  #else
>> @@ -45,6 +48,12 @@ free_dpdk_buf(struct dp_packet *buf OVS_UNUSED)
>>      /* Nothing */
>>  }
>> 
>> +static inline void
>> +dpdk_set_config(const struct ovsrec_open_vswitch *cfg)
>> +{
>> +    /* Nothing */
>> +}
>> +
>>  static inline int
>>  pmd_thread_setaffinity_cpu(unsigned cpu OVS_UNUSED)
>>  {
>> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
>> index 41ec4ba..d248721 100644
>> --- a/vswitchd/bridge.c
>> +++ b/vswitchd/bridge.c
>> @@ -393,6 +393,7 @@ bridge_init(const char *remote)
>>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_db_version);
>>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_type);
>>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_version);
>> +    ovsdb_idl_omit_alert(idl,
>> &ovsrec_open_vswitch_col_other_config);
>> 
>>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_id);
>>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_version);
>> @@ -2957,6 +2958,7 @@ bridge_run(void)
>> 
>>          if (cfg) {
>>              ovsrec_open_vswitch_set_cur_cfg(cfg, cfg->next_cfg);
>> +            dpdk_set_config(cfg);
>>              discover_types(cfg);
>>          }
>> 
>> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
>> index 944d8ec..8d06d29 100644
>> --- a/vswitchd/vswitch.xml
>> +++ b/vswitchd/vswitch.xml
>> @@ -311,6 +311,17 @@
>>          </p>
>>        </column>
>> 
>> +      <column name="other_config" key="ovs-run-dir"
>> +              type='{"type": "string"}'>
>> +        <p>
>> +          Specifies the Open vSwitch run directory.
>> +        </p>
>> +        <p>
>> +          Defaults to the working directory of the application.
>> Changing this
>> +          value requires restarting the daemon.
>> +        </p>
>> +      </column>
>> +
>>        <column name="other_config" key="n-handler-threads"
>>                type='{"type": "integer", "minInteger": 1}'>
>>          <p>
>> --
>> 1.8.3.1
>> 
>> _______________________________________________
>> dev mailing list
>> dev@openvswitch.org
>> http://openvswitch.org/mailman/listinfo/dev
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
Aaron Conole May 31, 2016, 6:32 p.m. UTC | #5
Hi Robert,

Robert Wojciechowicz <robertx.wojciechowicz@intel.com> writes:

> In order to correctly interoperate with Openstack and ODL,
> the vhost-user socket directory must be exposed from OVS via OVSDB.
> Different distros may package OVS in different ways,
> so the locations of these sockets may vary depending on how
> ovs-vswitchd has been started. Some clients need information where
> the sockets are located when instantiating Qemu virtual machines.
> The full vhost-user socket directory is constructed from current
> OVS working directory and optionally from specified subdirectory.
> This patch exposes vhost-user socket directory in Open_vSwitch
> table in other_config column in two following keys:
> 1. ovs-run-dir    - OVS working directory
> 2. vhost-sock-dir - subdirectory of ovs-run-dir (might be empty)
>
> Signed-off-by: Robert Wojciechowicz <robertx.wojciechowicz@intel.com>

I think this idea makes sense.  Neutron plugin would want to know this
sort of thing.  I don't know much about the thinking w.r.t. putting
these kinds of values in database responses, but it seems to be a good
place for interop with other projects.

Just some nits below.

> ---
>  lib/netdev-dpdk.c    | 38 ++++++++++++++++++++++++++++++++++----
>  lib/netdev-dpdk.h    |  9 +++++++++
>  vswitchd/bridge.c    |  2 ++
>  vswitchd/vswitch.xml | 11 +++++++++++
>  4 files changed, 56 insertions(+), 4 deletions(-)
>
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index 9ffa7ff..4e68bd6 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -138,9 +138,13 @@ BUILD_ASSERT_DECL((MAX_NB_MBUF / ROUND_DOWN_POW2(MAX_NB_MBUF/MIN_NB_MBUF))
>  
>  #ifdef VHOST_CUSE
>  static char *cuse_dev_name = NULL;    /* Character device cuse_dev_name. */
> +#else
> +static char *sock_dir_subcomponent = NULL;   /* Subdir of OVS run dir
> +                                                for vhost-user sockets */
>  #endif
>  static char *vhost_sock_dir = NULL;   /* Location of vhost-user sockets */
>  
> +
>  /*
>   * Maximum amount of time in micro seconds to try and enqueue to vhost.
>   */
> @@ -3086,9 +3090,6 @@ dpdk_init__(const struct smap *ovs_other_config)
>      bool auto_determine = true;
>      int err = 0;
>      cpu_set_t cpuset;
> -#ifndef VHOST_CUSE
> -    char *sock_dir_subcomponent;
> -#endif
>  
>      if (!smap_get_bool(ovs_other_config, "dpdk-init", false)) {
>          VLOG_INFO("DPDK Disabled - to change this requires a restart.\n");
> @@ -3119,10 +3120,11 @@ dpdk_init__(const struct smap *ovs_other_config)
>              VLOG_ERR("vhost-user sock directory request '%s/%s' has invalid"
>                       "characters '..' - using %s instead.",
>                       ovs_rundir(), sock_dir_subcomponent, ovs_rundir());
> +            sock_dir_subcomponent = "";
>          }
> -        free(sock_dir_subcomponent);
>      } else {
>          vhost_sock_dir = sock_dir_subcomponent;
> +        sock_dir_subcomponent = "";
>  #endif
>      }
>  
> @@ -3244,6 +3246,34 @@ dpdk_init(const struct smap *ovs_other_config)
>      }
>  }
>  
> +void
> +dpdk_set_config(const struct ovsrec_open_vswitch *cfg)
> +{
> +    struct smap dpdk_args;
> +    const struct ovsdb_datum *datum;
> +    size_t i;
> +
> +    ovs_mutex_lock(&dpdk_mutex);
> +
> +    smap_init(&dpdk_args);
> +    /* read current values from database */
> +    datum = ovsrec_open_vswitch_get_other_config(cfg, OVSDB_TYPE_STRING,
> +                                                 OVSDB_TYPE_STRING);
> +    for (i = 0; i < datum->n; i++) {
> +      smap_add(&dpdk_args, datum->keys[i].string, datum->values[i].string);
> +    }
> +    /* add default paths to the database */
> +    smap_add_format(&dpdk_args, "ovs-run-dir", "%s", ovs_rundir());
> +    if (sock_dir_subcomponent) {

I never see sock_dir_subcomponent go null.  Does that make this check
useless?  If this is solely to protect against the 'race' where the dpdk
init hasn't been called, could you just initialize that var to ""
instead of NULL?

> +      smap_add_format(&dpdk_args, "vhost-sock-dir", "%s",
> +                      sock_dir_subcomponent);
> +    }
> +    ovsrec_open_vswitch_set_other_config(cfg, &dpdk_args);
> +    smap_destroy(&dpdk_args);
> +
> +    ovs_mutex_unlock(&dpdk_mutex);
> +}
> +
>  static const struct netdev_class dpdk_class =
>      NETDEV_DPDK_CLASS(
>          "dpdk",
> diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h
> index ee748e0..08abcac 100644
> --- a/lib/netdev-dpdk.h
> +++ b/lib/netdev-dpdk.h
> @@ -3,6 +3,8 @@
>  
>  #include <config.h>
>  
> +#include "lib/vswitch-idl.h"
> +

Don't include this here.  Forward declare the ovsrec_open_vswitch
struct.

>  struct dp_packet;
>  struct smap;
>  
> @@ -25,6 +27,7 @@ struct smap;
>  
>  void netdev_dpdk_register(void);
>  void free_dpdk_buf(struct dp_packet *);
> +void dpdk_set_config(const struct ovsrec_open_vswitch *cfg);

Move this out of the #if block.

>  int pmd_thread_setaffinity_cpu(unsigned cpu);
>  
>  #else
> @@ -45,6 +48,12 @@ free_dpdk_buf(struct dp_packet *buf OVS_UNUSED)
>      /* Nothing */
>  }
>  
> +static inline void
> +dpdk_set_config(const struct ovsrec_open_vswitch *cfg)
> +{
> +    /* Nothing */
> +}
> +

And move this to the netdev-nodpdk.c file.  Otherwise, this change will
add extra dependencies for the vswitch idl, and I think that should be
avoided.

>  static inline int
>  pmd_thread_setaffinity_cpu(unsigned cpu OVS_UNUSED)
>  {
> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> index 41ec4ba..d248721 100644
> --- a/vswitchd/bridge.c
> +++ b/vswitchd/bridge.c
> @@ -393,6 +393,7 @@ bridge_init(const char *remote)
>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_db_version);
>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_type);
>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_version);
> +    ovsdb_idl_omit_alert(idl, &ovsrec_open_vswitch_col_other_config);
>  
>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_id);
>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_version);
> @@ -2957,6 +2958,7 @@ bridge_run(void)
>  
>          if (cfg) {
>              ovsrec_open_vswitch_set_cur_cfg(cfg, cfg->next_cfg);
> +            dpdk_set_config(cfg);
>              discover_types(cfg);
>          }
>  
> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> index 944d8ec..8d06d29 100644
> --- a/vswitchd/vswitch.xml
> +++ b/vswitchd/vswitch.xml
> @@ -311,6 +311,17 @@
>          </p>
>        </column>
>  
> +      <column name="other_config" key="ovs-run-dir"
> +              type='{"type": "string"}'>
> +        <p>
> +          Specifies the Open vSwitch run directory.
> +        </p>
> +        <p>
> +          Defaults to the working directory of the application. Changing this
> +          value requires restarting the daemon.
> +        </p>
> +      </column>
> +
>        <column name="other_config" key="n-handler-threads"
>                type='{"type": "integer", "minInteger": 1}'>
>          <p>
Fischetti, Antonio June 1, 2016, 7:54 a.m. UTC | #6
Ok, it makes sense.

It looks ok to me now.

Acked-by: Antonio Fischetti <antonio.fischetti@intel.com>

> -----Original Message-----
> From: Aaron Conole [mailto:aconole@redhat.com]
> Sent: Tuesday, May 31, 2016 7:20 PM
> To: Fischetti, Antonio <antonio.fischetti@intel.com>
> Cc: Wojciechowicz, RobertX <robertx.wojciechowicz@intel.com>;
> dev@openvswitch.org
> Subject: Re: [ovs-dev] [PATCH] ovsdb: Expose vhost-user socket
> directory in ovsdb
> 
> "Fischetti, Antonio" <antonio.fischetti@intel.com> writes:
> 
> > Hi Robert,
> > one comment below.
> > I've checked it applies cleanly to the latest master branch.
> > Also with utilities/checkpatch.py is ok.
> >
> > Thanks,
> > Antonio
> >
> >> -----Original Message-----
> >> From: dev [mailto:dev-bounces@openvswitch.org] On Behalf Of Robert
> >> Wojciechowicz
> >> Sent: Monday, May 23, 2016 11:29 AM
> >> To: dev@openvswitch.org
> >> Subject: [ovs-dev] [PATCH] ovsdb: Expose vhost-user socket
> directory
> >> in ovsdb
> >>
> >> In order to correctly interoperate with Openstack and ODL,
> >> the vhost-user socket directory must be exposed from OVS via
> OVSDB.
> >> Different distros may package OVS in different ways,
> >> so the locations of these sockets may vary depending on how
> >> ovs-vswitchd has been started. Some clients need information where
> >> the sockets are located when instantiating Qemu virtual machines.
> >> The full vhost-user socket directory is constructed from current
> >> OVS working directory and optionally from specified subdirectory.
> >> This patch exposes vhost-user socket directory in Open_vSwitch
> >> table in other_config column in two following keys:
> >> 1. ovs-run-dir    - OVS working directory
> >> 2. vhost-sock-dir - subdirectory of ovs-run-dir (might be empty)
> >>
> >> Signed-off-by: Robert Wojciechowicz
> <robertx.wojciechowicz@intel.com>
> >> ---
> >>  lib/netdev-dpdk.c    | 38 ++++++++++++++++++++++++++++++++++----
> >>  lib/netdev-dpdk.h    |  9 +++++++++
> >>  vswitchd/bridge.c    |  2 ++
> >>  vswitchd/vswitch.xml | 11 +++++++++++
> >>  4 files changed, 56 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> >> index 9ffa7ff..4e68bd6 100644
> >> --- a/lib/netdev-dpdk.c
> >> +++ b/lib/netdev-dpdk.c
> >> @@ -138,9 +138,13 @@ BUILD_ASSERT_DECL((MAX_NB_MBUF /
> >> ROUND_DOWN_POW2(MAX_NB_MBUF/MIN_NB_MBUF))
> >>
> >>  #ifdef VHOST_CUSE
> >>  static char *cuse_dev_name = NULL;    /* Character device
> >> cuse_dev_name. */
> >> +#else
> >> +static char *sock_dir_subcomponent = NULL;   /* Subdir of OVS run
> >> dir
> >> +                                                for vhost-user
> >> sockets */
> >>  #endif
> >>  static char *vhost_sock_dir = NULL;   /* Location of vhost-user
> >> sockets */
> >>
> >> +
> >>  /*
> >>   * Maximum amount of time in micro seconds to try and enqueue to
> >> vhost.
> >>   */
> >> @@ -3086,9 +3090,6 @@ dpdk_init__(const struct smap
> >> *ovs_other_config)
> >>      bool auto_determine = true;
> >>      int err = 0;
> >>      cpu_set_t cpuset;
> >> -#ifndef VHOST_CUSE
> >> -    char *sock_dir_subcomponent;
> >> -#endif
> >>
> >>      if (!smap_get_bool(ovs_other_config, "dpdk-init", false)) {
> >>          VLOG_INFO("DPDK Disabled - to change this requires a
> >> restart.\n");
> >> @@ -3119,10 +3120,11 @@ dpdk_init__(const struct smap
> >> *ovs_other_config)
> >
> > [Antonio F] Just wondering if inside the previous lines
> > where the vhu sock does not exist, should we consider to
> > restore vhost_sock_dir to ovs_rundir(), like:
> >
> >             err = stat(vhost_sock_dir, &s);
> >             if (err) {
> >                 VLOG_ERR("vhost-user sock directory '%s' does not
> exist.",
> >                          vhost_sock_dir);
> >
> > +               vhost_sock_dir = xasprintf("%s", ovs_rundir());
> > +               sock_dir_subcomponent = "";
> >
> >             }
> >
> > ?
> > Or is that ok to leave it as it is now?
> 
> I haven't reviewed the whole patch, but I don't think this would be
> an
> appropriate change.  As it stands, if a user sees this error message,
> they may simply mkdir the missing subdirectory, and then dpdk vhost-
> user
> sockets will begin to work.  With your change, not only will the
> error
> message be displayed, but user sockets will be popping up in
> unexpected
> places, meaning a restart will be required to resolve the issue
> fully.
> 
> >>              VLOG_ERR("vhost-user sock directory request '%s/%s'
> has
> >> invalid"
> >>                       "characters '..' - using %s instead.",
> >>                       ovs_rundir(), sock_dir_subcomponent,
> >> ovs_rundir());
> >> +            sock_dir_subcomponent = "";
> >>          }
> >> -        free(sock_dir_subcomponent);
> >>      } else {
> >>          vhost_sock_dir = sock_dir_subcomponent;
> >> +        sock_dir_subcomponent = "";
> >>  #endif
> >>      }
> >>
> >> @@ -3244,6 +3246,34 @@ dpdk_init(const struct smap
> *ovs_other_config)
> >>      }
> >>  }
> >>
> >> +void
> >> +dpdk_set_config(const struct ovsrec_open_vswitch *cfg)
> >> +{
> >> +    struct smap dpdk_args;
> >> +    const struct ovsdb_datum *datum;
> >> +    size_t i;
> >> +
> >> +    ovs_mutex_lock(&dpdk_mutex);
> >> +
> >> +    smap_init(&dpdk_args);
> >> +    /* read current values from database */
> >> +    datum = ovsrec_open_vswitch_get_other_config(cfg,
> >> OVSDB_TYPE_STRING,
> >> +
> OVSDB_TYPE_STRING);
> >> +    for (i = 0; i < datum->n; i++) {
> >> +      smap_add(&dpdk_args, datum->keys[i].string, datum-
> >> >values[i].string);
> >> +    }
> >> +    /* add default paths to the database */
> >> +    smap_add_format(&dpdk_args, "ovs-run-dir", "%s",
> ovs_rundir());
> >> +    if (sock_dir_subcomponent) {
> >> +      smap_add_format(&dpdk_args, "vhost-sock-dir", "%s",
> >> +                      sock_dir_subcomponent);
> >> +    }
> >> +    ovsrec_open_vswitch_set_other_config(cfg, &dpdk_args);
> >> +    smap_destroy(&dpdk_args);
> >> +
> >> +    ovs_mutex_unlock(&dpdk_mutex);
> >> +}
> >> +
> >>  static const struct netdev_class dpdk_class =
> >>      NETDEV_DPDK_CLASS(
> >>          "dpdk",
> >> diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h
> >> index ee748e0..08abcac 100644
> >> --- a/lib/netdev-dpdk.h
> >> +++ b/lib/netdev-dpdk.h
> >> @@ -3,6 +3,8 @@
> >>
> >>  #include <config.h>
> >>
> >> +#include "lib/vswitch-idl.h"
> >> +
> >>  struct dp_packet;
> >>  struct smap;
> >>
> >> @@ -25,6 +27,7 @@ struct smap;
> >>
> >>  void netdev_dpdk_register(void);
> >>  void free_dpdk_buf(struct dp_packet *);
> >> +void dpdk_set_config(const struct ovsrec_open_vswitch *cfg);
> >>  int pmd_thread_setaffinity_cpu(unsigned cpu);
> >>
> >>  #else
> >> @@ -45,6 +48,12 @@ free_dpdk_buf(struct dp_packet *buf OVS_UNUSED)
> >>      /* Nothing */
> >>  }
> >>
> >> +static inline void
> >> +dpdk_set_config(const struct ovsrec_open_vswitch *cfg)
> >> +{
> >> +    /* Nothing */
> >> +}
> >> +
> >>  static inline int
> >>  pmd_thread_setaffinity_cpu(unsigned cpu OVS_UNUSED)
> >>  {
> >> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> >> index 41ec4ba..d248721 100644
> >> --- a/vswitchd/bridge.c
> >> +++ b/vswitchd/bridge.c
> >> @@ -393,6 +393,7 @@ bridge_init(const char *remote)
> >>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_db_version);
> >>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_type);
> >>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_version);
> >> +    ovsdb_idl_omit_alert(idl,
> >> &ovsrec_open_vswitch_col_other_config);
> >>
> >>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_id);
> >>      ovsdb_idl_omit_alert(idl,
> &ovsrec_bridge_col_datapath_version);
> >> @@ -2957,6 +2958,7 @@ bridge_run(void)
> >>
> >>          if (cfg) {
> >>              ovsrec_open_vswitch_set_cur_cfg(cfg, cfg->next_cfg);
> >> +            dpdk_set_config(cfg);
> >>              discover_types(cfg);
> >>          }
> >>
> >> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> >> index 944d8ec..8d06d29 100644
> >> --- a/vswitchd/vswitch.xml
> >> +++ b/vswitchd/vswitch.xml
> >> @@ -311,6 +311,17 @@
> >>          </p>
> >>        </column>
> >>
> >> +      <column name="other_config" key="ovs-run-dir"
> >> +              type='{"type": "string"}'>
> >> +        <p>
> >> +          Specifies the Open vSwitch run directory.
> >> +        </p>
> >> +        <p>
> >> +          Defaults to the working directory of the application.
> >> Changing this
> >> +          value requires restarting the daemon.
> >> +        </p>
> >> +      </column>
> >> +
> >>        <column name="other_config" key="n-handler-threads"
> >>                type='{"type": "integer", "minInteger": 1}'>
> >>          <p>
> >> --
> >> 1.8.3.1
> >>
> >> _______________________________________________
> >> dev mailing list
> >> dev@openvswitch.org
> >> http://openvswitch.org/mailman/listinfo/dev
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
Robert Wojciechowicz June 1, 2016, 9:48 a.m. UTC | #7
Hi Aaron,

thank you for review.
I will address your suggestions and prepare the second version of this patch.

Br,
Robert

> -----Original Message-----
> From: Aaron Conole [mailto:aconole@redhat.com]
> Sent: Tuesday, May 31, 2016 8:32 PM
> To: Wojciechowicz, RobertX <robertx.wojciechowicz@intel.com>
> Cc: dev@openvswitch.org
> Subject: Re: [ovs-dev] [PATCH] ovsdb: Expose vhost-user socket directory in
> ovsdb
> 
> 
> Hi Robert,
> 
> Robert Wojciechowicz <robertx.wojciechowicz@intel.com> writes:
> 
> > In order to correctly interoperate with Openstack and ODL,
> > the vhost-user socket directory must be exposed from OVS via OVSDB.
> > Different distros may package OVS in different ways,
> > so the locations of these sockets may vary depending on how
> > ovs-vswitchd has been started. Some clients need information where
> > the sockets are located when instantiating Qemu virtual machines.
> > The full vhost-user socket directory is constructed from current
> > OVS working directory and optionally from specified subdirectory.
> > This patch exposes vhost-user socket directory in Open_vSwitch
> > table in other_config column in two following keys:
> > 1. ovs-run-dir    - OVS working directory
> > 2. vhost-sock-dir - subdirectory of ovs-run-dir (might be empty)
> >
> > Signed-off-by: Robert Wojciechowicz <robertx.wojciechowicz@intel.com>
> 
> I think this idea makes sense.  Neutron plugin would want to know this
> sort of thing.  I don't know much about the thinking w.r.t. putting
> these kinds of values in database responses, but it seems to be a good
> place for interop with other projects.
> 
> Just some nits below.
> 
> > ---
> >  lib/netdev-dpdk.c    | 38 ++++++++++++++++++++++++++++++++++----
> >  lib/netdev-dpdk.h    |  9 +++++++++
> >  vswitchd/bridge.c    |  2 ++
> >  vswitchd/vswitch.xml | 11 +++++++++++
> >  4 files changed, 56 insertions(+), 4 deletions(-)
> >
> > diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> > index 9ffa7ff..4e68bd6 100644
> > --- a/lib/netdev-dpdk.c
> > +++ b/lib/netdev-dpdk.c
> > @@ -138,9 +138,13 @@ BUILD_ASSERT_DECL((MAX_NB_MBUF /
> ROUND_DOWN_POW2(MAX_NB_MBUF/MIN_NB_MBUF))
> >
> >  #ifdef VHOST_CUSE
> >  static char *cuse_dev_name = NULL;    /* Character device
> cuse_dev_name. */
> > +#else
> > +static char *sock_dir_subcomponent = NULL;   /* Subdir of OVS run dir
> > +                                                for vhost-user sockets */
> >  #endif
> >  static char *vhost_sock_dir = NULL;   /* Location of vhost-user sockets */
> >
> > +
> >  /*
> >   * Maximum amount of time in micro seconds to try and enqueue to vhost.
> >   */
> > @@ -3086,9 +3090,6 @@ dpdk_init__(const struct smap
> *ovs_other_config)
> >      bool auto_determine = true;
> >      int err = 0;
> >      cpu_set_t cpuset;
> > -#ifndef VHOST_CUSE
> > -    char *sock_dir_subcomponent;
> > -#endif
> >
> >      if (!smap_get_bool(ovs_other_config, "dpdk-init", false)) {
> >          VLOG_INFO("DPDK Disabled - to change this requires a restart.\n");
> > @@ -3119,10 +3120,11 @@ dpdk_init__(const struct smap
> *ovs_other_config)
> >              VLOG_ERR("vhost-user sock directory request '%s/%s' has invalid"
> >                       "characters '..' - using %s instead.",
> >                       ovs_rundir(), sock_dir_subcomponent, ovs_rundir());
> > +            sock_dir_subcomponent = "";
> >          }
> > -        free(sock_dir_subcomponent);
> >      } else {
> >          vhost_sock_dir = sock_dir_subcomponent;
> > +        sock_dir_subcomponent = "";
> >  #endif
> >      }
> >
> > @@ -3244,6 +3246,34 @@ dpdk_init(const struct smap *ovs_other_config)
> >      }
> >  }
> >
> > +void
> > +dpdk_set_config(const struct ovsrec_open_vswitch *cfg)
> > +{
> > +    struct smap dpdk_args;
> > +    const struct ovsdb_datum *datum;
> > +    size_t i;
> > +
> > +    ovs_mutex_lock(&dpdk_mutex);
> > +
> > +    smap_init(&dpdk_args);
> > +    /* read current values from database */
> > +    datum = ovsrec_open_vswitch_get_other_config(cfg,
> OVSDB_TYPE_STRING,
> > +                                                 OVSDB_TYPE_STRING);
> > +    for (i = 0; i < datum->n; i++) {
> > +      smap_add(&dpdk_args, datum->keys[i].string, datum-
> >values[i].string);
> > +    }
> > +    /* add default paths to the database */
> > +    smap_add_format(&dpdk_args, "ovs-run-dir", "%s", ovs_rundir());
> > +    if (sock_dir_subcomponent) {
> 
> I never see sock_dir_subcomponent go null.  Does that make this check
> useless?  If this is solely to protect against the 'race' where the dpdk
> init hasn't been called, could you just initialize that var to ""
> instead of NULL?
> 
> > +      smap_add_format(&dpdk_args, "vhost-sock-dir", "%s",
> > +                      sock_dir_subcomponent);
> > +    }
> > +    ovsrec_open_vswitch_set_other_config(cfg, &dpdk_args);
> > +    smap_destroy(&dpdk_args);
> > +
> > +    ovs_mutex_unlock(&dpdk_mutex);
> > +}
> > +
> >  static const struct netdev_class dpdk_class =
> >      NETDEV_DPDK_CLASS(
> >          "dpdk",
> > diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h
> > index ee748e0..08abcac 100644
> > --- a/lib/netdev-dpdk.h
> > +++ b/lib/netdev-dpdk.h
> > @@ -3,6 +3,8 @@
> >
> >  #include <config.h>
> >
> > +#include "lib/vswitch-idl.h"
> > +
> 
> Don't include this here.  Forward declare the ovsrec_open_vswitch
> struct.
> 
> >  struct dp_packet;
> >  struct smap;
> >
> > @@ -25,6 +27,7 @@ struct smap;
> >
> >  void netdev_dpdk_register(void);
> >  void free_dpdk_buf(struct dp_packet *);
> > +void dpdk_set_config(const struct ovsrec_open_vswitch *cfg);
> 
> Move this out of the #if block.
> 
> >  int pmd_thread_setaffinity_cpu(unsigned cpu);
> >
> >  #else
> > @@ -45,6 +48,12 @@ free_dpdk_buf(struct dp_packet *buf
> OVS_UNUSED)
> >      /* Nothing */
> >  }
> >
> > +static inline void
> > +dpdk_set_config(const struct ovsrec_open_vswitch *cfg)
> > +{
> > +    /* Nothing */
> > +}
> > +
> 
> And move this to the netdev-nodpdk.c file.  Otherwise, this change will
> add extra dependencies for the vswitch idl, and I think that should be
> avoided.
> 
> >  static inline int
> >  pmd_thread_setaffinity_cpu(unsigned cpu OVS_UNUSED)
> >  {
> > diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> > index 41ec4ba..d248721 100644
> > --- a/vswitchd/bridge.c
> > +++ b/vswitchd/bridge.c
> > @@ -393,6 +393,7 @@ bridge_init(const char *remote)
> >      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_db_version);
> >      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_type);
> >      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_version);
> > +    ovsdb_idl_omit_alert(idl, &ovsrec_open_vswitch_col_other_config);
> >
> >      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_id);
> >      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_version);
> > @@ -2957,6 +2958,7 @@ bridge_run(void)
> >
> >          if (cfg) {
> >              ovsrec_open_vswitch_set_cur_cfg(cfg, cfg->next_cfg);
> > +            dpdk_set_config(cfg);
> >              discover_types(cfg);
> >          }
> >
> > diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> > index 944d8ec..8d06d29 100644
> > --- a/vswitchd/vswitch.xml
> > +++ b/vswitchd/vswitch.xml
> > @@ -311,6 +311,17 @@
> >          </p>
> >        </column>
> >
> > +      <column name="other_config" key="ovs-run-dir"
> > +              type='{"type": "string"}'>
> > +        <p>
> > +          Specifies the Open vSwitch run directory.
> > +        </p>
> > +        <p>
> > +          Defaults to the working directory of the application. Changing this
> > +          value requires restarting the daemon.
> > +        </p>
> > +      </column>
> > +
> >        <column name="other_config" key="n-handler-threads"
> >                type='{"type": "integer", "minInteger": 1}'>
> >          <p>
diff mbox

Patch

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 9ffa7ff..4e68bd6 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -138,9 +138,13 @@  BUILD_ASSERT_DECL((MAX_NB_MBUF / ROUND_DOWN_POW2(MAX_NB_MBUF/MIN_NB_MBUF))
 
 #ifdef VHOST_CUSE
 static char *cuse_dev_name = NULL;    /* Character device cuse_dev_name. */
+#else
+static char *sock_dir_subcomponent = NULL;   /* Subdir of OVS run dir
+                                                for vhost-user sockets */
 #endif
 static char *vhost_sock_dir = NULL;   /* Location of vhost-user sockets */
 
+
 /*
  * Maximum amount of time in micro seconds to try and enqueue to vhost.
  */
@@ -3086,9 +3090,6 @@  dpdk_init__(const struct smap *ovs_other_config)
     bool auto_determine = true;
     int err = 0;
     cpu_set_t cpuset;
-#ifndef VHOST_CUSE
-    char *sock_dir_subcomponent;
-#endif
 
     if (!smap_get_bool(ovs_other_config, "dpdk-init", false)) {
         VLOG_INFO("DPDK Disabled - to change this requires a restart.\n");
@@ -3119,10 +3120,11 @@  dpdk_init__(const struct smap *ovs_other_config)
             VLOG_ERR("vhost-user sock directory request '%s/%s' has invalid"
                      "characters '..' - using %s instead.",
                      ovs_rundir(), sock_dir_subcomponent, ovs_rundir());
+            sock_dir_subcomponent = "";
         }
-        free(sock_dir_subcomponent);
     } else {
         vhost_sock_dir = sock_dir_subcomponent;
+        sock_dir_subcomponent = "";
 #endif
     }
 
@@ -3244,6 +3246,34 @@  dpdk_init(const struct smap *ovs_other_config)
     }
 }
 
+void
+dpdk_set_config(const struct ovsrec_open_vswitch *cfg)
+{
+    struct smap dpdk_args;
+    const struct ovsdb_datum *datum;
+    size_t i;
+
+    ovs_mutex_lock(&dpdk_mutex);
+
+    smap_init(&dpdk_args);
+    /* read current values from database */
+    datum = ovsrec_open_vswitch_get_other_config(cfg, OVSDB_TYPE_STRING,
+                                                 OVSDB_TYPE_STRING);
+    for (i = 0; i < datum->n; i++) {
+      smap_add(&dpdk_args, datum->keys[i].string, datum->values[i].string);
+    }
+    /* add default paths to the database */
+    smap_add_format(&dpdk_args, "ovs-run-dir", "%s", ovs_rundir());
+    if (sock_dir_subcomponent) {
+      smap_add_format(&dpdk_args, "vhost-sock-dir", "%s",
+                      sock_dir_subcomponent);
+    }
+    ovsrec_open_vswitch_set_other_config(cfg, &dpdk_args);
+    smap_destroy(&dpdk_args);
+
+    ovs_mutex_unlock(&dpdk_mutex);
+}
+
 static const struct netdev_class dpdk_class =
     NETDEV_DPDK_CLASS(
         "dpdk",
diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h
index ee748e0..08abcac 100644
--- a/lib/netdev-dpdk.h
+++ b/lib/netdev-dpdk.h
@@ -3,6 +3,8 @@ 
 
 #include <config.h>
 
+#include "lib/vswitch-idl.h"
+
 struct dp_packet;
 struct smap;
 
@@ -25,6 +27,7 @@  struct smap;
 
 void netdev_dpdk_register(void);
 void free_dpdk_buf(struct dp_packet *);
+void dpdk_set_config(const struct ovsrec_open_vswitch *cfg);
 int pmd_thread_setaffinity_cpu(unsigned cpu);
 
 #else
@@ -45,6 +48,12 @@  free_dpdk_buf(struct dp_packet *buf OVS_UNUSED)
     /* Nothing */
 }
 
+static inline void
+dpdk_set_config(const struct ovsrec_open_vswitch *cfg)
+{
+    /* Nothing */
+}
+
 static inline int
 pmd_thread_setaffinity_cpu(unsigned cpu OVS_UNUSED)
 {
diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index 41ec4ba..d248721 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -393,6 +393,7 @@  bridge_init(const char *remote)
     ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_db_version);
     ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_type);
     ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_version);
+    ovsdb_idl_omit_alert(idl, &ovsrec_open_vswitch_col_other_config);
 
     ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_id);
     ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_version);
@@ -2957,6 +2958,7 @@  bridge_run(void)
 
         if (cfg) {
             ovsrec_open_vswitch_set_cur_cfg(cfg, cfg->next_cfg);
+            dpdk_set_config(cfg);
             discover_types(cfg);
         }
 
diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
index 944d8ec..8d06d29 100644
--- a/vswitchd/vswitch.xml
+++ b/vswitchd/vswitch.xml
@@ -311,6 +311,17 @@ 
         </p>
       </column>
 
+      <column name="other_config" key="ovs-run-dir"
+              type='{"type": "string"}'>
+        <p>
+          Specifies the Open vSwitch run directory.
+        </p>
+        <p>
+          Defaults to the working directory of the application. Changing this
+          value requires restarting the daemon.
+        </p>
+      </column>
+
       <column name="other_config" key="n-handler-threads"
               type='{"type": "integer", "minInteger": 1}'>
         <p>