atomic_add_unless macro does not handle arguments which use a local variable named c
Subsystems (2)
PATCH 1/1 atomic_add_unless macro does not handle arguments which use a local variable named c
atomic_add_unless is a macro so, bad things happen if the caller defines a local variable named c, just like like the local variable c defined by the macro. Thus, convert atomic_add_unless to a function. (bug triggered by net/ipv4/netfilter/ipt_CLUSTERIP.c: clusterip_config_find_get calls atomic_inc_not_zero)
Signed-off-by Mathieu Lacage <[email protected]>
include/asm-generic/atomic.h +17 -17
@@ -119,14 +119,23 @@ static inline void atomic_dec(atomic_t *v)#define atomic_dec_and_test (v) (atomic_sub_return(1, (v)) == 0)#define atomic_inc_and_test (v) (atomic_add_return(1, (v)) == 0) -#define atomic_add_unless (v, a, u) \ -({ \ - int c, old; \ - c = atomic_read(v); \ - while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \ - c = old; \ - c != (u); \ -}) +#define atomic_xchg (ptr, v) (xchg(&(ptr)->counter, (v))) +#define atomic_cmpxchg (v, old, new) (cmpxchg(&((v)->counter), (old), (new))) + +#define cmpxchg_local (ptr, o, n) \ + ((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\ + (unsigned long)(n), sizeof(*(ptr)))) + +#define cmpxchg64_local (ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) + +static inline int atomic_add_unless (atomic_t *v,int a,int u) +{ +int c, old; + c =atomic_read (v); +while (c != u && (old =atomic_cmpxchg (v, c, c + a)) != c) + c = old; +return c != u; +}#define atomic_inc_not_zero (v) atomic_add_unless((v), 1, 0)
@@ -140,15 +149,6 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)local_irq_restore (flags); } -#define atomic_xchg (ptr, v) (xchg(&(ptr)->counter, (v))) -#define atomic_cmpxchg (v, old, new) (cmpxchg(&((v)->counter), (old), (new))) - -#define cmpxchg_local (ptr, o, n) \ - ((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\ - (unsigned long)(n), sizeof(*(ptr)))) - -#define cmpxchg64_local (ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) -/* Assume that atomic operations are already serializing */ #define smp_mb__before_atomic_dec () barrier()#define smp_mb__after_atomic_dec () barrier()
Signature · 2 lines
Mathieu Lacage <[email protected]> Tel: +33 4 9238 5056