Joseph Myers c2f5813ae0 Make sem_timedwait use FUTEX_CLOCK_REALTIME (bug 18138).
sem_timedwait converts absolute timeouts to relative to pass them to
the futex syscall.  (Before the recent reimplementation, on x86_64 it
used FUTEX_CLOCK_REALTIME, but not on other architectures.)

Correctly implementing POSIX requirements, however, requires use of
FUTEX_CLOCK_REALTIME; passing a relative timeout to the kernel does
not conform to POSIX.  The POSIX specification for sem_timedwait says
"The timeout shall be based on the CLOCK_REALTIME clock.".  The POSIX
specification for clock_settime says "If the value of the
CLOCK_REALTIME clock is set via clock_settime(), the new value of the
clock shall be used to determine the time of expiration for absolute
time services based upon the CLOCK_REALTIME clock. This applies to the
time at which armed absolute timers expire. If the absolute time
requested at the invocation of such a time service is before the new
value of the clock, the time service shall expire immediately as if
the clock had reached the requested time normally.".  If a relative
timeout is passed to the kernel, it is interpreted according to the
CLOCK_MONOTONIC clock, and so fails to meet that POSIX requirement in
the event of clock changes.

This patch makes sem_timedwait use lll_futex_timed_wait_bitset with
FUTEX_CLOCK_REALTIME when possible, as done in some other places in
NPTL.  FUTEX_CLOCK_REALTIME is always available for supported Linux
kernel versions; unavailability of lll_futex_timed_wait_bitset is only
an issue for hppa (an issue noted in
<https://sourceware.org/glibc/wiki/PortStatus>, and fixed by the
unreviewed
<https://sourceware.org/ml/libc-alpha/2014-12/msg00655.html> that
removes the hppa lowlevellock.h completely).

In the FUTEX_CLOCK_REALTIME case, the glibc code still needs to check
for negative tv_sec and handle that as timeout, because the Linux
kernel returns EINVAL not ETIMEDOUT for that case, so resulting in
failures of nptl/tst-abstime and nptl/tst-sem13 in the absence of that
check.  If we're trying to distinguish between Linux-specific and
generic-futex NPTL code, I suppose having this in an nptl/ file isn't
ideal, but there doesn't seem to be any better place at present.

It's not possible to add a testcase for this issue to the testsuite
because of the requirement to change the system clock as part of a
test (this is a case where testing would require some form of
container, with root in that container, and one whose CLOCK_REALTIME
is isolated from that of the host; I'm not sure what forms of
containers, short of a full virtual machine, provide that clock
isolation).

Tested for x86_64.  Also tested for powerpc with the testcase included
in the bug.

	[BZ #18138]
	* nptl/sem_waitcommon.c: Include <kernel-features.h>.
	(futex_abstimed_wait)
	[__ASSUME_FUTEX_CLOCK_REALTIME && lll_futex_timed_wait_bitset]:
	Use lll_futex_timed_wait_bitset with FUTEX_CLOCK_REALTIME instead
	of lll_futex_timed_wait.
2015-03-18 17:05:38 +00:00
..
2004-09-08 07:02:28 +00:00
2004-05-18 20:18:14 +00:00
2004-08-13 05:42:43 +00:00
2015-01-06 08:23:58 -08:00
2015-01-06 08:23:58 -08:00
2015-01-06 08:23:58 -08:00
2004-09-20 00:16:11 +00:00
2004-09-20 00:16:11 +00:00
2004-09-20 00:16:11 +00:00
2004-09-20 00:16:11 +00:00
2004-09-20 00:16:11 +00:00
2004-09-20 00:16:11 +00:00
2004-09-20 00:16:11 +00:00
2004-09-20 00:16:11 +00:00
2014-05-07 14:00:01 +02:00
2007-05-15 06:49:29 +00:00
2003-09-29 22:23:14 +00:00
2003-02-15 22:50:01 +00:00
2003-07-22 23:10:17 +00:00
..
2007-12-12 18:41:10 +00:00
2002-12-14 19:49:13 +00:00
2003-12-20 06:34:59 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-16 07:39:03 +00:00
2003-06-17 22:11:22 +00:00
2003-06-17 22:40:05 +00:00
2003-12-19 01:37:13 +00:00
2003-12-19 01:37:13 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-06-08 05:28:14 +00:00
2003-11-06 04:29:42 +00:00
2003-11-21 09:25:26 +00:00
2004-05-18 20:18:14 +00:00
2004-09-02 18:59:24 +00:00
2013-06-06 20:36:07 +02:00
2003-02-27 04:42:04 +00:00
2003-09-24 08:33:01 +00:00
2004-11-09 23:12:36 +00:00
2004-11-10 07:54:40 +00:00
2006-08-13 01:56:09 +00:00
2004-03-24 06:36:06 +00:00
2011-10-24 21:43:33 -04:00
2003-07-01 03:29:50 +00:00
2003-07-01 03:29:50 +00:00
2008-05-31 08:56:14 +00:00
2007-05-26 01:23:04 +00:00
2004-11-12 01:27:04 +00:00
2011-09-10 14:34:15 -04:00
2003-09-02 00:33:28 +00:00
2003-09-02 00:33:28 +00:00
2003-09-02 00:33:28 +00:00
2003-09-02 00:33:28 +00:00
2003-09-02 00:33:28 +00:00
2003-09-02 00:33:28 +00:00
2003-09-02 00:33:28 +00:00
2007-08-21 23:55:36 +00:00
2004-03-10 05:25:48 +00:00
2004-03-10 05:25:48 +00:00
2004-03-10 05:25:48 +00:00
2004-03-10 05:25:48 +00:00
2015-02-06 10:53:07 -08:00