public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] Fix robust mutex daedlock [BZ #20263]
@ 2016-06-23 19:26 Jiyoung Yun
  2016-06-28  8:12 ` Torvald Riegel
  0 siblings, 1 reply; 4+ messages in thread
From: Jiyoung Yun @ 2016-06-23 19:26 UTC (permalink / raw)
  To: libc-alpha; +Cc: jy910.yun, Jiyoung Yun

In Linux/ARM environment, a robust mutex can't catch the timeout result
when it is already owned by other thread and requests to try lock with
a specific time value(pthread_mutex_timedlock). The futex already returns
the ETIMEDOUT result but there is no check the return value and it makes
a deadlock.

* nptl/lowlevelrobustlock.c: Implement ETIMEDOUT logic.

Signed-off-by: Jiyoung Yun <t2wish@gmail.com>
---
 ChangeLog                 | 5 +++++
 nptl/lowlevelrobustlock.c | 9 +++++++--
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 4bfee94..7b95767 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2016-06-24  Jiyoung Yun  <t2wish@gmail.com>
+
+	[BZ #20263]
+	* nptl/lowlevelrobustlock.c: Implement ETIMEDOUT logic.
+
 2016-06-23  Florian Weimer  <fweimer@redhat.com>
 
 	* test-skeleton.c (xrealloc): Support deallocation with n == 0.
diff --git a/nptl/lowlevelrobustlock.c b/nptl/lowlevelrobustlock.c
index 3b988b2..8842032 100644
--- a/nptl/lowlevelrobustlock.c
+++ b/nptl/lowlevelrobustlock.c
@@ -113,15 +113,20 @@ __lll_robust_timedlock_wait (int *futex, const struct timespec *abstime,
 	  && atomic_compare_and_exchange_bool_acq (futex, newval, oldval))
 	continue;
 
+      int err;
       /* If *futex == 2, wait until woken or timeout.  */
 #if (!defined __ASSUME_FUTEX_CLOCK_REALTIME \
      || !defined lll_futex_timed_wait_bitset)
-      lll_futex_timed_wait (futex, newval, &rt, private);
+      err = lll_futex_timed_wait (futex, newval, &rt, private);
 #else
-      lll_futex_timed_wait_bitset (futex, newval, abstime,
+      err = lll_futex_timed_wait_bitset (futex, newval, abstime,
 				   FUTEX_CLOCK_REALTIME, private);
 #endif
 
+      /* the futex call time out */
+      if (err == -ETIMEDOUT)
+         return ETIMEDOUT;
+
     try:
       ;
     }
-- 
1.9.1

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Fix robust mutex daedlock [BZ #20263]
  2016-06-23 19:26 [PATCH] Fix robust mutex daedlock [BZ #20263] Jiyoung Yun
@ 2016-06-28  8:12 ` Torvald Riegel
  0 siblings, 0 replies; 4+ messages in thread
From: Torvald Riegel @ 2016-06-28  8:12 UTC (permalink / raw)
  To: Jiyoung Yun; +Cc: libc-alpha, jy910.yun, Andreas Schwab

On Fri, 2016-06-24 at 04:26 +0900, Jiyoung Yun wrote:
> In Linux/ARM environment, a robust mutex can't catch the timeout result
> when it is already owned by other thread and requests to try lock with
> a specific time value(pthread_mutex_timedlock). The futex already returns
> the ETIMEDOUT result but there is no check the return value and it makes
> a deadlock.
> 
> * nptl/lowlevelrobustlock.c: Implement ETIMEDOUT logic.

This touches the same code Andreas Schwab had a patch for (but which
touches the other part of the preprocessor conditional).  Can the two of
you create one patch that fixes this bug?

> Signed-off-by: Jiyoung Yun <t2wish@gmail.com>
> ---
>  ChangeLog                 | 5 +++++
>  nptl/lowlevelrobustlock.c | 9 +++++++--
>  2 files changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/ChangeLog b/ChangeLog
> index 4bfee94..7b95767 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,8 @@
> +2016-06-24  Jiyoung Yun  <t2wish@gmail.com>
> +
> +	[BZ #20263]
> +	* nptl/lowlevelrobustlock.c: Implement ETIMEDOUT logic.
> +
>  2016-06-23  Florian Weimer  <fweimer@redhat.com>
>  
>  	* test-skeleton.c (xrealloc): Support deallocation with n == 0.
> diff --git a/nptl/lowlevelrobustlock.c b/nptl/lowlevelrobustlock.c
> index 3b988b2..8842032 100644
> --- a/nptl/lowlevelrobustlock.c
> +++ b/nptl/lowlevelrobustlock.c
> @@ -113,15 +113,20 @@ __lll_robust_timedlock_wait (int *futex, const struct timespec *abstime,
>  	  && atomic_compare_and_exchange_bool_acq (futex, newval, oldval))
>  	continue;
>  
> +      int err;
>        /* If *futex == 2, wait until woken or timeout.  */
>  #if (!defined __ASSUME_FUTEX_CLOCK_REALTIME \
>       || !defined lll_futex_timed_wait_bitset)
> -      lll_futex_timed_wait (futex, newval, &rt, private);
> +      err = lll_futex_timed_wait (futex, newval, &rt, private);
>  #else
> -      lll_futex_timed_wait_bitset (futex, newval, abstime,
> +      err = lll_futex_timed_wait_bitset (futex, newval, abstime,
>  				   FUTEX_CLOCK_REALTIME, private);
>  #endif
>  
> +      /* the futex call time out */
> +      if (err == -ETIMEDOUT)
> +         return ETIMEDOUT;
> +
>      try:
>        ;
>      }



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Fix robust mutex daedlock [BZ #20263]
  2016-06-29 16:15 ` [PATCH] " Jiyoung Yun
@ 2016-07-07 12:35   ` Andreas Schwab
  0 siblings, 0 replies; 4+ messages in thread
From: Andreas Schwab @ 2016-07-07 12:35 UTC (permalink / raw)
  To: Jiyoung Yun; +Cc: libc-alpha, jy910.yun

I have installed that now.

Andreas.

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH] Fix robust mutex daedlock [BZ #20263]
  2016-06-29 15:03 [PATCH v2 1/2] " Jiyoung Yun
@ 2016-06-29 16:15 ` Jiyoung Yun
  2016-07-07 12:35   ` Andreas Schwab
  0 siblings, 1 reply; 4+ messages in thread
From: Jiyoung Yun @ 2016-06-29 16:15 UTC (permalink / raw)
  To: libc-alpha; +Cc: jy910.yun, Jiyoung Yun

In Linux/ARM environment, a robust mutex can't catch the timeout result
when it is already owned by other thread and requests to try lock with
a specific time value(pthread_mutex_timedlock). The futex already returns
the ETIMEDOUT result but there is no check the return value and it makes
a deadlock.

* nptl/lowlevelrobustlock.c: Implement ETIMEDOUT logic.
---
 ChangeLog                 | 5 +++++
 nptl/lowlevelrobustlock.c | 5 ++++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index 3da2eca..97461f6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2016-06-28  Jiyoung Yun  <t2wish@gmail.com>
+
+	[BZ #20263]
+	* nptl/lowlevelrobustlock.c: Implement ETIMEDOUT logic.
+
 2016-06-28  Richard Henderson  <rth@redhat.com>
 
 	* elf/elf.h (EM_BPF): New.
diff --git a/nptl/lowlevelrobustlock.c b/nptl/lowlevelrobustlock.c
index 3b988b2..43caae7 100644
--- a/nptl/lowlevelrobustlock.c
+++ b/nptl/lowlevelrobustlock.c
@@ -118,8 +118,11 @@ __lll_robust_timedlock_wait (int *futex, const struct timespec *abstime,
      || !defined lll_futex_timed_wait_bitset)
       lll_futex_timed_wait (futex, newval, &rt, private);
 #else
-      lll_futex_timed_wait_bitset (futex, newval, abstime,
+      int err = lll_futex_timed_wait_bitset (futex, newval, abstime,
 				   FUTEX_CLOCK_REALTIME, private);
+      /* the futex call time out */
+      if (err == -ETIMEDOUT)
+         return -err;
 #endif
 
     try:
-- 
1.9.1

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-07-07 12:35 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-23 19:26 [PATCH] Fix robust mutex daedlock [BZ #20263] Jiyoung Yun
2016-06-28  8:12 ` Torvald Riegel
2016-06-29 15:03 [PATCH v2 1/2] " Jiyoung Yun
2016-06-29 16:15 ` [PATCH] " Jiyoung Yun
2016-07-07 12:35   ` Andreas Schwab

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).