lkml.org 
[lkml]   [2023]   [Apr]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: locking/core] locking/arch: Wire up local_try_cmpxchg()
    The following commit has been merged into the locking/core branch of tip:

    Commit-ID: bdf02b98474827e83e7e9254904eb18eb85552cd
    Gitweb: https://git.kernel.org/tip/bdf02b98474827e83e7e9254904eb18eb85552cd
    Author: Uros Bizjak <ubizjak@gmail.com>
    AuthorDate: Wed, 05 Apr 2023 16:17:08 +02:00
    Committer: Ingo Molnar <mingo@kernel.org>
    CommitterDate: Sat, 29 Apr 2023 08:52:25 +02:00

    locking/arch: Wire up local_try_cmpxchg()

    Implement target specific support for local_try_cmpxchg()
    and local_cmpxchg() using typed C wrappers that call their
    _local counterpart and provide additional checking of
    their input arguments.

    Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Link: https://lore.kernel.org/r/20230405141710.3551-4-ubizjak@gmail.com
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    ---
    arch/alpha/include/asm/local.h | 12 ++++++++++--
    arch/loongarch/include/asm/local.h | 13 +++++++++++--
    arch/mips/include/asm/local.h | 13 +++++++++++--
    arch/powerpc/include/asm/local.h | 11 +++++++++++
    arch/x86/include/asm/local.h | 13 +++++++++++--
    5 files changed, 54 insertions(+), 8 deletions(-)

    diff --git a/arch/alpha/include/asm/local.h b/arch/alpha/include/asm/local.h
    index fab26a1..0fcaad6 100644
    --- a/arch/alpha/include/asm/local.h
    +++ b/arch/alpha/include/asm/local.h
    @@ -52,8 +52,16 @@ static __inline__ long local_sub_return(long i, local_t * l)
    return result;
    }

    -#define local_cmpxchg(l, o, n) \
    - (cmpxchg_local(&((l)->a.counter), (o), (n)))
    +static __inline__ long local_cmpxchg(local_t *l, long old, long new)
    +{
    + return cmpxchg_local(&l->a.counter, old, new);
    +}
    +
    +static __inline__ bool local_try_cmpxchg(local_t *l, long *old, long new)
    +{
    + return try_cmpxchg_local(&l->a.counter, (s64 *)old, new);
    +}
    +
    #define local_xchg(l, n) (xchg_local(&((l)->a.counter), (n)))

    /**
    diff --git a/arch/loongarch/include/asm/local.h b/arch/loongarch/include/asm/local.h
    index 65fbbae..83e995b 100644
    --- a/arch/loongarch/include/asm/local.h
    +++ b/arch/loongarch/include/asm/local.h
    @@ -56,8 +56,17 @@ static inline long local_sub_return(long i, local_t *l)
    return result;
    }

    -#define local_cmpxchg(l, o, n) \
    - ((long)cmpxchg_local(&((l)->a.counter), (o), (n)))
    +static inline long local_cmpxchg(local_t *l, long old, long new)
    +{
    + return cmpxchg_local(&l->a.counter, old, new);
    +}
    +
    +static inline bool local_try_cmpxchg(local_t *l, long *old, long new)
    +{
    + typeof(l->a.counter) *__old = (typeof(l->a.counter) *) old;
    + return try_cmpxchg_local(&l->a.counter, __old, new);
    +}
    +
    #define local_xchg(l, n) (atomic_long_xchg((&(l)->a), (n)))

    /**
    diff --git a/arch/mips/include/asm/local.h b/arch/mips/include/asm/local.h
    index 08366b1..5daf6fe 100644
    --- a/arch/mips/include/asm/local.h
    +++ b/arch/mips/include/asm/local.h
    @@ -94,8 +94,17 @@ static __inline__ long local_sub_return(long i, local_t * l)
    return result;
    }

    -#define local_cmpxchg(l, o, n) \
    - ((long)cmpxchg_local(&((l)->a.counter), (o), (n)))
    +static __inline__ long local_cmpxchg(local_t *l, long old, long new)
    +{
    + return cmpxchg_local(&l->a.counter, old, new);
    +}
    +
    +static __inline__ bool local_try_cmpxchg(local_t *l, long *old, long new)
    +{
    + typeof(l->a.counter) *__old = (typeof(l->a.counter) *) old;
    + return try_cmpxchg_local(&l->a.counter, __old, new);
    +}
    +
    #define local_xchg(l, n) (atomic_long_xchg((&(l)->a), (n)))

    /**
    diff --git a/arch/powerpc/include/asm/local.h b/arch/powerpc/include/asm/local.h
    index bc4bd19..45492fb 100644
    --- a/arch/powerpc/include/asm/local.h
    +++ b/arch/powerpc/include/asm/local.h
    @@ -90,6 +90,17 @@ static __inline__ long local_cmpxchg(local_t *l, long o, long n)
    return t;
    }

    +static __inline__ bool local_try_cmpxchg(local_t *l, long *po, long n)
    +{
    + long o = *po, r;
    +
    + r = local_cmpxchg(l, o, n);
    + if (unlikely(r != o))
    + *po = r;
    +
    + return likely(r == o);
    +}
    +
    static __inline__ long local_xchg(local_t *l, long n)
    {
    long t;
    diff --git a/arch/x86/include/asm/local.h b/arch/x86/include/asm/local.h
    index 349a47a..56d4ef6 100644
    --- a/arch/x86/include/asm/local.h
    +++ b/arch/x86/include/asm/local.h
    @@ -120,8 +120,17 @@ static inline long local_sub_return(long i, local_t *l)
    #define local_inc_return(l) (local_add_return(1, l))
    #define local_dec_return(l) (local_sub_return(1, l))

    -#define local_cmpxchg(l, o, n) \
    - (cmpxchg_local(&((l)->a.counter), (o), (n)))
    +static inline long local_cmpxchg(local_t *l, long old, long new)
    +{
    + return cmpxchg_local(&l->a.counter, old, new);
    +}
    +
    +static inline bool local_try_cmpxchg(local_t *l, long *old, long new)
    +{
    + typeof(l->a.counter) *__old = (typeof(l->a.counter) *) old;
    + return try_cmpxchg_local(&l->a.counter, __old, new);
    +}
    +
    /* Always has a lock prefix */
    #define local_xchg(l, n) (xchg(&((l)->a.counter), (n)))

    \
     
     \ /
      Last update: 2023-04-29 09:04    [W:6.672 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site