[lkml]   [2007]   [Feb]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[PATCH 03/10] atomic.h : i386 type safety fix
    atomic.h : i386 type safety fix

    This patch removes an explicit cast to an integer type for the result returned
    by cmpxchg. It is not per se a problem on the i386 architecture, because
    sizeof(int) == sizeof(long), but whenever this code is cut'n'pasted to a
    different architecture (which happened at least for x86_64), it would simply
    accept passing an atomic64_t value as parameter to cmpxchg, xchg and
    add_unless, having 64 bits inputs casted to 32 bits.

    Signed-off-by: Mathieu Desnoyers <>

    --- a/include/asm-i386/atomic.h
    +++ b/include/asm-i386/atomic.h
    @@ -207,8 +207,8 @@ static __inline__ int atomic_sub_return(int i, atomic_t *v)
    return atomic_add_return(-i,v);

    -#define atomic_cmpxchg(v, old, new) ((int)cmpxchg(&((v)->counter), old, new))
    -#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
    +#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new)))
    +#define atomic_xchg(v, new) (xchg(&((v)->counter), (new)))

    * atomic_add_unless - add unless the number is a given value
    @@ -221,7 +221,7 @@ static __inline__ int atomic_sub_return(int i, atomic_t *v)
    #define atomic_add_unless(v, a, u) \
    ({ \
    - int c, old; \
    + __typeof__((v)->counter) c, old; \
    c = atomic_read(v); \
    for (;;) { \
    if (unlikely(c == (u))) \
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to
    More majordomo info at
    Please read the FAQ at
     \ /
      Last update: 2007-02-11 20:25    [W:0.020 / U:111.292 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site