public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 1/3] nptl: futex: Move __NR_futex_time64 alias to beginning of futex-internal.h
@ 2020-09-15 13:29 Lukasz Majewski
  2020-09-15 13:29 ` [PATCH 2/3] Y2038: nptl: Provide futex_abstimed_wait64 supporting 64 bit time Lukasz Majewski
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Lukasz Majewski @ 2020-09-15 13:29 UTC (permalink / raw)
  To: Joseph Myers, Paul Eggert, Adhemerval Zanella
  Cc: Alistair Francis, Arnd Bergmann, Alistair Francis, GNU C Library,
	Florian Weimer, Carlos O'Donell, Stepan Golosunov,
	Andreas Schwab, Zack Weinberg, Jeff Law, Lukasz Majewski

This alias macro shall be moved to the beginning of the futex-internal.h
to be easily reused by other functions, which would support 64 bit time.
---
 sysdeps/nptl/futex-internal.h | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/sysdeps/nptl/futex-internal.h b/sysdeps/nptl/futex-internal.h
index 84ab3f3853..7f3910ad98 100644
--- a/sysdeps/nptl/futex-internal.h
+++ b/sysdeps/nptl/futex-internal.h
@@ -74,6 +74,10 @@
 # error FUTEX_PRIVATE must be equal to 0
 #endif
 
+#ifndef __NR_futex_time64
+# define __NR_futex_time64 __NR_futex
+#endif
+
 /* Calls __libc_fatal with an error message.  Convenience function for
    concrete implementations of the futex interface.  */
 static __always_inline __attribute__ ((__noreturn__)) void
@@ -467,10 +471,6 @@ futex_unlock_pi (unsigned int *futex_word, int private)
     }
 }
 
-#ifndef __NR_futex_time64
-# define __NR_futex_time64 __NR_futex
-#endif
-
 static __always_inline int
 futex_timed_wait_cancel64 (pid_t *tidp,  pid_t tid,
                            const struct __timespec64 *timeout, int private)
-- 
2.20.1


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

* [PATCH 2/3] Y2038: nptl: Provide futex_abstimed_wait64 supporting 64 bit time
  2020-09-15 13:29 [PATCH 1/3] nptl: futex: Move __NR_futex_time64 alias to beginning of futex-internal.h Lukasz Majewski
@ 2020-09-15 13:29 ` Lukasz Majewski
  2020-09-15 14:12   ` Andreas Schwab
  2020-09-15 13:30 ` [PATCH 3/3] y2038: nptl: Convert pthread_rwlock_{clock|timed}{rd|wr}lock to support " Lukasz Majewski
  2020-09-15 15:17 ` [PATCH 1/3] nptl: futex: Move __NR_futex_time64 alias to beginning of futex-internal.h Alistair Francis
  2 siblings, 1 reply; 7+ messages in thread
From: Lukasz Majewski @ 2020-09-15 13:29 UTC (permalink / raw)
  To: Joseph Myers, Paul Eggert, Adhemerval Zanella
  Cc: Alistair Francis, Arnd Bergmann, Alistair Francis, GNU C Library,
	Florian Weimer, Carlos O'Donell, Stepan Golosunov,
	Andreas Schwab, Zack Weinberg, Jeff Law, Lukasz Majewski

This is the helper function, which uses struct __timespec64
to provide 64 bit absolute time to futex syscalls.

The aim of this function is to move convoluted pre-processor
macro code from sysdeps/nptl/lowlevellock-futex.h to C
function in futex-internal.c

The futex_abstimed_wait64 function has been put into a separate
file on the purpose - to avoid issues apparent on the m68k
architecture related to small number of available registers (there
is not enough registers to put all necessary arguments in them if
the above function would be added to futex-internal.h with
__always_inline attribute).

Additional precautions for m68k port have been taken - the
futex-internal.c file will be compiled with -fno-inline flag.
---
 sysdeps/nptl/futex-internal.c         | 66 +++++++++++++++++++++++++++
 sysdeps/nptl/futex-internal.h         |  6 +++
 sysdeps/unix/sysv/linux/m68k/Makefile |  2 +
 3 files changed, 74 insertions(+)

diff --git a/sysdeps/nptl/futex-internal.c b/sysdeps/nptl/futex-internal.c
index adb3c20611..9f17881e47 100644
--- a/sysdeps/nptl/futex-internal.c
+++ b/sysdeps/nptl/futex-internal.c
@@ -41,6 +41,25 @@ __futex_abstimed_wait_cancellable32 (unsigned int* futex_word,
                                   &ts32, NULL /* Unused.  */,
                                   FUTEX_BITSET_MATCH_ANY);
 }
+
+static int
+__futex_abstimed_wait32 (unsigned int* futex_word,
+                         unsigned int expected, clockid_t clockid,
+                         const struct __timespec64* abstime,
+                         int private)
+{
+  if (! in_time_t_range (abstime->tv_sec))
+    return -EOVERFLOW;
+
+  unsigned int clockbit = (clockid == CLOCK_REALTIME) ?
+    FUTEX_CLOCK_REALTIME : 0;
+  int op = __lll_private_flag (FUTEX_WAIT_BITSET | clockbit, private);
+
+  struct timespec ts32 = valid_timespec64_to_timespec (*abstime);
+  return INTERNAL_SYSCALL_CALL (futex, futex_word, op, expected,
+                                &ts32, NULL /* Unused.  */,
+                                FUTEX_BITSET_MATCH_ANY);
+}
 #endif
 
 int
@@ -93,3 +112,50 @@ __futex_abstimed_wait_cancelable64 (unsigned int* futex_word,
       futex_fatal_error ();
     }
 }
+
+int
+__futex_abstimed_wait64 (unsigned int* futex_word, unsigned int expected,
+                         clockid_t clockid,
+                         const struct __timespec64* abstime, int private)
+{
+  unsigned int clockbit;
+  int err;
+
+  /* Work around the fact that the kernel rejects negative timeout values
+     despite them being valid.  */
+  if (__glibc_unlikely ((abstime != NULL) && (abstime->tv_sec < 0)))
+    return ETIMEDOUT;
+
+  if (! lll_futex_supported_clockid(clockid))
+    return EINVAL;
+
+  clockbit = (clockid == CLOCK_REALTIME) ? FUTEX_CLOCK_REALTIME : 0;
+  int op = __lll_private_flag (FUTEX_WAIT_BITSET | clockbit, private);
+
+  err = INTERNAL_SYSCALL_CALL (futex_time64, futex_word, op, expected,
+                               abstime, NULL /* Unused.  */,
+                               FUTEX_BITSET_MATCH_ANY);
+#ifndef __ASSUME_TIME64_SYSCALLS
+  if (err == -ENOSYS)
+    err = __futex_abstimed_wait32 (futex_word, expected,
+                                   clockid, abstime, private);
+#endif
+  switch (err)
+    {
+    case 0:
+    case -EAGAIN:
+    case -EINTR:
+    case -ETIMEDOUT:
+      return -err;
+
+    case -EFAULT: /* Must have been caused by a glibc or application bug.  */
+    case -EINVAL: /* Either due to wrong alignment, unsupported
+		     clockid or due to the timeout not being
+		     normalized. Must have been caused by a glibc or
+		     application bug.  */
+    case -ENOSYS: /* Must have been caused by a glibc bug.  */
+    /* No other errors are documented at this time.  */
+    default:
+      futex_fatal_error ();
+    }
+}
diff --git a/sysdeps/nptl/futex-internal.h b/sysdeps/nptl/futex-internal.h
index 7f3910ad98..1ba0d61938 100644
--- a/sysdeps/nptl/futex-internal.h
+++ b/sysdeps/nptl/futex-internal.h
@@ -529,4 +529,10 @@ __futex_abstimed_wait_cancelable64 (unsigned int* futex_word,
                                     const struct __timespec64* abstime,
                                     int private) attribute_hidden;
 
+int
+__futex_abstimed_wait64 (unsigned int* futex_word, unsigned int expected,
+                         clockid_t clockid,
+                         const struct __timespec64* abstime,
+                         int private) attribute_hidden;
+
 #endif  /* futex-internal.h */
diff --git a/sysdeps/unix/sysv/linux/m68k/Makefile b/sysdeps/unix/sysv/linux/m68k/Makefile
index be40fae68a..65164c5752 100644
--- a/sysdeps/unix/sysv/linux/m68k/Makefile
+++ b/sysdeps/unix/sysv/linux/m68k/Makefile
@@ -21,3 +21,5 @@ sysdep-dl-routines += dl-static
 sysdep-others += lddlibc4
 install-bin += lddlibc4
 endif
+
+CFLAGS-futex-internal.c += -fno-inline
-- 
2.20.1


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

* [PATCH 3/3] y2038: nptl: Convert pthread_rwlock_{clock|timed}{rd|wr}lock to support 64 bit time
  2020-09-15 13:29 [PATCH 1/3] nptl: futex: Move __NR_futex_time64 alias to beginning of futex-internal.h Lukasz Majewski
  2020-09-15 13:29 ` [PATCH 2/3] Y2038: nptl: Provide futex_abstimed_wait64 supporting 64 bit time Lukasz Majewski
