mirror of git://sourceware.org/git/glibc.git
This patch removes __ASSUME_FUTEX_LOCK_PI usage and assumes that
kernel will correctly return if it supports or not
futex_atomic_cmpxchg_inatomic.
Current PI mutex code already has runtime support by calling
prio_inherit_missing and returns ENOTSUP if the futex operation fails
at initialization (it issues a FUTEX_UNLOCK_PI futex operation).
Also, current minimum supported kernel (v3.2) will return ENOSYS if
futex_atomic_cmpxchg_inatomic is not supported in the system:
kernel/futex.c:
2628 long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
2629 u32 __user *uaddr2, u32 val2, u32 val3)
2630 {
2631 int ret = -ENOSYS, cmd = op & FUTEX_CMD_MASK;
[...]
2667 case FUTEX_UNLOCK_PI:
2668 if (futex_cmpxchg_enabled)
2669 ret = futex_unlock_pi(uaddr, flags);
[...]
2686 return ret;
2687 }
The futex_cmpxchg_enabled is initialized by calling cmpxchg_futex_value_locked,
which calls futex_atomic_cmpxchg_inatomic.
For ARM futex_atomic_cmpxchg_inatomic will be either defined (if both
CONFIG_CPU_USE_DOMAINS and CONFIG_SMP are not defined) or use the
default generic implementation that returns ENOSYS.
For m68k is uses the default generic implementation.
For mips futex_atomic_cmpxchg_inatomic will return ENOSYS if cpu has no
'cpu_has_llsc' support (defined by each chip supporte inside kernel).
For sparc, 32-bit kernel will just use default generic implementation,
while 64-bit kernel has support.
Tested on ARM (v3.8 kernel) and x86_64.
* nptl/pthread_mutex_init.c [__ASSUME_FUTEX_LOCK_PI]
(prio_inherit_missing): Remove define.
* sysdeps/unix/sysv/linux/arm/kernel-features.h
(__ASSUME_FUTEX_LOCK_PI): Likewise.
* sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_FUTEX_LOCK_PI):
Likewise.
* sysdeps/unix/sysv/linux/m68k/kernel-features.h
(__ASSUME_FUTEX_LOCK_PI): Likewise.
* sysdeps/unix/sysv/linux/mips/kernel-features.h
(__ASSUME_FUTEX_LOCK_PI): Likewise.
* sysdeps/unix/sysv/linux/sparc/kernel-features.h
(__ASSUME_FUTEX_LOCK_PI): Likewise.
|
||
|---|---|---|
| .. | ||
| bits | ||
| mips32 | ||
| mips64 | ||
| sys | ||
| Implies | ||
| Makefile | ||
| Versions | ||
| ____longjmp_chk.c | ||
| _test_and_set.c | ||
| arch-fork.h | ||
| brk.c | ||
| clone.S | ||
| configure | ||
| configure.ac | ||
| dl-cache.h | ||
| dl-static.c | ||
| getcontext.S | ||
| getmsg.c | ||
| getrlimit64.c | ||
| getsysstats.c | ||
| init-first.c | ||
| ipc_priv.h | ||
| kernel-features.h | ||
| kernel_rt_sigframe.h | ||
| kernel_sigaction.h | ||
| kernel_stat.h | ||
| kernel_termios.h | ||
| ldsodefs.h | ||
| libc-abis | ||
| libc-vdso.h | ||
| makecontext.S | ||
| pipe.S | ||
| profil-counter.h | ||
| pt-vfork.S | ||
| putmsg.c | ||
| readelflib.c | ||
| register-dump.h | ||
| setcontext.S | ||
| setrlimit64.c | ||
| shlib-versions | ||
| sigaction.c | ||
| sigcontextinfo.h | ||
| swapcontext.S | ||
| syscalls.list | ||
| sysdep-cancel.h | ||
| ucontext_i.sym | ||
| ustat.c | ||
| vfork.S | ||
| xstatconv.c | ||