[ovs-dev] [PATCH] ovsdb: Expose vhost-user socket directory in ovsdb
Robert Wojciechowicz
robertx.wojciechowicz at intel.com
Mon May 23 10:28:46 UTC 2016
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 at 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
More information about the dev
mailing list