@ 2020-09-15 13:30 ` Lukasz Majewski
  2020-09-16 15:25   ` Alistair Francis
  2020-09-15 15:17 ` [PATCH 1/3] nptl: futex: Move __NR_futex_time64 alias to beginning of futex-internal.h Alistair Francis
  2 siblings, 1 reply; 7+ messages in thread
From: Lukasz Majewski @ 2020-09-15 13:30 UTC (permalink / raw)
  To: Joseph Myers, Paul Eggert, Adhemerval Zanella
  Cc: Alistair Francis, Arnd Bergmann, Alistair Francis, GNU C Library,
	Florian Weimer, Carlos O'Donell, Stepan Golosunov,
	Andreas Schwab, Zack Weinberg, Jeff Law, Lukasz Majewski

The pthread_rwlock_clockrdlock, pthread_rwlock_clockwrlock,
pthread_rwlock_timedrdlock and pthread_rwlock_timedwrlock have been converted
to support 64 bit time.

This change uses new futex_abstimed_wait64 function in
./sysdeps/nptl/futex-helpers.c, which uses futex_time64 where possible.

The pthread_rwlock_{clock|timed}{rd|wr}lock only accepts absolute time.
Moreover, there is no need to check for NULL passed as *abstime pointer to the
syscalls as those calls have exported symbols marked with __nonull attribute
for abstime.

For systems with __TIMESIZE != 64 && __WORDSIZE == 32:
- Conversions between 64 bit time to 32 bit are necessary
- Redirection to pthread_rwlock_{clock|timed}{rd|wr}lock will provide support
  for 64 bit time

Build tests:
./src/scripts/build-many-glibcs.py glibcs

Run-time tests:
- Run specific tests on ARM/x86 32bit systems (qemu):
  https://github.com/lmajewski/meta-y2038 and run tests:
  https://github.com/lmajewski/y2038-tests/commits/master

Above tests were performed with Y2038 redirection applied as well as without
to test the proper usage of both __pthread_rwlock_{clock|timed}{rd|wr}lock64
and __pthread_rwlock_{clock|timed}{rd|wr}lock.
---
 nptl/pthreadP.h                   | 18 +++++++++++++++++
 nptl/pthread_rwlock_clockrdlock.c | 19 +++++++++++++++---
 nptl/pthread_rwlock_clockwrlock.c | 19 +++++++++++++++---
 nptl/pthread_rwlock_common.c      | 33 +++++++++++++++----------------
 nptl/pthread_rwlock_rdlock.c      |  2 +-
 nptl/pthread_rwlock_timedrdlock.c | 19 +++++++++++++++---
 nptl/pthread_rwlock_timedwrlock.c | 19 +++++++++++++++---
 nptl/pthread_rwlock_wrlock.c      |  2 +-
 8 files changed, 100 insertions(+), 31 deletions(-)

diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
index 9bb44c8535..5bcc8a2db5 100644
--- a/nptl/pthreadP.h
+++ b/nptl/pthreadP.h
@@ -464,6 +464,10 @@ extern int __pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex);
 # define __pthread_timedjoin_np64 __pthread_timedjoin_np
 # define __pthread_cond_timedwait64 __pthread_cond_timedwait
 # define __pthread_cond_clockwait64 __pthread_cond_clockwait
+# define __pthread_rwlock_clockrdlock64 __pthread_rwlock_clockrdlock
+# define __pthread_rwlock_clockwrlock64 __pthread_rwlock_clockwrlock
+# define __pthread_rwlock_timedrdlock64 __pthread_rwlock_timedrdlock
+# define __pthread_rwlock_timedwrlock64 __pthread_rwlock_timedwrlock
 #else
 extern int __pthread_clockjoin_np64 (pthread_t threadid, void **thread_return,
                                      clockid_t clockid,
@@ -481,6 +485,20 @@ extern int __pthread_cond_clockwait64 (pthread_cond_t *cond,
                                        clockid_t clockid,
                                        const struct __timespec64 *abstime);
 libpthread_hidden_proto (__pthread_cond_clockwait64)
+extern int __pthread_rwlock_clockrdlock64 (pthread_rwlock_t *rwlock,
+                                           clockid_t clockid,
+                                           const struct __timespec64 *abstime);
+libpthread_hidden_proto (__pthread_rwlock_clockrdlock64)
+extern int __pthread_rwlock_clockwrlock64 (pthread_rwlock_t *rwlock,
+                                           clockid_t clockid,
+                                           const struct __timespec64 *abstime);
+libpthread_hidden_proto (__pthread_rwlock_clockwrlock64)
+extern int __pthread_rwlock_timedrdlock64 (pthread_rwlock_t *rwlock,
+                                           const struct __timespec64 *abstime);
+libpthread_hidden_proto (__pthread_rwlock_timedrdlock64)
+extern int __pthread_rwlock_timedwrlock64 (pthread_rwlock_t *rwlock,
+                                           const struct __timespec64 *abstime);
+libpthread_hidden_proto (__pthread_rwlock_timedwrlock64)
 #endif
 
 extern int __pthread_cond_timedwait (pthread_cond_t *cond,
diff --git a/nptl/pthread_rwlock_clockrdlock.c b/nptl/pthread_rwlock_clockrdlock.c
index 4cedfd1dcd..d93b133c9e 100644
--- a/nptl/pthread_rwlock_clockrdlock.c
+++ b/nptl/pthread_rwlock_clockrdlock.c
@@ -21,8 +21,21 @@
 
 /* See pthread_rwlock_common.c.  */
 int
-pthread_rwlock_clockrdlock (pthread_rwlock_t *rwlock, clockid_t clockid,
-			    const struct timespec *abstime)
+__pthread_rwlock_clockrdlock64 (pthread_rwlock_t *rwlock, clockid_t clockid,
+                                const struct __timespec64 *abstime)
 {
-  return __pthread_rwlock_rdlock_full (rwlock, clockid, abstime);
+  return __pthread_rwlock_rdlock_full64 (rwlock, clockid, abstime);
 }
+
+#if __TIMESIZE != 64
+libpthread_hidden_def (__pthread_rwlock_clockrdlock64)
+int
+__pthread_rwlock_clockrdlock (pthread_rwlock_t *rwlock, clockid_t clockid,
+                              const struct timespec *abstime)
+{
+  struct __timespec64 ts64 = valid_timespec_to_timespec64 (*abstime);
+
+  return __pthread_rwlock_clockrdlock64 (rwlock, clockid, &ts64);
+}
+#endif
+weak_alias (__pthread_rwlock_clockrdlock, pthread_rwlock_clockrdlock)
diff --git a/nptl/pthread_rwlock_clockwrlock.c b/nptl/pthread_rwlock_clockwrlock.c
index 7a954cf529..10a314c76d 100644
--- a/nptl/pthread_rwlock_clockwrlock.c
+++ b/nptl/pthread_rwlock_clockwrlock.c
@@ -21,8 +21,21 @@
 
 /* See pthread_rwlock_common.c.  */
 int
-pthread_rwlock_clockwrlock (pthread_rwlock_t *rwlock, clockid_t clockid,
-			    const struct timespec *abstime)
+__pthread_rwlock_clockwrlock64 (pthread_rwlock_t *rwlock, clockid_t clockid,
+                                const struct __timespec64 *abstime)
 {
-  return __pthread_rwlock_wrlock_full (rwlock, clockid, abstime);
+  return __pthread_rwlock_wrlock_full64 (rwlock, clockid, abstime);
 }
+
+#if __TIMESIZE != 64
+libpthread_hidden_def (__pthread_rwlock_clockwrlock64)
+int
+__pthread_rwlock_clockwrlock (pthread_rwlock_t *rwlock, clockid_t clockid,
+                              const struct timespec *abstime)
+{
+  struct __timespec64 ts64 = valid_timespec_to_timespec64 (*abstime);
+
+  return __pthread_rwlock_clockwrlock64 (rwlock, clockid, &ts64);
+}
+#endif
+weak_alias (__pthread_rwlock_clockwrlock, pthread_rwlock_clockwrlock)
diff --git a/nptl/pthread_rwlock_common.c b/nptl/pthread_rwlock_common.c
index 3fbc66ded2..4c9f582d3d 100644
--- a/nptl/pthread_rwlock_common.c
+++ b/nptl/pthread_rwlock_common.c
@@ -278,9 +278,8 @@ __pthread_rwlock_rdunlock (pthread_rwlock_t *rwlock)
 
 
 static __always_inline int
-__pthread_rwlock_rdlock_full (pthread_rwlock_t *rwlock,
-    clockid_t clockid,
-    const struct timespec *abstime)
+__pthread_rwlock_rdlock_full64 (pthread_rwlock_t *rwlock, clockid_t clockid,
+                                const struct __timespec64 *abstime)
 {
   unsigned int r;
 
@@ -330,8 +329,9 @@ __pthread_rwlock_rdlock_full (pthread_rwlock_t *rwlock,
 		      & PTHREAD_RWLOCK_RWAITING) != 0)
 		{
 		  int private = __pthread_rwlock_get_private (rwlock);
-		  int err = futex_abstimed_wait (&rwlock->__data.__readers,
-						 r, clockid, abstime, private);
+		  int err = __futex_abstimed_wait64 (&rwlock->__data.__readers,
+		                                     r, clockid, abstime,
+		                                     private);
 		  /* We ignore EAGAIN and EINTR.  On time-outs, we can just
 		     return because we don't need to clean up anything.  */
 		  if (err == ETIMEDOUT)
@@ -457,9 +457,9 @@ __pthread_rwlock_rdlock_full (pthread_rwlock_t *rwlock,
 		  (&rwlock->__data.__wrphase_futex,
 		   &wpf, wpf | PTHREAD_RWLOCK_FUTEX_USED)))
 	    continue;
-	  int err = futex_abstimed_wait (&rwlock->__data.__wrphase_futex,
-					 1 | PTHREAD_RWLOCK_FUTEX_USED,
-					 clockid, abstime, private);
+	  int err = __futex_abstimed_wait64 (&rwlock->__data.__wrphase_futex,
+					     1 | PTHREAD_RWLOCK_FUTEX_USED,
+					     clockid, abstime, private);
 	  if (err == ETIMEDOUT)
 	    {
 	      /* If we timed out, we need to unregister.  If no read phase
@@ -585,9 +585,8 @@ __pthread_rwlock_wrunlock (pthread_rwlock_t *rwlock)
 
 
 static __always_inline int
-__pthread_rwlock_wrlock_full (pthread_rwlock_t *rwlock,
-    clockid_t clockid,
-    const struct timespec *abstime)
+__pthread_rwlock_wrlock_full64 (pthread_rwlock_t *rwlock, clockid_t clockid,
+                                const struct __timespec64 *abstime)
 {
   /* Make sure any passed in clockid and timeout value are valid.  Note that
      the previous implementation assumed that this check *must* not be
@@ -728,9 +727,9 @@ __pthread_rwlock_wrlock_full (pthread_rwlock_t *rwlock,
 	     share the flag, and another writer will wake one of the writers
 	     in this group.  */
 	  may_share_futex_used_flag = true;
-	  int err = futex_abstimed_wait (&rwlock->__data.__writers_futex,
-					 1 | PTHREAD_RWLOCK_FUTEX_USED,
-					 clockid, abstime, private);
+	  int err = __futex_abstimed_wait64 (&rwlock->__data.__writers_futex,
+					     1 | PTHREAD_RWLOCK_FUTEX_USED,
+					     clockid, abstime, private);
 	  if (err == ETIMEDOUT)
 	    {
 	      if (prefer_writer)
@@ -827,9 +826,9 @@ __pthread_rwlock_wrlock_full (pthread_rwlock_t *rwlock,
 		  (&rwlock->__data.__wrphase_futex, &wpf,
 		   PTHREAD_RWLOCK_FUTEX_USED)))
 	    continue;
-	  int err = futex_abstimed_wait (&rwlock->__data.__wrphase_futex,
-					 PTHREAD_RWLOCK_FUTEX_USED,
-					 clockid, abstime, private);
+	  int err = __futex_abstimed_wait64 (&rwlock->__data.__wrphase_futex,
+					     PTHREAD_RWLOCK_FUTEX_USED,
+					     clockid, abstime, private);
 	  if (err == ETIMEDOUT)
 	    {
 	      if (rwlock->__data.__flags != PTHREAD_RWLOCK_PREFER_READER_NP)
diff --git a/nptl/pthread_rwlock_rdlock.c b/nptl/pthread_rwlock_rdlock.c
index 04cecad395..2b8509a49c 100644
--- a/nptl/pthread_rwlock_rdlock.c
+++ b/nptl/pthread_rwlock_rdlock.c
@@ -24,7 +24,7 @@ __pthread_rwlock_rdlock (pthread_rwlock_t *rwlock)
 {
   LIBC_PROBE (rdlock_entry, 1, rwlock);
 
-  int result = __pthread_rwlock_rdlock_full (rwlock, CLOCK_REALTIME, NULL);
+  int result = __pthread_rwlock_rdlock_full64 (rwlock, CLOCK_REALTIME, NULL);
   LIBC_PROBE (rdlock_acquire_read, 1, rwlock);
   return result;
 }
diff --git a/nptl/pthread_rwlock_timedrdlock.c b/nptl/pthread_rwlock_timedrdlock.c
index c5d8aee909..d5999a1419 100644
--- a/nptl/pthread_rwlock_timedrdlock.c
+++ b/nptl/pthread_rwlock_timedrdlock.c
@@ -20,8 +20,21 @@
 
 /* See pthread_rwlock_common.c.  */
 int
-pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock,
-    const struct timespec *abstime)
+__pthread_rwlock_timedrdlock64 (pthread_rwlock_t *rwlock,
+                                const struct __timespec64 *abstime)
 {
-  return __pthread_rwlock_rdlock_full (rwlock, CLOCK_REALTIME, abstime);
+  return __pthread_rwlock_rdlock_full64 (rwlock, CLOCK_REALTIME, abstime);
 }
+
+#if __TIMESIZE != 64
+libpthread_hidden_def (__pthread_rwlock_timedrdlock64)
+int
+__pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock,
+                              const struct timespec *abstime)
+{
+  struct __timespec64 ts64 = valid_timespec_to_timespec64 (*abstime);
+
+  return __pthread_rwlock_timedrdlock64 (rwlock, &ts64);
+}
+#endif
+weak_alias (__pthread_rwlock_timedrdlock, pthread_rwlock_timedrdlock)
diff --git a/nptl/pthread_rwlock_timedwrlock.c b/nptl/pthread_rwlock_timedwrlock.c
index ccee8b77d9..6c5284a172 100644
--- a/nptl/pthread_rwlock_timedwrlock.c
+++ b/nptl/pthread_rwlock_timedwrlock.c
@@ -20,8 +20,21 @@
 
 /* See pthread_rwlock_common.c.  */
 int
-pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock,
-    const struct timespec *abstime)
+__pthread_rwlock_timedwrlock64 (pthread_rwlock_t *rwlock,
+                                const struct __timespec64 *abstime)
 {
-  return __pthread_rwlock_wrlock_full (rwlock, CLOCK_REALTIME, abstime);
+  return __pthread_rwlock_wrlock_full64 (rwlock, CLOCK_REALTIME, abstime);
 }
+
+#if __TIMESIZE != 64
+libpthread_hidden_def (__pthread_rwlock_timedwrlock64)
+int
+__pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock,
+                              const struct timespec *abstime)
+{
+  struct __timespec64 ts64 = valid_timespec_to_timespec64 (*abstime);
+
+  return __pthread_rwlock_timedwrlock64 (rwlock, &ts64);
+}
+#endif
+weak_alias (__pthread_rwlock_timedwrlock, pthread_rwlock_timedwrlock)
diff --git a/nptl/pthread_rwlock_wrlock.c b/nptl/pthread_rwlock_wrlock.c
index a42aa626f0..210e6cffdc 100644
--- a/nptl/pthread_rwlock_wrlock.c
+++ b/nptl/pthread_rwlock_wrlock.c
@@ -24,7 +24,7 @@ __pthread_rwlock_wrlock (pthread_rwlock_t *rwlock)
 {
   LIBC_PROBE (wrlock_entry, 1, rwlock);
 
-  int result = __pthread_rwlock_wrlock_full (rwlock, CLOCK_REALTIME, NULL);
+  int result = __pthread_rwlock_wrlock_full64 (rwlock, CLOCK_REALTIME, NULL);
   LIBC_PROBE (wrlock_acquire_write, 1, rwlock);
   return result;
 }
-- 
2.20.1


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

* Re: [PATCH 2/3] Y2038: nptl: Provide futex_abstimed_wait64 supporting 64 bit time
  2020-09-15 13:29 ` [PATCH 2/3] Y2038: nptl: Provide futex_abstimed_wait64 supporting 64 bit time Lukasz Majewski
