[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [qemu-upstream-unstable] qemu-thread: fix qemu_event without futexes



commit a9eb2b60538e2cb48cc71824d2c6239a8aa85cb8
Author:     Paolo Bonzini <pbonzini@xxxxxxxxxx>
AuthorDate: Mon Feb 2 16:36:51 2015 +0100
Commit:     Michael Roth <mdroth@xxxxxxxxxxxxxxxxxx>
CommitDate: Mon Feb 23 18:04:34 2015 -0600

    qemu-thread: fix qemu_event without futexes
    
    This had a possible deadlock that was visible with rcutorture.
    
        qemu_event_set                    qemu_event_wait
        ----------------------------------------------------------------
                                          cmpxchg reads FREE, writes BUSY
                                          futex_wait: pthread_mutex_lock
                                          futex_wait: value == BUSY
        xchg reads BUSY, writes SET
        futex_wake: pthread_cond_broadcast
                                          futex_wait: pthread_cond_wait
                                          <deadlock>
    
    The fix is simply to avoid condvar tricks and do the obvious locking
    around pthread_cond_broadcast:
    
        qemu_event_set        qemu_event_wait
        ----------------------------------------------------------------
                                          cmpxchg reads FREE, writes BUSY
                                          futex_wait: pthread_mutex_lock
                                          futex_wait: value == BUSY
        xchg reads BUSY, writes SET
        futex_wake: pthread_mutex_lock
        (blocks)
                                          futex_wait: pthread_cond_wait
        (mutex unlocked)
        futex_wake: pthread_cond_broadcast
        futex_wake: pthread_mutex_unlock
                                          futex_wait: pthread_mutex_unlock
    
    Cc: qemu-stable@xxxxxxxxxx
    Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
    (cherry picked from commit 158ef8cbb7e0fe8bb430310924b8bebe5f186e6e)
    Signed-off-by: Michael Roth <mdroth@xxxxxxxxxxxxxxxxxx>
---
 util/qemu-thread-posix.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c
index d05a649..bb14ad4 100644
--- a/util/qemu-thread-posix.c
+++ b/util/qemu-thread-posix.c
@@ -306,11 +306,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)
--
generated by git-patchbot for /home/xen/git/qemu-upstream-unstable.git

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.