lkml.org 
[lkml]   [2014]   [Apr]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.14 21/23] futex: Allow architectures to skip futex_atomic_cmpxchg_inatomic() test
    Date
    3.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Heiko Carstens <heiko.carstens@de.ibm.com>

    commit 03b8c7b623c80af264c4c8d6111e5c6289933666 upstream.

    If an architecture has futex_atomic_cmpxchg_inatomic() implemented and there
    is no runtime check necessary, allow to skip the test within futex_init().

    This allows to get rid of some code which would always give the same result,
    and also allows the compiler to optimize a couple of if statements away.

    Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
    Cc: Finn Thain <fthain@telegraphics.com.au>
    Cc: Geert Uytterhoeven <geert@linux-m68k.org>
    Link: http://lkml.kernel.org/r/20140302120947.GA3641@osiris
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/s390/Kconfig | 1 +
    include/linux/futex.h | 4 ++++
    init/Kconfig | 7 +++++++
    kernel/futex.c | 37 ++++++++++++++++++++++++-------------
    4 files changed, 36 insertions(+), 13 deletions(-)

    --- a/arch/s390/Kconfig
    +++ b/arch/s390/Kconfig
    @@ -117,6 +117,7 @@ config S390
    select HAVE_FUNCTION_GRAPH_TRACER
    select HAVE_FUNCTION_TRACER
    select HAVE_FUNCTION_TRACE_MCOUNT_TEST
    + select HAVE_FUTEX_CMPXCHG if FUTEX
    select HAVE_KERNEL_BZIP2
    select HAVE_KERNEL_GZIP
    select HAVE_KERNEL_LZ4
    --- a/include/linux/futex.h
    +++ b/include/linux/futex.h
    @@ -55,7 +55,11 @@ union futex_key {
    #ifdef CONFIG_FUTEX
    extern void exit_robust_list(struct task_struct *curr);
    extern void exit_pi_state_list(struct task_struct *curr);
    +#ifdef CONFIG_HAVE_FUTEX_CMPXCHG
    +#define futex_cmpxchg_enabled 1
    +#else
    extern int futex_cmpxchg_enabled;
    +#endif
    #else
    static inline void exit_robust_list(struct task_struct *curr)
    {
    --- a/init/Kconfig
    +++ b/init/Kconfig
    @@ -1387,6 +1387,13 @@ config FUTEX
    support for "fast userspace mutexes". The resulting kernel may not
    run glibc-based applications correctly.

    +config HAVE_FUTEX_CMPXCHG
    + bool
    + help
    + Architectures should select this if futex_atomic_cmpxchg_inatomic()
    + is implemented and always working. This removes a couple of runtime
    + checks.
    +
    config EPOLL
    bool "Enable eventpoll support" if EXPERT
    default y
    --- a/kernel/futex.c
    +++ b/kernel/futex.c
    @@ -157,7 +157,9 @@
    * enqueue.
    */

    +#ifndef CONFIG_HAVE_FUTEX_CMPXCHG
    int __read_mostly futex_cmpxchg_enabled;
    +#endif

    /*
    * Futex flags used to encode options to functions and preserve them across
    @@ -2880,9 +2882,28 @@ SYSCALL_DEFINE6(futex, u32 __user *, uad
    return do_futex(uaddr, op, val, tp, uaddr2, val2, val3);
    }

    -static int __init futex_init(void)
    +static void __init futex_detect_cmpxchg(void)
    {
    +#ifndef CONFIG_HAVE_FUTEX_CMPXCHG
    u32 curval;
    +
    + /*
    + * This will fail and we want it. Some arch implementations do
    + * runtime detection of the futex_atomic_cmpxchg_inatomic()
    + * functionality. We want to know that before we call in any
    + * of the complex code paths. Also we want to prevent
    + * registration of robust lists in that case. NULL is
    + * guaranteed to fault and we get -EFAULT on functional
    + * implementation, the non-functional ones will return
    + * -ENOSYS.
    + */
    + if (cmpxchg_futex_value_locked(&curval, NULL, 0, 0) == -EFAULT)
    + futex_cmpxchg_enabled = 1;
    +#endif
    +}
    +
    +static int __init futex_init(void)
    +{
    unsigned int futex_shift;
    unsigned long i;

    @@ -2898,18 +2919,8 @@ static int __init futex_init(void)
    &futex_shift, NULL,
    futex_hashsize, futex_hashsize);
    futex_hashsize = 1UL << futex_shift;
    - /*
    - * This will fail and we want it. Some arch implementations do
    - * runtime detection of the futex_atomic_cmpxchg_inatomic()
    - * functionality. We want to know that before we call in any
    - * of the complex code paths. Also we want to prevent
    - * registration of robust lists in that case. NULL is
    - * guaranteed to fault and we get -EFAULT on functional
    - * implementation, the non-functional ones will return
    - * -ENOSYS.
    - */
    - if (cmpxchg_futex_value_locked(&curval, NULL, 0, 0) == -EFAULT)
    - futex_cmpxchg_enabled = 1;
    +
    + futex_detect_cmpxchg();

    for (i = 0; i < futex_hashsize; i++) {
    atomic_set(&futex_queues[i].waiters, 0);



    \
     
     \ /
      Last update: 2014-04-11 19:01    [W:4.418 / U:0.192 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site