@ 2020-09-15 14:12   ` Andreas Schwab
  2020-09-16  6:58     ` Lukasz Majewski
  0 siblings, 1 reply; 7+ messages in thread
From: Andreas Schwab @ 2020-09-15 14:12 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Joseph Myers, Paul Eggert, Adhemerval Zanella, Florian Weimer,
	GNU C Library, Stepan Golosunov, Alistair Francis

On Sep 15 2020, Lukasz Majewski wrote:

> diff --git a/sysdeps/nptl/futex-internal.c b/sysdeps/nptl/futex-internal.c
> index adb3c20611..9f17881e47 100644
> --- a/sysdeps/nptl/futex-internal.c
> +++ b/sysdeps/nptl/futex-internal.c
> @@ -41,6 +41,25 @@ __futex_abstimed_wait_cancellable32 (unsigned int* futex_word,
>                                    &ts32, NULL /* Unused.  */,
>                                    FUTEX_BITSET_MATCH_ANY);
>  }
> +
> +static int
> +__futex_abstimed_wait32 (unsigned int* futex_word,
> +                         unsigned int expected, clockid_t clockid,
> +                         const struct __timespec64* abstime,
> +                         int private)
> +{
> +  if (! in_time_t_range (abstime->tv_sec))
> +    return -EOVERFLOW;
> +
> +  unsigned int clockbit = (clockid == CLOCK_REALTIME) ?
> +    FUTEX_CLOCK_REALTIME : 0;
> +  int op = __lll_private_flag (FUTEX_WAIT_BITSET | clockbit, private);
> +
> +  struct timespec ts32 = valid_timespec64_to_timespec (*abstime);

abstime may be NULL.

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] 7+ messages in thread

