From: Ben Pfaff Date: Thu, 25 Mar 2010 19:30:05 +0000 (-0700) Subject: Merge "citrix" branch into "master". X-Git-Tag: v1.0.0~225 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=a0bc29a541fc7dc6e20137d5558e2094d614e6ab;hp=ea8cd10d2934586158734d31300f86eca381cc7a;p=sliver-openvswitch.git Merge "citrix" branch into "master". This merge is long overdue, simply because I forgot that there were outstanding changes on "citrix" that had not yet been merged. The important fix here is the addition of mlockall. This fixes some bugs seen under stressful conditions in XenServer. --- diff --git a/ChangeLog b/ChangeLog index 1acda09a2..e9ba2551a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -12,6 +12,11 @@ v0.99.0 - 14 Jan 2010 --------------------- - User-space forwarding engine - Bug fixes + +v0.90.7 - 29 Nov 2009 +--------------------- + - Add support for NetFlow active timeouts + - Bug fixes v0.90.6 - 6 Oct 2009 -------------------- diff --git a/configure.ac b/configure.ac index 6d49484fc..e8497e1f3 100644 --- a/configure.ac +++ b/configure.ac @@ -53,6 +53,7 @@ OVS_CHECK_IF_PACKET OVS_CHECK_STRTOK_R AC_CHECK_MEMBERS([struct stat.st_mtim.tv_nsec, struct stat.st_mtimensec], [], [], [[#include ]]) +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 cbfea13a5..0ec1ecda0 100644 --- a/vswitchd/ovs-vswitchd.8.in +++ b/vswitchd/ovs-vswitchd.8.in @@ -74,6 +74,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 7b0661ec6..c1acfc414 100644 --- a/vswitchd/ovs-vswitchd.c +++ b/vswitchd/ovs-vswitchd.c @@ -22,6 +22,9 @@ #include #include #include +#ifdef HAVE_MLOCKALL +#include +#endif #include "bridge.h" #include "command-line.h" @@ -136,6 +139,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, @@ -144,6 +148,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, @@ -175,6 +180,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 7a8b83e66..9b05879aa 100755 --- a/xenserver/etc_init.d_vswitch +++ b/xenserver/etc_init.d_vswitch @@ -50,6 +50,7 @@ test -e /etc/sysconfig/vswitch && . /etc/sysconfig/vswitch : ${VSWITCHD_PIDFILE:=/var/run/ovs-vswitchd.pid} : ${VSWITCHD_RUN_DIR:=/var/xen/vswitch} : ${VSWITCHD_PRIORITY:=-10} +: ${VSWITCHD_MLOCKALL:=yes} : ${VSWITCHD_LOGFILE:=/var/log/ovs-vswitchd.log} : ${VSWITCHD_FILE_LOGLEVEL:=INFO} : ${VSWITCHD_SYSLOG_LOGLEVEL:=ERR} @@ -218,12 +219,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 $monitor_opt --no-chdir $fake_proc_net_opt -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt "$VSWITCHD_OVSDB_SERVER") & + (nice -n "$VSWITCHD_PRIORITY" $strace_opt $valgrind_opt "$vswitchd" --pidfile="$VSWITCHD_PIDFILE" --detach $monitor_opt --no-chdir $fake_proc_net_opt -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt $mlockall_opt "$VSWITCHD_OVSDB_SERVER") & else - action "Starting ovs-vswitchd" nice -n "$VSWITCHD_PRIORITY" "$vswitchd" --pidfile="$VSWITCHD_PIDFILE" --detach $monitor_opt --no-chdir $fake_proc_net_opt -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt "$VSWITCHD_OVSDB_SERVER" + action "Starting ovs-vswitchd" nice -n "$VSWITCHD_PRIORITY" "$vswitchd" --pidfile="$VSWITCHD_PIDFILE" --detach $monitor_opt --no-chdir $fake_proc_net_opt -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt $mlockall_opt "$VSWITCHD_OVSDB_SERVER" fi } diff --git a/xenserver/usr_share_vswitch_scripts_sysconfig.template b/xenserver/usr_share_vswitch_scripts_sysconfig.template index 8b740c2e2..4d5efcab3 100644 --- a/xenserver/usr_share_vswitch_scripts_sysconfig.template +++ b/xenserver/usr_share_vswitch_scripts_sysconfig.template @@ -117,6 +117,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