The following changes since commit 83761b9244ad2ed39d3cfabe8a0e901ab906f7bf:
Merge remote-tracking branch 'remotes/riku/tags/pull-linux-user-20150127' into staging (2015-01-27 22:25:56 +0000) are available in the git repository at: git://github.com/bonzini/qemu.git tags/for-upstream for you to fetch changes up to 42b5c7a09801805278e5ac40c0ccaf137981ecb6: configure: Default to enable module build (2015-02-02 16:55:11 +0100) ---------------------------------------------------------------- The important bits here are the first part of RCU and enabling modules by default. They have been tested with Travis for a few days now, and things seem okay. v1->v2 changes are the new qemu-thread patch to fix Mac OS X, and cleaning up warnings. ---------------------------------------------------------------- Fam Zheng (2): scsi: Fix scsi_req_cancel_async for no aiocb req configure: Default to enable module build Jan Kiszka (1): memory: remove assertion on memory_region_destroy Paolo Bonzini (9): qemu-thread: fix qemu_event without futexes rcu: add rcu library rcu: add rcutorture rcu: allow nesting of rcu_read_lock/rcu_read_unlock rcu: add call_rcu memory: protect current_map by RCU memory: avoid ref/unref in memory_region_find cpu-exec: simplify align_clocks cpu-exec: simplify init_delay_params .travis.yml | 2 +- configure | 95 +++++++--- cpu-exec.c | 9 +- cpus.c | 17 -- docs/rcu.txt | 387 +++++++++++++++++++++++++++++++++++++++ hw/9pfs/virtio-9p-synth.c | 1 + hw/scsi/scsi-bus.c | 2 + include/exec/memory.h | 5 + include/qemu/atomic.h | 61 +++++++ include/qemu/queue.h | 13 ++ include/qemu/rcu.h | 147 +++++++++++++++ include/qemu/thread.h | 3 - include/qemu/timer.h | 1 - memory.c | 65 +++---- tests/Makefile | 7 +- tests/rcutorture.c | 451 ++++++++++++++++++++++++++++++++++++++++++++++ util/Makefile.objs | 1 + util/qemu-thread-posix.c | 2 + util/rcu.c | 291 ++++++++++++++++++++++++++++++ 19 files changed, 1465 insertions(+), 95 deletions(-) create mode 100644 docs/rcu.txt create mode 100644 include/qemu/rcu.h create mode 100644 tests/rcutorture.c create mode 100644 util/rcu.c -- 1.8.3.1 diff --git a/configure b/configure index 2c3a444..a9ae57a 100755 --- a/configure +++ b/configure @@ -2733,8 +2733,8 @@ fi glib_pkg_config() { if $pkg_config --atleast-version=$glib_req_ver $1; then - local probe_cflags=$($pkg_config --cflags $1) - local probe_libs=$($pkg_config --libs $1) + local probe_cflags="$($pkg_config --cflags $1)" + local probe_libs="$($pkg_config --libs $1)" CFLAGS="$probe_cflags $CFLAGS" LIBS="$probe_libs $LIBS" libs_qga="$probe_libs $libs_qga" diff --git a/tests/rcutorture.c b/tests/rcutorture.c index 93ec1b3..60a2ccf 100644 --- a/tests/rcutorture.c +++ b/tests/rcutorture.c @@ -168,7 +168,7 @@ static void perftestrun(int nthreads, int duration, int nreaders, int nupdaters) g_usleep(1000); } goflag = GOFLAG_RUN; - sleep(duration); + g_usleep(duration * G_USEC_PER_SEC); goflag = GOFLAG_STOP; wait_all_threads(); printf("n_reads: %lld n_updates: %ld nreaders: %d nupdaters: %d duration: %d\n", @@ -241,7 +241,7 @@ static void *rcu_read_stress_test(void *arg) struct rcu_stress *p; int pc; long long n_reads_local = 0; - volatile int garbage; + volatile int garbage = 0; rcu_register_thread(); @@ -300,10 +300,11 @@ static void *rcu_update_stress_test(void *arg) p->mbtest = 1; atomic_rcu_set(&rcu_stress_current, p); rcu_stress_idx = i; - for (i = 0; i < RCU_STRESS_PIPE_LEN; i++) + for (i = 0; i < RCU_STRESS_PIPE_LEN; i++) { if (i != rcu_stress_idx) { rcu_stress_array[i].pipe_count++; } + } synchronize_rcu(); n_updates++; } @@ -344,7 +345,7 @@ static void stresstest(int nreaders, int duration) create_thread(rcu_fake_update_stress_test); } goflag = GOFLAG_RUN; - sleep(duration); + g_usleep(duration * G_USEC_PER_SEC); goflag = GOFLAG_STOP; wait_all_threads(); printf("n_reads: %lld n_updates: %ld n_mberror: %d\n", @@ -374,7 +375,7 @@ static void gtest_stress(int nreaders, int duration) create_thread(rcu_fake_update_stress_test); } goflag = GOFLAG_RUN; - sleep(duration); + g_usleep(duration * G_USEC_PER_SEC); goflag = GOFLAG_STOP; wait_all_threads(); g_assert_cmpint(n_mberror, ==, 0); diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c index 41cb23d..50a29d8 100644 --- a/util/qemu-thread-posix.c +++ b/util/qemu-thread-posix.c @@ -307,11 +307,13 @@ static inline void futex_wait(QemuEvent *ev, unsigned val) #else static inline void futex_wake(QemuEvent *ev, int n) { + pthread_mutex_lock(&ev->lock); if (n == 1) { pthread_cond_signal(&ev->cond); } else { pthread_cond_broadcast(&ev->cond); } + pthread_mutex_unlock(&ev->lock); } static inline void futex_wait(QemuEvent *ev, unsigned val)