* Re: [PATCH 1/3] nptl: futex: Move __NR_futex_time64 alias to beginning of futex-internal.h
  2020-09-15 13:29 [PATCH 1/3] nptl: futex: Move __NR_futex_time64 alias to beginning of futex-internal.h Lukasz Majewski
  2020-09-15 13:29 ` [PATCH 2/3] Y2038: nptl: Provide futex_abstimed_wait64 supporting 64 bit time Lukasz Majewski
  2020-09-15 13:30 ` [PATCH 3/3] y2038: nptl: Convert pthread_rwlock_{clock|timed}{rd|wr}lock to support " Lukasz Majewski
@ 2020-09-15 15:17 ` Alistair Francis
  2 siblings, 0 replies; 7+ messages in thread
From: Alistair Francis @ 2020-09-15 15:17 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Joseph Myers, Paul Eggert, Adhemerval Zanella, Arnd Bergmann,
	Alistair Francis, GNU C Library, Florian Weimer,
	Carlos O'Donell, Stepan Golosunov, Andreas Schwab,
	Zack Weinberg, Jeff Law

On Tue, Sep 15, 2020 at 6:30 AM Lukasz Majewski <lukma@denx.de> wrote:
>
> This alias macro shall be moved to the beginning of the futex-internal.h
> to be easily reused by other functions, which would support 64 bit time.

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>

Alistair

> ---
>  sysdeps/nptl/futex-internal.h | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/sysdeps/nptl/futex-internal.h b/sysdeps/nptl/futex-internal.h
> index 84ab3f3853..7f3910ad98 100644
> --- a/sysdeps/nptl/futex-internal.h
> +++ b/sysdeps/nptl/futex-internal.h
> @@ -74,6 +74,10 @@
>  # error FUTEX_PRIVATE must be equal to 0
>  #endif
>
> +#ifndef __NR_futex_time64
> +# define __NR_futex_time64 __NR_futex
> +#endif
> +
>  /* Calls __libc_fatal with an error message.  Convenience function for
>     concrete implementations of the futex interface.  */
>  static __always_inline __attribute__ ((__noreturn__)) void
> @@ -467,10 +471,6 @@ futex_unlock_pi (unsigned int *futex_word, int private)
>      }
>  }
>
> -#ifndef __NR_futex_time64
> -# define __NR_futex_time64 __NR_futex
> -#endif
> -
>  static __always_inline int
>  futex_timed_wait_cancel64 (pid_t *tidp,  pid_t tid,
>                             const struct __timespec64 *timeout, int private)
> --
> 2.20.1
>

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

* Re: [PATCH 2/3] Y2038: nptl: Provide futex_abstimed_wait64 supporting 64 bit time
  2020-09-15 14:12   ` Andreas Schwab
