aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac1
-rw-r--r--vswitchd/ovs-vswitchd.8.in11
-rw-r--r--vswitchd/ovs-vswitchd.c15
-rwxr-xr-xxenserver/etc_init.d_vswitch8
-rw-r--r--xenserver/root_vswitch_scripts_sysconfig.template7
5 files changed, 40 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac
index 86cbe160..55df342b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -46,6 +46,7 @@ OVS_CHECK_LINUX_VT_H
OVS_CHECK_PCRE
OVS_CHECK_IF_PACKET
OVS_CHECK_STRTOK_R
+AC_CHECK_FUNCS([mlockall])
OVS_CHECK_PKIDIR
OVS_CHECK_RUNDIR
diff --git a/vswitchd/ovs-vswitchd.8.in b/vswitchd/ovs-vswitchd.8.in
index 5c8d6c77..e9c11f41 100644
--- a/vswitchd/ovs-vswitchd.8.in
+++ b/vswitchd/ovs-vswitchd.8.in
@@ -67,6 +67,17 @@ Open vSwitch distribution for instructions on how to build and load
the Open vSwitch kernel module.
.PP
.SH OPTIONS
+.IP "\fB--mlockall\fR"
+Causes \fBovs\-vswitchd\fR to call the \fBmlockall()\fR function, to
+attempt to lock all of its process memory into physical RAM,
+preventing the kernel from paging any of its memory to disk. This
+helps to avoid networking interruptions due to system memory pressure.
+.IP
+Some systems do not support \fBmlockall()\fR at all, and other systems
+only allow privileged users, such as the superuser, to use it.
+\fBovs\-vswitchd\fR emits a log message if \fBmlockall()\fR is
+unavailable or unsuccessful.
+.
.IP "\fB--fake-proc-net\fR"
Causes \fBovs\-vswitchd\fR to simulate some files in \fB/proc/net/vlan\fR
and \fB/proc/net/bonding\fR that some legacy software expects to
diff --git a/vswitchd/ovs-vswitchd.c b/vswitchd/ovs-vswitchd.c
index 01645adf..3309c080 100644
--- a/vswitchd/ovs-vswitchd.c
+++ b/vswitchd/ovs-vswitchd.c
@@ -22,6 +22,9 @@
#include <signal.h>
#include <stdlib.h>
#include <string.h>
+#ifdef HAVE_MLOCKALL
+#include <sys/mman.h>
+#endif
#include "bridge.h"
#include "cfg.h"
@@ -148,6 +151,7 @@ parse_options(int argc, char *argv[])
{
enum {
OPT_PEER_CA_CERT = UCHAR_MAX + 1,
+ OPT_MLOCKALL,
OPT_FAKE_PROC_NET,
VLOG_OPTION_ENUMS,
LEAK_CHECKER_OPTION_ENUMS
@@ -155,6 +159,7 @@ parse_options(int argc, char *argv[])
static struct option long_options[] = {
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'V'},
+ {"mlockall", no_argument, 0, OPT_MLOCKALL},
{"fake-proc-net", no_argument, 0, OPT_FAKE_PROC_NET},
DAEMON_LONG_OPTIONS,
VLOG_LONG_OPTIONS,
@@ -186,6 +191,16 @@ parse_options(int argc, char *argv[])
OVS_PRINT_VERSION(OFP_VERSION, OFP_VERSION);
exit(EXIT_SUCCESS);
+ case OPT_MLOCKALL:
+#ifdef HAVE_MLOCKALL
+ if (mlockall(MCL_CURRENT | MCL_FUTURE)) {
+ VLOG_ERR("mlockall failed: %s", strerror(errno));
+ }
+#else
+ VLOG_ERR("mlockall not supported on this system");
+#endif
+ break;
+
case OPT_FAKE_PROC_NET:
error = proc_net_compat_init();
if (error) {
diff --git a/xenserver/etc_init.d_vswitch b/xenserver/etc_init.d_vswitch
index 4050d5ae..e8e04ad2 100755
--- a/xenserver/etc_init.d_vswitch
+++ b/xenserver/etc_init.d_vswitch
@@ -34,6 +34,7 @@ VSWITCHD_CONF="${VSWITCHD_CONF:-/etc/ovs-vswitchd.conf}"
VSWITCHD_PIDFILE="${VSWITCHD_PIDFILE:-/var/run/ovs-vswitchd.pid}"
VSWITCHD_RUN_DIR="${VSWITCHD_RUN_DIR:-/var/xen/vswitch}"
VSWITCHD_PRIORITY="${VSWITCHD_PRIORITY:--10}"
+VSWITCHD_MLOCKALL="${VSWITCHD_MLOCKALL:-yes}"
VSWITCHD_LOGFILE="${VSWITCHD_LOGFILE:-/var/log/ovs-vswitchd.log}"
VSWITCHD_FILE_LOGLEVEL="${VSWITCHD_FILE_LOGLEVEL:-INFO}"
VSWITCHD_SYSLOG_LOGLEVEL="${VSWITCHD_SYSLOG_LOGLEVEL:-ERR}"
@@ -159,12 +160,15 @@ function start_vswitchd {
if [ "$ENABLE_FAKE_PROC_NET" = "y" ]; then
fake_proc_net_opt="--fake-proc-net"
fi
+ if [ "$VSWITCHD_MLOCKALL" != "no" ]; then
+ mlockall_opt="--mlockall"
+ fi
if [ "$daemonize" != "y" ]; then
# Start in background and force a "success" message
action "Starting ovs-vswitchd ($strace_opt$valgrind_opt)" true
- (nice -n "$VSWITCHD_PRIORITY" $strace_opt $valgrind_opt "$vswitchd" --pidfile="$VSWITCHD_PIDFILE" --detach --no-chdir $fake_proc_net_opt -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt "$VSWITCHD_CONF") &
+ (nice -n "$VSWITCHD_PRIORITY" $strace_opt $valgrind_opt "$vswitchd" --pidfile="$VSWITCHD_PIDFILE" --detach --no-chdir $fake_proc_net_opt -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt $mlockall_opt "$VSWITCHD_CONF") &
else
- action "Starting ovs-vswitchd" nice -n "$VSWITCHD_PRIORITY" "$vswitchd" --pidfile="$VSWITCHD_PIDFILE" --detach --no-chdir $fake_proc_net_opt -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt "$VSWITCHD_CONF"
+ action "Starting ovs-vswitchd" nice -n "$VSWITCHD_PRIORITY" "$vswitchd" --pidfile="$VSWITCHD_PIDFILE" --detach --no-chdir $fake_proc_net_opt -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt $mlockall_opt "$VSWITCHD_CONF"
fi
}
diff --git a/xenserver/root_vswitch_scripts_sysconfig.template b/xenserver/root_vswitch_scripts_sysconfig.template
index f848e7b4..2578d11c 100644
--- a/xenserver/root_vswitch_scripts_sysconfig.template
+++ b/xenserver/root_vswitch_scripts_sysconfig.template
@@ -43,6 +43,13 @@
# processes.
# VSWITCHD_PRIORITY=-10
+# VSWITCHD_MLOCKALL: Whether to pass ovs-vswitchd the --mlockall option.
+# This option should be set to "yes" or "no". The default is "yes".
+# Enabling this option can avoid networking interruptions due to
+# system memory pressure in extraordinary situations, such as multiple
+# concurrent VM import operations.
+# VSWITCHD_MLOCKALL=yes
+
# VSWITCHD_LOGFILE: File to send the FILE_LOGLEVEL log messages to.
# VSWITCHD_LOGFILE=/var/log/ovs-vswitchd.log