lkml.org 
[lkml]   [2015]   [Jul]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[RFC][PATCH 11/24] metag: Provide atomic_{or,xor,and}
    Implement atomic logic ops -- atomic_{or,xor,and}.

    These will replace the atomic_{set,clear}_mask functions that are
    available on some archs.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    arch/metag/include/asm/atomic_lnkget.h | 35 ++++++---------------------------
    arch/metag/include/asm/atomic_lock1.h | 21 ++++++-------------
    2 files changed, 14 insertions(+), 42 deletions(-)

    --- a/arch/metag/include/asm/atomic_lnkget.h
    +++ b/arch/metag/include/asm/atomic_lnkget.h
    @@ -73,43 +73,22 @@ static inline int atomic_##op##_return(i

    ATOMIC_OPS(add)
    ATOMIC_OPS(sub)
    +ATOMIC_OP(and)
    +ATOMIC_OP(or)
    +ATOMIC_OP(xor)

    #undef ATOMIC_OPS
    #undef ATOMIC_OP_RETURN
    #undef ATOMIC_OP

    -static inline void atomic_clear_mask(unsigned int mask, atomic_t *v)
    +static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
    {
    - int temp;
    -
    - asm volatile (
    - "1: LNKGETD %0, [%1]\n"
    - " AND %0, %0, %2\n"
    - " LNKSETD [%1] %0\n"
    - " DEFR %0, TXSTAT\n"
    - " ANDT %0, %0, #HI(0x3f000000)\n"
    - " CMPT %0, #HI(0x02000000)\n"
    - " BNZ 1b\n"
    - : "=&d" (temp)
    - : "da" (&v->counter), "bd" (~mask)
    - : "cc");
    + atomic_and(~mask, v);
    }

    -static inline void atomic_set_mask(unsigned int mask, atomic_t *v)
    +static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
    {
    - int temp;
    -
    - asm volatile (
    - "1: LNKGETD %0, [%1]\n"
    - " OR %0, %0, %2\n"
    - " LNKSETD [%1], %0\n"
    - " DEFR %0, TXSTAT\n"
    - " ANDT %0, %0, #HI(0x3f000000)\n"
    - " CMPT %0, #HI(0x02000000)\n"
    - " BNZ 1b\n"
    - : "=&d" (temp)
    - : "da" (&v->counter), "bd" (mask)
    - : "cc");
    + atomic_or(mask, v);
    }

    static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
    --- a/arch/metag/include/asm/atomic_lock1.h
    +++ b/arch/metag/include/asm/atomic_lock1.h
    @@ -68,29 +68,22 @@ static inline int atomic_##op##_return(i

    ATOMIC_OPS(add, +=)
    ATOMIC_OPS(sub, -=)
    +ATOMIC_OP(and, &=)
    +ATOMIC_OP(or, |=)
    +ATOMIC_OP(xor, ^=)

    #undef ATOMIC_OPS
    #undef ATOMIC_OP_RETURN
    #undef ATOMIC_OP

    -static inline void atomic_clear_mask(unsigned int mask, atomic_t *v)
    +static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
    {
    - unsigned long flags;
    -
    - __global_lock1(flags);
    - fence();
    - v->counter &= ~mask;
    - __global_unlock1(flags);
    + atomic_and(~mask, v);
    }

    -static inline void atomic_set_mask(unsigned int mask, atomic_t *v)
    +static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
    {
    - unsigned long flags;
    -
    - __global_lock1(flags);
    - fence();
    - v->counter |= mask;
    - __global_unlock1(flags);
    + atomic_or(mask, v);
    }

    static inline int atomic_cmpxchg(atomic_t *v, int old, int new)



    \
     
     \ /
      Last update: 2015-07-09 20:21    [W:4.023 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site