[PATCH] atomic_cmpxchg return type error



Hi,

I just noticed that a atomic_cmpxchg, that would be given an atomic64_t
parameter, would cast the return value as a (int). In the typical use of this
primitive, the result would be that the 32 MSB would be lost when comparing
against the original value. It also affects atomic_add_unless. Note that there
is no atomic64_cmpxchg nor atomic64_add_unless, which might make things a
little clearer.

Here is a quick fix for this against 2.6.18.

Regards,

Mathieu

-- BEGIN --
--- a/include/asm-x86_64/atomic.h
+++ b/include/asm-x86_64/atomic.h
@@ -388,7 +388,8 @@ static __inline__ long atomic64_sub_retu
#define atomic64_inc_return(v) (atomic64_add_return(1,v))
#define atomic64_dec_return(v) (atomic64_sub_return(1,v))

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

/**
@@ -402,7 +403,7 @@ #define atomic_xchg(v, new) (xchg(&((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))) \
-- END --


OpenPGP public key: http://krystal.dyndns.org:8080/key/compudj.gpg
Key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



Relevant Pages

  • Re: question on pthreads
    ... More majordomo info at http://vger.kernel.org/majordomo-info.html ... Please read the FAQ at http://www.tux.org/lkml/ ... restrict attr, int *restrict pshared); ...
    (Linux-Kernel)
  • Re: Boot failure with ext2 and initrds
    ... int goal_group; ... ext2_debug("using block group %d(%d)\n", ... More majordomo info at http://vger.kernel.org/majordomo-info.html ... Please read the FAQ at http://www.tux.org/lkml/ ...
    (Linux-Kernel)
  • Re: [PATCH] Avoid buffer overflows in get_user_pages()
    ... In particular, "len" is a signed int, and it is only checked at the ... So, if it is passed in as zero, the loop ... More majordomo info at http://vger.kernel.org/majordomo-info.html ... Please read the FAQ at http://www.tux.org/lkml/ ...
    (Linux-Kernel)
  • Re: FAQ Related - why cast?
    ... You must have the book version of the FAQ, since 12.42 is not in the ... So how is the cast useful? ... If the int returned by getcis negative, ... the result of the shift is ...
    (comp.lang.c)
  • Re: [PATCH] asm-generic/bitops/fls64.h
    ... The change is ok, I guess, but the cast should be a no-op (fls ... Maybe you see a compiler warning? ... More majordomo info at http://vger.kernel.org/majordomo-info.html ... Please read the FAQ at http://www.tux.org/lkml/ ...
    (Linux-Kernel)