@ 2020-09-16  6:58     ` Lukasz Majewski
  0 siblings, 0 replies; 7+ messages in thread
From: Lukasz Majewski @ 2020-09-16  6:58 UTC (permalink / raw)
  To: Andreas Schwab
  Cc: Joseph Myers, Paul Eggert, Adhemerval Zanella, Florian Weimer,
	GNU C Library, Stepan Golosunov, Alistair Francis

[-- Attachment #1: Type: text/plain, Size: 1611 bytes --]

Hi Andreas,

> On Sep 15 2020, Lukasz Majewski wrote:
> 
> > diff --git a/sysdeps/nptl/futex-internal.c
> > b/sysdeps/nptl/futex-internal.c index adb3c20611..9f17881e47 100644
> > --- a/sysdeps/nptl/futex-internal.c
> > +++ b/sysdeps/nptl/futex-internal.c
> > @@ -41,6 +41,25 @@ __futex_abstimed_wait_cancellable32 (unsigned
> > int* futex_word, &ts32, NULL /* Unused.  */,
> >                                    FUTEX_BITSET_MATCH_ANY);
> >  }
> > +
> > +static int
> > +__futex_abstimed_wait32 (unsigned int* futex_word,
> > +                         unsigned int expected, clockid_t clockid,
> > +                         const struct __timespec64* abstime,
> > +                         int private)
> > +{
> > +  if (! in_time_t_range (abstime->tv_sec))
> > +    return -EOVERFLOW;
> > +
> > +  unsigned int clockbit = (clockid == CLOCK_REALTIME) ?
> > +    FUTEX_CLOCK_REALTIME : 0;
> > +  int op = __lll_private_flag (FUTEX_WAIT_BITSET | clockbit,
> > private); +
> > +  struct timespec ts32 = valid_timespec64_to_timespec (*abstime);  
> 
> abstime may be NULL.

Thanks for pointing this out. Although the pthread_rwlock_rdlock
syscalls have *abstime marked as non-null, the used afterwards
__pthread_rwlock_rdlock_full64() passes NULL as abstime.

I will fix this and submit v2.

> 
> Andreas.
> 




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

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

* Re: [PATCH 3/3] y2038: nptl: Convert pthread_rwlock_{clock|timed}{rd|wr}lock to support 64 bit time
  2020-09-15 13:30 ` [PATCH 3/3] y2038: nptl: Convert pthread_rwlock_{clock|timed}{rd|wr}lock to support " Lukasz Majewski
