[ovs-dev] [PATCH] timeval: Remove CACHE_TIME scheme.
Ethan Jackson
ethan at nicira.com
Wed Sep 4 21:00:12 UTC 2013
LGTM, just some minor comments.
I don't think we need the postfork() function anymore. It's just
calling time_init() which will get called later anyway.
In the comment to time_alarm we say it refreshes the current time as a
side effect. I'd just remove that entirely, doesn't make sense
anymore.
In ofproto-dpif, I'd just set the BUCKET_WIDTH directly to 100,
instead of messing with this ROUND_UP stuff.
Thanks,
Ethan
On Fri, Aug 30, 2013 at 4:11 PM, Alex Wang <alexw at nicira.com> wrote:
> This commit removes the CACHE_TIME scheme from timeval module. This
> is for eliminating the lock contention over the read/write lock of
> the cached time. To get the time, the thread now will directly do
> the system call 'clock_gettime()'.
>
> As a side effect, time can only be warpped after timer is stopped
> by 'ovs-appctl time/stop' command.
>
> Signed-off-by: Alex Wang <alexw at nicira.com>
> ---
> lib/timeval.c | 122 +++-------------------------------------
> lib/timeval.h | 18 ------
> m4/openvswitch.m4 | 16 ------
> ofproto/ofproto-dpif.c | 2 +-
> tests/automake.mk | 6 --
> tests/learn.at | 1 +
> tests/ofproto-dpif.at | 8 +++
> tests/test-timeval.c | 145 ------------------------------------------------
> tests/testsuite.at | 1 -
> tests/timeval.at | 22 --------
> vswitchd/bridge.c | 3 -
> 11 files changed, 19 insertions(+), 325 deletions(-)
> delete mode 100644 tests/test-timeval.c
> delete mode 100644 tests/timeval.at
>
> diff --git a/lib/timeval.c b/lib/timeval.c
> index faf8e7b..2c8d491 100644
> --- a/lib/timeval.c
> +++ b/lib/timeval.c
> @@ -41,14 +41,12 @@ VLOG_DEFINE_THIS_MODULE(timeval);
>
> struct clock {
> clockid_t id; /* CLOCK_MONOTONIC or CLOCK_REALTIME. */
> - struct ovs_rwlock rwlock; /* Mutual exclusion for 'cache'. */
>
> /* Features for use by unit tests. Protected by 'rwlock'. */
> + struct ovs_rwlock rwlock;
> struct timespec warp; /* Offset added for unit tests. */
> bool stopped; /* Disables real-time updates if true. */
>
> - /* Relevant only if CACHE_TIME is true. */
> - volatile sig_atomic_t tick; /* Has the timer ticked? Set by signal. */
> struct timespec cache; /* Last time read from kernel. */
> };
>
> @@ -67,11 +65,6 @@ static long long int deadline = LLONG_MAX;
> * up. */
> DEFINE_STATIC_PER_THREAD_DATA(long long int, last_wakeup, 0);
>
> -static void set_up_timer(void);
> -static void set_up_signal(int flags);
> -static void sigalrm_handler(int);
> -static void block_sigalrm(sigset_t *);
> -static void unblock_sigalrm(const sigset_t *);
> static void log_poll_interval(long long int last_wakeup);
> static struct rusage *get_recent_rusage(void);
> static void refresh_rusage(void);
> @@ -83,7 +76,6 @@ init_clock(struct clock *c, clockid_t id)
> {
> memset(c, 0, sizeof *c);
> c->id = id;
> - ovs_rwlock_init(&c->rwlock);
> xclock_gettime(c->id, &c->cache);
> }
>
> @@ -99,9 +91,6 @@ do_init_time(void)
> : CLOCK_REALTIME));
> init_clock(&wall_clock, CLOCK_REALTIME);
> boot_time = timespec_to_msec(&monotonic_clock.cache);
> -
> - set_up_signal(SA_RESTART);
> - set_up_timer();
> }
>
> /* Initializes the timetracking module, if not already initialized. */
> @@ -112,43 +101,7 @@ time_init(void)
> pthread_once(&once, do_init_time);
> }
>
> -static void
> -set_up_signal(int flags)
> -{
> - struct sigaction sa;
> -
> - memset(&sa, 0, sizeof sa);
> - sa.sa_handler = sigalrm_handler;
> - sigemptyset(&sa.sa_mask);
> - sa.sa_flags = flags;
> - xsigaction(SIGALRM, &sa, NULL);
> -}
> -
> -static void
> -set_up_timer(void)
> -{
> - static timer_t timer_id; /* "static" to avoid apparent memory leak. */
> - struct itimerspec itimer;
> -
> - if (!CACHE_TIME) {
> - return;
> - }
> -
> - if (timer_create(monotonic_clock.id, NULL, &timer_id)) {
> - VLOG_FATAL("timer_create failed (%s)", ovs_strerror(errno));
> - }
> -
> - itimer.it_interval.tv_sec = 0;
> - itimer.it_interval.tv_nsec = TIME_UPDATE_INTERVAL * 1000 * 1000;
> - itimer.it_value = itimer.it_interval;
> -
> - if (timer_settime(timer_id, 0, &itimer, NULL)) {
> - VLOG_FATAL("timer_settime failed (%s)", ovs_strerror(errno));
> - }
> -}
> -
> -/* Set up the interval timer, to ensure that time advances even without calling
> - * time_refresh().
> +/* Set up the interval timer, to ensure that time advances.
> *
> * A child created with fork() does not inherit the parent's interval timer, so
> * this function needs to be called from the child after fork(). */
> @@ -157,41 +110,18 @@ time_postfork(void)
> {
> assert_single_threaded();
> time_init();
> - set_up_timer();
> -}
> -
> -/* Forces a refresh of the current time from the kernel. It is not usually
> - * necessary to call this function, since the time will be refreshed
> - * automatically at least every TIME_UPDATE_INTERVAL milliseconds. If
> - * CACHE_TIME is false, we will always refresh the current time so this
> - * function has no effect. */
> -void
> -time_refresh(void)
> -{
> - monotonic_clock.tick = wall_clock.tick = true;
> }
>
> static void
> time_timespec__(struct clock *c, struct timespec *ts)
> {
> time_init();
> - for (;;) {
> - /* Use the cached time by preference, but fall through if there's been
> - * a clock tick. */
> - ovs_rwlock_rdlock(&c->rwlock);
> - if (c->stopped || !c->tick) {
> - timespec_add(ts, &c->cache, &c->warp);
> - ovs_rwlock_unlock(&c->rwlock);
> - return;
> - }
> - ovs_rwlock_unlock(&c->rwlock);
>
> - /* Refresh the cache. */
> - ovs_rwlock_wrlock(&c->rwlock);
> - if (c->tick) {
> - c->tick = false;
> - xclock_gettime(c->id, &c->cache);
> - }
> + if (!c->stopped) {
> + xclock_gettime(c->id, ts);
> + } else {
> + ovs_rwlock_rdlock(&c->rwlock);
> + timespec_add(ts, &c->cache, &c->warp);
> ovs_rwlock_unlock(&c->rwlock);
> }
> }
> @@ -268,7 +198,6 @@ time_alarm(unsigned int secs)
>
> assert_single_threaded();
> time_init();
> - time_refresh();
>
> now = time_msec();
> msecs = secs * 1000LL;
> @@ -286,7 +215,7 @@ time_alarm(unsigned int secs)
> * timeout is reached. (Because of this property, this function will
> * never return -EINTR.)
> *
> - * - As a side effect, refreshes the current time (like time_refresh()).
> + * - As a side effect, refreshes the current time.
> *
> * Stores the number of milliseconds elapsed during poll in '*elapsed'. */
> int
> @@ -295,18 +224,14 @@ time_poll(struct pollfd *pollfds, int n_pollfds, long long int timeout_when,
> {
> long long int *last_wakeup = last_wakeup_get();
> long long int start;
> - sigset_t oldsigs;
> - bool blocked;
> int retval;
>
> time_init();
> - time_refresh();
> if (*last_wakeup) {
> log_poll_interval(*last_wakeup);
> }
> coverage_clear();
> start = time_msec();
> - blocked = false;
>
> timeout_when = MIN(timeout_when, deadline);
>
> @@ -327,7 +252,6 @@ time_poll(struct pollfd *pollfds, int n_pollfds, long long int timeout_when,
> retval = -errno;
> }
>
> - time_refresh();
> if (deadline <= time_msec()) {
> fatal_signal_handler(SIGALRM);
> if (retval < 0) {
> @@ -339,14 +263,6 @@ time_poll(struct pollfd *pollfds, int n_pollfds, long long int timeout_when,
> if (retval != -EINTR) {
> break;
> }
> -
> - if (!blocked && CACHE_TIME) {
> - block_sigalrm(&oldsigs);
> - blocked = true;
> - }
> - }
> - if (blocked) {
> - unblock_sigalrm(&oldsigs);
> }
> *last_wakeup = time_msec();
> refresh_rusage();
> @@ -354,27 +270,6 @@ time_poll(struct pollfd *pollfds, int n_pollfds, long long int timeout_when,
> return retval;
> }
>
> -static void
> -sigalrm_handler(int sig_nr OVS_UNUSED)
> -{
> - monotonic_clock.tick = wall_clock.tick = true;
> -}
> -
> -static void
> -block_sigalrm(sigset_t *oldsigs)
> -{
> - sigset_t sigalrm;
> - sigemptyset(&sigalrm);
> - sigaddset(&sigalrm, SIGALRM);
> - xpthread_sigmask(SIG_BLOCK, &sigalrm, oldsigs);
> -}
> -
> -static void
> -unblock_sigalrm(const sigset_t *oldsigs)
> -{
> - xpthread_sigmask(SIG_SETMASK, oldsigs, NULL);
> -}
> -
> long long int
> timespec_to_msec(const struct timespec *ts)
> {
> @@ -570,6 +465,7 @@ timeval_stop_cb(struct unixctl_conn *conn,
> {
> ovs_rwlock_wrlock(&monotonic_clock.rwlock);
> monotonic_clock.stopped = true;
> + xclock_gettime(monotonic_clock.id, &monotonic_clock.cache);
> ovs_rwlock_unlock(&monotonic_clock.rwlock);
>
> unixctl_command_reply(conn, NULL);
> diff --git a/lib/timeval.h b/lib/timeval.h
> index 8dd2e2b..5aea3ac 100644
> --- a/lib/timeval.h
> +++ b/lib/timeval.h
> @@ -40,25 +40,7 @@ BUILD_ASSERT_DECL(TYPE_IS_SIGNED(time_t));
> #define TIME_MAX TYPE_MAXIMUM(time_t)
> #define TIME_MIN TYPE_MINIMUM(time_t)
>
> -/* Interval between updates to the reported time, in ms. This should not be
> - * adjusted much below 10 ms or so with the current implementation, or too
> - * much time will be wasted in signal handlers and calls to clock_gettime(). */
> -#define TIME_UPDATE_INTERVAL 25
> -
> -/* True on systems that support a monotonic clock. Compared to just getting
> - * the value of a variable, clock_gettime() is somewhat expensive, even on
> - * systems that try hard to optimize it (such as x86-64 Linux), so it's
> - * worthwhile to minimize calls via caching. */
> -#ifndef CACHE_TIME
> -#if defined ESX
> -#define CACHE_TIME 0
> -#else
> -#define CACHE_TIME 1
> -#endif
> -#endif /* ifndef CACHE_TIME */
> -
> void time_postfork(void);
> -void time_refresh(void);
> time_t time_now(void);
> time_t time_wall(void);
> long long int time_msec(void);
> diff --git a/m4/openvswitch.m4 b/m4/openvswitch.m4
> index bcdb942..dca6cca 100644
> --- a/m4/openvswitch.m4
> +++ b/m4/openvswitch.m4
> @@ -46,22 +46,6 @@ AC_DEFUN([OVS_CHECK_NDEBUG],
> [ndebug=false])
> AM_CONDITIONAL([NDEBUG], [test x$ndebug = xtrue])])
>
> -dnl Checks for --enable-cache-time and defines CACHE_TIME if it is specified.
> -AC_DEFUN([OVS_CHECK_CACHE_TIME],
> - [AC_ARG_ENABLE(
> - [cache-time],
> - [AC_HELP_STRING([--enable-cache-time],
> - [Override time caching default (for testing only)])],
> - [case "${enableval}" in
> - (yes) cache_time=1;;
> - (no) cache_time=0;;
> - (*) AC_MSG_ERROR([bad value ${enableval} for --enable-cache-time]) ;;
> - esac
> - AC_DEFINE_UNQUOTED([CACHE_TIME], [$cache_time],
> - [Define to 1 to enable time caching, to 0 to disable time caching, or
> - leave undefined to use the default (as one should
> - ordinarily do).])])])
> -
> dnl Checks for ESX.
> AC_DEFUN([OVS_CHECK_ESX],
> [AC_CHECK_HEADER([vmware.h],
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index 820ec34..2df9aba 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -3846,7 +3846,7 @@ subfacet_max_idle(const struct dpif_backer *backer)
> * pass made by update_stats(), because the former function never looks at
> * uninstallable subfacets.
> */
> - enum { BUCKET_WIDTH = ROUND_UP(100, TIME_UPDATE_INTERVAL) };
> + enum { BUCKET_WIDTH = ROUND_UP(100, 25) };
> enum { N_BUCKETS = 5000 / BUCKET_WIDTH };
> int buckets[N_BUCKETS] = { 0 };
> int total, subtotal, bucket;
> diff --git a/tests/automake.mk b/tests/automake.mk
> index f531bf9..60d3640 100644
> --- a/tests/automake.mk
> +++ b/tests/automake.mk
> @@ -32,7 +32,6 @@ TESTSUITE_AT = \
> tests/json.at \
> tests/jsonrpc.at \
> tests/jsonrpc-py.at \
> - tests/timeval.at \
> tests/tunnel.at \
> tests/lockfile.at \
> tests/reconnect.at \
> @@ -122,7 +121,6 @@ valgrind_wrappers = \
> tests/valgrind/test-reconnect \
> tests/valgrind/test-sha1 \
> tests/valgrind/test-stp \
> - tests/valgrind/test-timeval \
> tests/valgrind/test-type-props \
> tests/valgrind/test-unix-socket \
> tests/valgrind/test-uuid \
> @@ -293,10 +291,6 @@ noinst_PROGRAMS += tests/test-sha1
> tests_test_sha1_SOURCES = tests/test-sha1.c
> tests_test_sha1_LDADD = lib/libopenvswitch.a $(SSL_LIBS)
>
> -noinst_PROGRAMS += tests/test-timeval
> -tests_test_timeval_SOURCES = tests/test-timeval.c
> -tests_test_timeval_LDADD = lib/libopenvswitch.a $(SSL_LIBS)
> -
> noinst_PROGRAMS += tests/test-strtok_r
> tests_test_strtok_r_SOURCES = tests/test-strtok_r.c
>
> diff --git a/tests/learn.at b/tests/learn.at
> index 62fc9eb..f99cc3a 100644
> --- a/tests/learn.at
> +++ b/tests/learn.at
> @@ -285,6 +285,7 @@ AT_SETUP([learning action - self-modifying flow])
> OVS_VSWITCHD_START
> ADD_OF_PORTS([br0], 1, 2, 3)
>
> +ovs-appctl time/stop
> # Set up flow table for TCPv4 port learning.
> AT_CHECK([[ovs-ofctl add-flow br0 'actions=load:3->NXM_NX_REG0[0..15],learn(table=0,priority=65535,NXM_OF_ETH_SRC[],NXM_OF_VLAN_TCI[0..11],output:NXM_NX_REG0[0..15]),output:2']])
>
> diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
> index 7f01a2d..f67c3ab 100644
> --- a/tests/ofproto-dpif.at
> +++ b/tests/ofproto-dpif.at
> @@ -645,6 +645,7 @@ NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6
> udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 udp_csum:43a1
> ])
>
> +ovs-appctl time/stop
> AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
>
> dnl Checksum SCTP.
> @@ -1841,6 +1842,7 @@ AT_SETUP([ofproto-dpif - NetFlow flow expiration])
> OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
> ADD_OF_PORTS([br0], 1, 2)
>
> +ovs-appctl time/stop
> ON_EXIT([kill `cat test-netflow.pid`])
> AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
> AT_CAPTURE_FILE([netflow.log])
> @@ -1996,6 +1998,7 @@ get_ages () {
> AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
> get_ages duration1 hard1 idle1
>
> +ovs-appctl time/stop
> # Warp time forward by 10 seconds, then modify the flow's actions.
> ovs-appctl time/warp 10000
> get_ages duration2 hard2 idle2
> @@ -2059,6 +2062,8 @@ AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
> [NXST_FLOW reply:
> idle_timeout=60, actions=fin_timeout(idle_timeout=5)
> ])
> +
> +ovs-appctl time/stop
> # Check that a TCP SYN packet does not change the timeout. (Because
> # flow stats updates are mainly what implements the fin_timeout
> # feature, we warp forward a couple of times to ensure that flow stats
> @@ -2263,6 +2268,7 @@ AT_SETUP([ofproto-dpif - port duration])
> OVS_VSWITCHD_START([set Bridge br0 protocols=OpenFlow13])
> ADD_OF_PORTS([br0], 1, 2)
>
> +ovs-appctl time/stop
> ovs-appctl time/warp 10000
>
> AT_CHECK([ovs-ofctl -O openflow13 dump-ports br0], [0], [stdout])
> @@ -2474,6 +2480,7 @@ AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
> ADD_OF_PORTS([br0], [7])
> AT_CHECK([ovs-ofctl add-flow br0 action=normal])
> AT_CHECK([ovs-ofctl add-flow br1 action=normal])
> +ovs-appctl time/stop
> ovs-appctl time/warp 5000
> AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
> AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
> @@ -2619,6 +2626,7 @@ AT_DATA([flows.txt], [dnl
> table=0 in_port=1 actions=load:2->NXM_NX_REG0[[0..15]],learn(table=1,priority=65535,NXM_OF_ETH_SRC[[]],NXM_OF_VLAN_TCI[[0..11]],output:NXM_NX_REG0[[0..15]]),output:2
> ])
> AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
> +ovs-appctl time/stop
> # We send each packet twice because the first packet in each flow causes the
> # flow table to change and thus revalidations, which (depending on timing)
> # can keep a megaflow from being installed. The revalidations are done by
> diff --git a/tests/test-timeval.c b/tests/test-timeval.c
> deleted file mode 100644
> index 9896cf7..0000000
> --- a/tests/test-timeval.c
> +++ /dev/null
> @@ -1,145 +0,0 @@
> -/*
> - * Copyright (c) 2009, 2010, 2011 Nicira, Inc.
> - *
> - * Licensed under the Apache License, Version 2.0 (the "License");
> - * you may not use this file except in compliance with the License.
> - * You may obtain a copy of the License at:
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> - */
> -
> -#include <config.h>
> -
> -#include "timeval.h"
> -
> -#include <errno.h>
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <sys/time.h>
> -#include <sys/types.h>
> -#include <unistd.h>
> -
> -#include "command-line.h"
> -#include "daemon.h"
> -#include "util.h"
> -
> -#undef NDEBUG
> -#include <assert.h>
> -
> -static long long int
> -gettimeofday_in_msec(void)
> -{
> - struct timeval tv;
> -
> - xgettimeofday(&tv);
> - return timeval_to_msec(&tv);
> -}
> -
> -static void
> -do_test(void)
> -{
> - /* Wait until we are awakened by a signal (typically EINTR due to the
> - * setitimer()). Then ensure that, if time has really advanced by
> - * TIME_UPDATE_INTERVAL, then time_msec() reports that it advanced.
> - */
> - long long int start_time_msec, start_time_wall;
> - long long int start_gtod;
> -
> - start_time_msec = time_msec();
> - start_time_wall = time_wall_msec();
> - start_gtod = gettimeofday_in_msec();
> - for (;;) {
> - /* Wait up to 1 second. Using select() to do the timeout avoids
> - * interfering with the interval timer. */
> - struct timeval timeout;
> - int retval;
> -
> - timeout.tv_sec = 1;
> - timeout.tv_usec = 0;
> - retval = select(0, NULL, NULL, NULL, &timeout);
> - if (retval != -1) {
> - ovs_fatal(0, "select returned %d", retval);
> - } else if (errno != EINTR) {
> - ovs_fatal(errno, "select reported unexpected error");
> - }
> -
> - if (gettimeofday_in_msec() - start_gtod >= TIME_UPDATE_INTERVAL) {
> - /* gettimeofday() and time_msec() have different granularities in
> - * their time sources. Depending on the rounding used this could
> - * result in a slight difference, so we allow for 1 ms of slop. */
> - assert(time_msec() - start_time_msec >= TIME_UPDATE_INTERVAL - 1);
> - assert(time_wall_msec() - start_time_wall >=
> - TIME_UPDATE_INTERVAL - 1);
> - break;
> - }
> - }
> -}
> -
> -static void
> -usage(void)
> -{
> - ovs_fatal(0, "usage: %s TEST, where TEST is \"plain\" or \"daemon\"",
> - program_name);
> -}
> -
> -int
> -main(int argc, char *argv[])
> -{
> - proctitle_init(argc, argv);
> - set_program_name(argv[0]);
> -
> - if (argc != 2) {
> - usage();
> - } else if (!strcmp(argv[1], "plain")) {
> - /* If we're not caching time there isn't much to test and SIGALRM won't
> - * be around to pull us out of the select() call, so just skip out */
> - if (!CACHE_TIME) {
> - exit (77);
> - }
> -
> - do_test();
> - } else if (!strcmp(argv[1], "daemon")) {
> - /* Test that time still advances even in a daemon. This is an
> - * interesting test because fork() cancels the interval timer. */
> - char cwd[1024], *pidfile;
> - FILE *success;
> -
> - if (!CACHE_TIME) {
> - exit (77);
> - }
> -
> - assert(getcwd(cwd, sizeof cwd) == cwd);
> -
> - unlink("test-timeval.success");
> -
> - /* Daemonize, with a pidfile in the current directory. */
> - set_detach();
> - pidfile = xasprintf("%s/test-timeval.pid", cwd);
> - set_pidfile(pidfile);
> - free(pidfile);
> - set_no_chdir();
> - daemonize();
> -
> - /* Run the test. */
> - do_test();
> -
> - /* Report success by writing out a file, since the ultimate invoker of
> - * test-timeval can't wait on the daemonized process. */
> - success = fopen("test-timeval.success", "w");
> - if (!success) {
> - ovs_fatal(errno, "test-timeval.success: create failed");
> - }
> - fprintf(success, "success\n");
> - fclose(success);
> - } else {
> - usage();
> - }
> -
> - return 0;
> -}
> diff --git a/tests/testsuite.at b/tests/testsuite.at
> index c9bcad9..43efc09 100644
> --- a/tests/testsuite.at
> +++ b/tests/testsuite.at
> @@ -92,7 +92,6 @@ m4_include([tests/uuid.at])
> m4_include([tests/json.at])
> m4_include([tests/jsonrpc.at])
> m4_include([tests/jsonrpc-py.at])
> -m4_include([tests/timeval.at])
> m4_include([tests/tunnel.at])
> m4_include([tests/lockfile.at])
> m4_include([tests/reconnect.at])
> diff --git a/tests/timeval.at b/tests/timeval.at
> deleted file mode 100644
> index 0d61bff..0000000
> --- a/tests/timeval.at
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -AT_BANNER([timeval unit tests])
> -
> -AT_SETUP([check that time advances])
> -AT_KEYWORDS([timeval])
> -AT_CHECK([test-timeval plain], [0])
> -AT_CLEANUP
> -
> -AT_SETUP([check that time advances after daemonize()])
> -AT_KEYWORDS([timeval])
> -AT_CHECK([test-timeval daemon], [0])
> -AT_CHECK(
> - [# First try a quick sleep, so that the test completes very quickly
> - # in the normal case. POSIX doesn't require fractional times to
> - # work, so this might not work.
> - sleep 0.1; if test -e test-timeval.success; then echo success; exit 0; fi
> - # Then wait up to 2 seconds.
> - sleep 1; if test -e test-timeval.success; then echo success; exit 0; fi
> - sleep 1; if test -e test-timeval.success; then echo success; exit 0; fi
> - echo failure; exit 1],
> - [0], [success
> -], [])
> -AT_CLEANUP
> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> index f993ba1..5e54e0b 100644
> --- a/vswitchd/bridge.c
> +++ b/vswitchd/bridge.c
> @@ -548,7 +548,6 @@ bridge_reconfigure_ofp(void)
> long long int deadline;
> struct bridge *br;
>
> - time_refresh();
> deadline = time_msec() + OFP_PORT_ACTION_WINDOW;
>
> /* The kernel will reject any attempt to add a given port to a datapath if
> @@ -567,7 +566,6 @@ bridge_reconfigure_ofp(void)
> list_remove(&garbage->list_node);
> free(garbage);
>
> - time_refresh();
> if (time_msec() >= deadline) {
> return false;
> }
> @@ -580,7 +578,6 @@ bridge_reconfigure_ofp(void)
>
> HMAP_FOR_EACH_SAFE (if_cfg, next, hmap_node, &br->if_cfg_todo) {
> iface_create(br, if_cfg, OFPP_NONE);
> - time_refresh();
> if (time_msec() >= deadline) {
> return false;
> }
> --
> 1.7.9.5
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
More information about the dev
mailing list