[PATCH][BZ #14652] Adjust mutex lock in condvar_cleanup if we got it from requeue_pi
Jeff Law
law@redhat.com
Mon Oct 15 21:02:00 GMT 2012
On 10/12/2012 06:17 AM, Siddhesh Poyarekar wrote:
> Hi,
>
> I had committed a fix for BZ #14652, which I now realize is
> incomplete. This patch completes the fix. Details below:
>
> A process with waiters and signallers on a condvar with a PI mutex
> could hang in a deadlock when a waiter is cancelled just as it returns
> from its futex call with the PI mutex held. The cancellation cleanup
> handler tries to lock the mutex again and hence ends in a deadlock. My
> earlier patch checked whether we already own the mutex and only call
> the lock if needed.
>
> The lock acquired by the FUTEX_WAIT_REQUEUE_PI however only sets the
> owning TID in the lock value (mutex->__data.__lock) and as such, the
> rest of the mutex data structure is inconsistent. The regular flow of
> pthread_cond_*wait calls pthread_mutex_cond_lock_adjust to make the
> data structure consistent once again. The attached patch does exactly
> this.
>
> Not having this fix results in failure of the unlock operation using
> pthread_mutex_unlock with EPERM since the __user field of the mutex is
> not set. This failure can theoretically be seen with tst-cond25, but
> it is extremely rare. Adding PTHREAD_MUTEX_RECURSIVE to the mix
> increases the chances somewhat, but not by much.
>
> Tested on x86_64 and i686. OK to commit?
>
> Regards,
> Siddhesh
>
> nptl/ChangeLog:
>
> [BZ #14652]
> * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
> (__condvar_tw_cleanup): Adjust the mutex data structure if it
> was locked by FUTEX_WAIT_REQUEUE_PI.
> * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait
> (__condvar_w_cleanup): Likewise.
> * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
> (__condvar_cleanup2): Likewise.
> * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
> (__condvar_cleanup1): Likewise.
OK. Please install.
Thanks,
Jeff
More information about the Libc-alpha
mailing list