@ 2020-09-16 15:25   ` Alistair Francis
  0 siblings, 0 replies; 7+ messages in thread
From: Alistair Francis @ 2020-09-16 15:25 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Joseph Myers, Paul Eggert, Adhemerval Zanella, Arnd Bergmann,
	Alistair Francis, GNU C Library, Florian Weimer,
	Carlos O'Donell, Stepan Golosunov, Andreas Schwab,
	Zack Weinberg, Jeff Law

On Tue, Sep 15, 2020 at 6:30 AM Lukasz Majewski <lukma@denx.de> wrote:
>
> The pthread_rwlock_clockrdlock, pthread_rwlock_clockwrlock,
> pthread_rwlock_timedrdlock and pthread_rwlock_timedwrlock have been converted
> to support 64 bit time.
>
> This change uses new futex_abstimed_wait64 function in
> ./sysdeps/nptl/futex-helpers.c, which uses futex_time64 where possible.
>
> The pthread_rwlock_{clock|timed}{rd|wr}lock only accepts absolute time.
> Moreover, there is no need to check for NULL passed as *abstime pointer to the
> syscalls as those calls have exported symbols marked with __nonull attribute
> for abstime.
>
> For systems with __TIMESIZE != 64 && __WORDSIZE == 32:
> - Conversions between 64 bit time to 32 bit are necessary
> - Redirection to pthread_rwlock_{clock|timed}{rd|wr}lock will provide support
>   for 64 bit time
>
> Build tests:
> ./src/scripts/build-many-glibcs.py glibcs
>
> Run-time tests:
> - Run specific tests on ARM/x86 32bit systems (qemu):
>   https://github.com/lmajewski/meta-y2038 and run tests:
>   https://github.com/lmajewski/y2038-tests/commits/master
>
> Above tests were performed with Y2038 redirection applied as well as without
> to test the proper usage of both __pthread_rwlock_{clock|timed}{rd|wr}lock64
> and __pthread_rwlock_{clock|timed}{rd|wr}lock.

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>

Alistair

> ---
>  nptl/pthreadP.h                   | 18 +++++++++++++++++
>  nptl/pthread_rwlock_clockrdlock.c | 19 +++++++++++++++---
>  nptl/pthread_rwlock_clockwrlock.c | 19 +++++++++++++++---
>  nptl/pthread_rwlock_common.c      | 33 +++++++++++++++----------------
>  nptl/pthread_rwlock_rdlock.c      |  2 +-
>  nptl/pthread_rwlock_timedrdlock.c | 19 +++++++++++++++---
>  nptl/pthread_rwlock_timedwrlock.c | 19 +++++++++++++++---
>  nptl/pthread_rwlock_wrlock.c      |  2 +-
>  8 files changed, 100 insertions(+), 31 deletions(-)
>
> diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
> index 9bb44c8535..5bcc8a2db5 100644
> --- a/nptl/pthreadP.h
> +++ b/nptl/pthreadP.h
> @@ -464,6 +464,10 @@ extern int __pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex);
>  # define __pthread_timedjoin_np64 __pthread_timedjoin_np
>  # define __pthread_cond_timedwait64 __pthread_cond_timedwait
>  # define __pthread_cond_clockwait64 __pthread_cond_clockwait
> +# define __pthread_rwlock_clockrdlock64 __pthread_rwlock_clockrdlock
> +# define __pthread_rwlock_clockwrlock64 __pthread_rwlock_clockwrlock
> +# define __pthread_rwlock_timedrdlock64 __pthread_rwlock_timedrdlock
> +# define __pthread_rwlock_timedwrlock64 __pthread_rwlock_timedwrlock
>  #else
>  extern int __pthread_clockjoin_np64 (pthread_t threadid, void **thread_return,
>                                       clockid_t clockid,
> @@ -481,6 +485,20 @@ extern int __pthread_cond_clockwait64 (pthread_cond_t *cond,
>                                         clockid_t clockid,
>                                         const struct __timespec64 *abstime);
>  libpthread_hidden_proto (__pthread_cond_clockwait64)
> +extern int __pthread_rwlock_clockrdlock64 (pthread_rwlock_t *rwlock,
> +                                           clockid_t clockid,
> +                                           const struct __timespec64 *abstime);
> +libpthread_hidden_proto (__pthread_rwlock_clockrdlock64)
> +extern int __pthread_rwlock_clockwrlock64 (pthread_rwlock_t *rwlock,
> +                                           clockid_t clockid,
> +                                           const struct __timespec64 *abstime);
> +libpthread_hidden_proto (__pthread_rwlock_clockwrlock64)
> +extern int __pthread_rwlock_timedrdlock64 (pthread_rwlock_t *rwlock,
> +                                           const struct __timespec64 *abstime);
> +libpthread_hidden_proto (__pthread_rwlock_timedrdlock64)
> +extern int __pthread_rwlock_timedwrlock64 (pthread_rwlock_t *rwlock,
> +                                           const struct __timespec64 *abstime);
> +libpthread_hidden_proto (__pthread_rwlock_timedwrlock64)
>  #endif
>
>  extern int __pthread_cond_timedwait (pthread_cond_t *cond,
> diff --git a/nptl/pthread_rwlock_clockrdlock.c b/nptl/pthread_rwlock_clockrdlock.c
> index 4cedfd1dcd..d93b133c9e 100644
> --- a/nptl/pthread_rwlock_clockrdlock.c
> +++ b/nptl/pthread_rwlock_clockrdlock.c
> @@ -21,8 +21,21 @@
>
>  /* See pthread_rwlock_common.c.  */
>  int
> -pthread_rwlock_clockrdlock (pthread_rwlock_t *rwlock, clockid_t clockid,
> -                           const struct timespec *abstime)
> +__pthread_rwlock_clockrdlock64 (pthread_rwlock_t *rwlock, clockid_t clockid,
> +                                const struct __timespec64 *abstime)
>  {
> -  return __pthread_rwlock_rdlock_full (rwlock, clockid, abstime);
> +  return __pthread_rwlock_rdlock_full64 (rwlock, clockid, abstime);
>  }
> +
> +#if __TIMESIZE != 64
> +libpthread_hidden_def (__pthread_rwlock_clockrdlock64)
> +int
> +__pthread_rwlock_clockrdlock (pthread_rwlock_t *rwlock, clockid_t clockid,
> +                              const struct timespec *abstime)
> +{
> +  struct __timespec64 ts64 = valid_timespec_to_timespec64 (*abstime);
> +
> +  return __pthread_rwlock_clockrdlock64 (rwlock, clockid, &ts64);
> +}
> +#endif
> +weak_alias (__pthread_rwlock_clockrdlock, pthread_rwlock_clockrdlock)
> diff --git a/nptl/pthread_rwlock_clockwrlock.c b/nptl/pthread_rwlock_clockwrlock.c
> index 7a954cf529..10a314c76d 100644
> --- a/nptl/pthread_rwlock_clockwrlock.c
> +++ b/nptl/pthread_rwlock_clockwrlock.c
> @@ -21,8 +21,21 @@
>
>  /* See pthread_rwlock_common.c.  */
>  int
> -pthread_rwlock_clockwrlock (pthread_rwlock_t *rwlock, clockid_t clockid,
> -                           const struct timespec *abstime)
> +__pthread_rwlock_clockwrlock64 (pthread_rwlock_t *rwlock, clockid_t clockid,
> +                                const struct __timespec64 *abstime)
>  {
> -  return __pthread_rwlock_wrlock_full (rwlock, clockid, abstime);
> +  return __pthread_rwlock_wrlock_full64 (rwlock, clockid, abstime);
>  }
> +
> +#if __TIMESIZE != 64
> +libpthread_hidden_def (__pthread_rwlock_clockwrlock64)
> +int
> +__pthread_rwlock_clockwrlock (pthread_rwlock_t *rwlock, clockid_t clockid,
> +                              const struct timespec *abstime)
> +{
> +  struct __timespec64 ts64 = valid_timespec_to_timespec64 (*abstime);
> +
> +  return __pthread_rwlock_clockwrlock64 (rwlock, clockid, &ts64);
> +}
> +#endif
> +weak_alias (__pthread_rwlock_clockwrlock, pthread_rwlock_clockwrlock)
> diff --git a/nptl/pthread_rwlock_common.c b/nptl/pthread_rwlock_common.c
> index 3fbc66ded2..4c9f582d3d 100644
> --- a/nptl/pthread_rwlock_common.c
> +++ b/nptl/pthread_rwlock_common.c
> @@ -278,9 +278,8 @@ __pthread_rwlock_rdunlock (pthread_rwlock_t *rwlock)
>
>
>  static __always_inline int
> -__pthread_rwlock_rdlock_full (pthread_rwlock_t *rwlock,
> -    clockid_t clockid,
> -    const struct timespec *abstime)
> +__pthread_rwlock_rdlock_full64 (pthread_rwlock_t *rwlock, clockid_t clockid,
> +                                const struct __timespec64 *abstime)
>  {
>    unsigned int r;
>
> @@ -330,8 +329,9 @@ __pthread_rwlock_rdlock_full (pthread_rwlock_t *rwlock,
>                       & PTHREAD_RWLOCK_RWAITING) != 0)
>                 {
>                   int private = __pthread_rwlock_get_private (rwlock);
> -                 int err = futex_abstimed_wait (&rwlock->__data.__readers,
> -                                                r, clockid, abstime, private);
> +                 int err = __futex_abstimed_wait64 (&rwlock->__data.__readers,
> +                                                    r, clockid, abstime,
> +                                                    private);
>                   /* We ignore EAGAIN and EINTR.  On time-outs, we can just
>                      return because we don't need to clean up anything.  */
>                   if (err == ETIMEDOUT)
> @@ -457,9 +457,9 @@ __pthread_rwlock_rdlock_full (pthread_rwlock_t *rwlock,
>                   (&rwlock->__data.__wrphase_futex,
>                    &wpf, wpf | PTHREAD_RWLOCK_FUTEX_USED)))
>             continue;
> -         int err = futex_abstimed_wait (&rwlock->__data.__wrphase_futex,
> -                                        1 | PTHREAD_RWLOCK_FUTEX_USED,
> -                                        clockid, abstime, private);
> +         int err = __futex_abstimed_wait64 (&rwlock->__data.__wrphase_futex,
> +                                            1 | PTHREAD_RWLOCK_FUTEX_USED,
> +                                            clockid, abstime, private);
>           if (err == ETIMEDOUT)
>             {
>               /* If we timed out, we need to unregister.  If no read phase
> @@ -585,9 +585,8 @@ __pthread_rwlock_wrunlock (pthread_rwlock_t *rwlock)
>
>
>  static __always_inline int
> -__pthread_rwlock_wrlock_full (pthread_rwlock_t *rwlock,
> -    clockid_t clockid,
> -    const struct timespec *abstime)
> +__pthread_rwlock_wrlock_full64 (pthread_rwlock_t *rwlock, clockid_t clockid,
> +                                const struct __timespec64 *abstime)
>  {
>    /* Make sure any passed in clockid and timeout value are valid.  Note that
>       the previous implementation assumed that this check *must* not be
> @@ -728,9 +727,9 @@ __pthread_rwlock_wrlock_full (pthread_rwlock_t *rwlock,
>              share the flag, and another writer will wake one of the writers
>              in this group.  */
>           may_share_futex_used_flag = true;
> -         int err = futex_abstimed_wait (&rwlock->__data.__writers_futex,
> -                                        1 | PTHREAD_RWLOCK_FUTEX_USED,
> -                                        clockid, abstime, private);
> +         int err = __futex_abstimed_wait64 (&rwlock->__data.__writers_futex,
> +                                            1 | PTHREAD_RWLOCK_FUTEX_USED,
> +                                            clockid, abstime, private);
>           if (err == ETIMEDOUT)
>             {
>               if (prefer_writer)
> @@ -827,9 +826,9 @@ __pthread_rwlock_wrlock_full (pthread_rwlock_t *rwlock,
>                   (&rwlock->__data.__wrphase_futex, &wpf,
>                    PTHREAD_RWLOCK_FUTEX_USED)))
>             continue;
> -         int err = futex_abstimed_wait (&rwlock->__data.__wrphase_futex,
> -                                        PTHREAD_RWLOCK_FUTEX_USED,
> -                                        clockid, abstime, private);
> +         int err = __futex_abstimed_wait64 (&rwlock->__data.__wrphase_futex,
> +                                            PTHREAD_RWLOCK_FUTEX_USED,
> +                                            clockid, abstime, private);
>           if (err == ETIMEDOUT)
>             {
>               if (rwlock->__data.__flags != PTHREAD_RWLOCK_PREFER_READER_NP)
> diff --git a/nptl/pthread_rwlock_rdlock.c b/nptl/pthread_rwlock_rdlock.c
> index 04cecad395..2b8509a49c 100644
> --- a/nptl/pthread_rwlock_rdlock.c
> +++ b/nptl/pthread_rwlock_rdlock.c
> @@ -24,7 +24,7 @@ __pthread_rwlock_rdlock (pthread_rwlock_t *rwlock)
>  {
>    LIBC_PROBE (rdlock_entry, 1, rwlock);
>
> -  int result = __pthread_rwlock_rdlock_full (rwlock, CLOCK_REALTIME, NULL);
> +  int result = __pthread_rwlock_rdlock_full64 (rwlock, CLOCK_REALTIME, NULL);
>    LIBC_PROBE (rdlock_acquire_read, 1, rwlock);
>    return result;
>  }
> diff --git a/nptl/pthread_rwlock_timedrdlock.c b/nptl/pthread_rwlock_timedrdlock.c
> index c5d8aee909..d5999a1419 100644
> --- a/nptl/pthread_rwlock_timedrdlock.c
> +++ b/nptl/pthread_rwlock_timedrdlock.c
> @@ -20,8 +20,21 @@
>
>  /* See pthread_rwlock_common.c.  */
>  int
> -pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock,
> -    const struct timespec *abstime)
> +__pthread_rwlock_timedrdlock64 (pthread_rwlock_t *rwlock,
> +                                const struct __timespec64 *abstime)
>  {
> -  return __pthread_rwlock_rdlock_full (rwlock, CLOCK_REALTIME, abstime);
> +  return __pthread_rwlock_rdlock_full64 (rwlock, CLOCK_REALTIME, abstime);
>  }
> +
> +#if __TIMESIZE != 64
> +libpthread_hidden_def (__pthread_rwlock_timedrdlock64)
> +int
> +__pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock,
> +                              const struct timespec *abstime)
> +{
> +  struct __timespec64 ts64 = valid_timespec_to_timespec64 (*abstime);
> +
> +  return __pthread_rwlock_timedrdlock64 (rwlock, &ts64);
> +}
> +#endif
> +weak_alias (__pthread_rwlock_timedrdlock, pthread_rwlock_timedrdlock)
> diff --git a/nptl/pthread_rwlock_timedwrlock.c b/nptl/pthread_rwlock_timedwrlock.c
> index ccee8b77d9..6c5284a172 100644
> --- a/nptl/pthread_rwlock_timedwrlock.c
> +++ b/nptl/pthread_rwlock_timedwrlock.c
> @@ -20,8 +20,21 @@
>
>  /* See pthread_rwlock_common.c.  */
>  int
> -pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock,
> -    const struct timespec *abstime)
> +__pthread_rwlock_timedwrlock64 (pthread_rwlock_t *rwlock,
> +                                const struct __timespec64 *abstime)
>  {
> -  return __pthread_rwlock_wrlock_full (rwlock, CLOCK_REALTIME, abstime);
> +  return __pthread_rwlock_wrlock_full64 (rwlock, CLOCK_REALTIME, abstime);
>  }
> +
> +#if __TIMESIZE != 64
> +libpthread_hidden_def (__pthread_rwlock_timedwrlock64)
> +int
> +__pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock,
> +                              const struct timespec *abstime)
> +{
> +  struct __timespec64 ts64 = valid_timespec_to_timespec64 (*abstime);
> +
> +  return __pthread_rwlock_timedwrlock64 (rwlock, &ts64);
> +}
> +#endif
> +weak_alias (__pthread_rwlock_timedwrlock, pthread_rwlock_timedwrlock)
> diff --git a/nptl/pthread_rwlock_wrlock.c b/nptl/pthread_rwlock_wrlock.c
> index a42aa626f0..210e6cffdc 100644
> --- a/nptl/pthread_rwlock_wrlock.c
> +++ b/nptl/pthread_rwlock_wrlock.c
> @@ -24,7 +24,7 @@ __pthread_rwlock_wrlock (pthread_rwlock_t *rwlock)
>  {
>    LIBC_PROBE (wrlock_entry, 1, rwlock);
>
> -  int result = __pthread_rwlock_wrlock_full (rwlock, CLOCK_REALTIME, NULL);
> +  int result = __pthread_rwlock_wrlock_full64 (rwlock, CLOCK_REALTIME, NULL);
>    LIBC_PROBE (wrlock_acquire_write, 1, rwlock);
>    return result;
>  }
> --
> 2.20.1
>

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

end of thread, other threads:[~2020-09-16 15:36 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-15 13:29 [PATCH 1/3] nptl: futex: Move __NR_futex_time64 alias to beginning of futex-internal.h Lukasz Majewski
2020-09-15 13:29 ` [PATCH 2/3] Y2038: nptl: Provide futex_abstimed_wait64 supporting 64 bit time Lukasz Majewski
2020-09-15 14:12   ` Andreas Schwab
2020-09-16  6:58     ` Lukasz Majewski
2020-09-15 13:30 ` [PATCH 3/3] y2038: nptl: Convert pthread_rwlock_{clock|timed}{rd|wr}lock to support " Lukasz Majewski
2020-09-16 15:25   ` Alistair Francis
2020-09-15 15:17 ` [PATCH 1/3] nptl: futex: Move __NR_futex_time64 alias to beginning of futex-internal.h Alistair Francis

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).