Message ID | 1372841894-10634-1-git-send-email-tsutsui@ceres.dti.ne.jp |
---|---|
State | New |
Headers | show |
On 07/03/13 10:58, Izumi Tsutsui wrote: > Fix following bugs in "fallback implementation of counting semaphores > with mutex+condvar" added in c166cb72f1676855816340666c3b618beef4b976: > - waiting threads are not restarted properly if more than one threads > are waiting unblock signals in qemu_sem_timedwait() > - possible missing pthread_cond_signal(3) calls when waiting threads > are returned by ETIMEDOUT > - fix an uninitialized variable > The problem is analyzed by and fix is provided by Noriyuki Soda. > > Also put additional cleanup suggested by Laszlo Ersek: > - make QemuSemaphore.count unsigned (it won't be negative) > - check a return value of in pthread_cond_wait() in qemu_sem_wait() > > Signed-off-by: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp> > Reviewed-by: Laszlo Ersek <lersek@redhat.com> > --- > > v3: > - fix a missed assignment and actually check a retval of pthread_cond_wait() Compared v3 against v2. Reviewed-by: Laszlo Ersek <lersek@redhat.com> Laszlo
On 03/07/13 5:41 AM, Laszlo Ersek wrote: > On 07/03/13 10:58, Izumi Tsutsui wrote: >> Fix following bugs in "fallback implementation of counting semaphores >> with mutex+condvar" added in c166cb72f1676855816340666c3b618beef4b976: >> - waiting threads are not restarted properly if more than one threads >> are waiting unblock signals in qemu_sem_timedwait() >> - possible missing pthread_cond_signal(3) calls when waiting threads >> are returned by ETIMEDOUT >> - fix an uninitialized variable >> The problem is analyzed by and fix is provided by Noriyuki Soda. >> >> Also put additional cleanup suggested by Laszlo Ersek: >> - make QemuSemaphore.count unsigned (it won't be negative) >> - check a return value of in pthread_cond_wait() in qemu_sem_wait() >> >> Signed-off-by: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp> >> Reviewed-by: Laszlo Ersek <lersek@redhat.com> >> --- >> >> v3: >> - fix a missed assignment and actually check a retval of pthread_cond_wait() > > Compared v3 against v2. > > Reviewed-by: Laszlo Ersek <lersek@redhat.com> > > Laszlo This patch seems to have been dropped.
On 08/01/2013 05:24 AM, Brad wrote: > On 03/07/13 5:41 AM, Laszlo Ersek wrote: >> On 07/03/13 10:58, Izumi Tsutsui wrote: >>> Fix following bugs in "fallback implementation of counting semaphores >>> with mutex+condvar" added in c166cb72f1676855816340666c3b618beef4b976: >>> - waiting threads are not restarted properly if more than one threads >>> are waiting unblock signals in qemu_sem_timedwait() >>> - possible missing pthread_cond_signal(3) calls when waiting threads >>> are returned by ETIMEDOUT >>> - fix an uninitialized variable >>> The problem is analyzed by and fix is provided by Noriyuki Soda. >>> >>> Also put additional cleanup suggested by Laszlo Ersek: >>> - make QemuSemaphore.count unsigned (it won't be negative) >>> - check a return value of in pthread_cond_wait() in qemu_sem_wait() >>> >>> Signed-off-by: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp> >>> Reviewed-by: Laszlo Ersek <lersek@redhat.com> >>> --- >>> >>> v3: >>> - fix a missed assignment and actually check a retval of >>> pthread_cond_wait() >> >> Compared v3 against v2. >> >> Reviewed-by: Laszlo Ersek <lersek@redhat.com> >> >> Laszlo > > This patch seems to have been dropped. CCing Anthony and qemu-stable. Paolo
On 08/02/2013 12:33 AM, Paolo Bonzini wrote: > On 08/01/2013 05:24 AM, Brad wrote: >> On 03/07/13 5:41 AM, Laszlo Ersek wrote: >>> On 07/03/13 10:58, Izumi Tsutsui wrote: >>>> Fix following bugs in "fallback implementation of counting semaphores >>>> with mutex+condvar" added in c166cb72f1676855816340666c3b618beef4b976: >>>> - waiting threads are not restarted properly if more than one threads >>>> are waiting unblock signals in qemu_sem_timedwait() >>>> - possible missing pthread_cond_signal(3) calls when waiting threads >>>> are returned by ETIMEDOUT >>>> - fix an uninitialized variable >>>> The problem is analyzed by and fix is provided by Noriyuki Soda. >>>> >>>> Also put additional cleanup suggested by Laszlo Ersek: >>>> - make QemuSemaphore.count unsigned (it won't be negative) >>>> - check a return value of in pthread_cond_wait() in qemu_sem_wait() >>>> >>>> Signed-off-by: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp> >>>> Reviewed-by: Laszlo Ersek <lersek@redhat.com> >>>> --- >>>> >>>> v3: >>>> - fix a missed assignment and actually check a retval of >>>> pthread_cond_wait() >>> >>> Compared v3 against v2. >>> >>> Reviewed-by: Laszlo Ersek <lersek@redhat.com> >>> >>> Laszlo >> >> This patch seems to have been dropped. > > CCing Anthony and qemu-stable. And bumping priority further. Paolo
Applied. Thanks. Regards, Anthony Liguori
diff --git a/include/qemu/thread-posix.h b/include/qemu/thread-posix.h index 0f30dcc..361566a 100644 --- a/include/qemu/thread-posix.h +++ b/include/qemu/thread-posix.h @@ -15,7 +15,7 @@ struct QemuSemaphore { #if defined(__APPLE__) || defined(__NetBSD__) pthread_mutex_t lock; pthread_cond_t cond; - int count; + unsigned int count; #else sem_t sem; #endif diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c index 4489abf..4de133e 100644 --- a/util/qemu-thread-posix.c +++ b/util/qemu-thread-posix.c @@ -170,12 +170,11 @@ void qemu_sem_post(QemuSemaphore *sem) #if defined(__APPLE__) || defined(__NetBSD__) pthread_mutex_lock(&sem->lock); - if (sem->count == INT_MAX) { + if (sem->count == UINT_MAX) { rc = EINVAL; - } else if (sem->count++ < 0) { - rc = pthread_cond_signal(&sem->cond); } else { - rc = 0; + sem->count++; + rc = pthread_cond_signal(&sem->cond); } pthread_mutex_unlock(&sem->lock); if (rc != 0) { @@ -207,19 +206,21 @@ int qemu_sem_timedwait(QemuSemaphore *sem, int ms) struct timespec ts; #if defined(__APPLE__) || defined(__NetBSD__) + rc = 0; compute_abs_deadline(&ts, ms); pthread_mutex_lock(&sem->lock); - --sem->count; - while (sem->count < 0) { + while (sem->count == 0) { rc = pthread_cond_timedwait(&sem->cond, &sem->lock, &ts); if (rc == ETIMEDOUT) { - ++sem->count; break; } if (rc != 0) { error_exit(rc, __func__); } } + if (rc != ETIMEDOUT) { + --sem->count; + } pthread_mutex_unlock(&sem->lock); return (rc == ETIMEDOUT ? -1 : 0); #else @@ -249,16 +250,19 @@ int qemu_sem_timedwait(QemuSemaphore *sem, int ms) void qemu_sem_wait(QemuSemaphore *sem) { + int rc; + #if defined(__APPLE__) || defined(__NetBSD__) pthread_mutex_lock(&sem->lock); - --sem->count; - while (sem->count < 0) { - pthread_cond_wait(&sem->cond, &sem->lock); + while (sem->count == 0) { + rc = pthread_cond_wait(&sem->cond, &sem->lock); + if (rc != 0) { + error_exit(rc, __func__); + } } + --sem->count; pthread_mutex_unlock(&sem->lock); #else - int rc; - do { rc = sem_wait(&sem->sem); } while (rc == -1 && errno == EINTR);