Author: hselasky
Date: Fri Feb 16 15:20:21 2018
New Revision: 329371
URL: https://svnweb.freebsd.org/changeset/base/329371

Log:
  Allow the cmpxchg() macro in the LinuxKPI to work on pointers without
  generating compiler warnings, -Wint-conversion .
  
  Requested by: Johannes Lundberg <johal...@gmail.com>
  Sponsored by: Mellanox Technologies

Modified:
  head/sys/compat/linuxkpi/common/include/asm/atomic.h

Modified: head/sys/compat/linuxkpi/common/include/asm/atomic.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/asm/atomic.h        Fri Feb 16 
15:00:14 2018        (r329370)
+++ head/sys/compat/linuxkpi/common/include/asm/atomic.h        Fri Feb 16 
15:20:21 2018        (r329371)
@@ -159,36 +159,41 @@ atomic_cmpxchg(atomic_t *v, int old, int new)
        return (ret);
 }
 
-#define        cmpxchg(ptr, old, new) ({                               \
-       __typeof(*(ptr)) __ret;                                 \
-                                                               \
-       CTASSERT(sizeof(__ret) == 1 || sizeof(__ret) == 2 ||    \
-           sizeof(__ret) == 4 || sizeof(__ret) == 8);          \
-                                                               \
-       __ret = (old);                                          \
-       switch (sizeof(__ret)) {                                \
-       case 1:                                                 \
-               while (!atomic_fcmpset_8((volatile int8_t *)(ptr), \
-                   (int8_t *)&__ret, (new)) && __ret == (old)) \
-                       ;                                       \
-               break;                                          \
-       case 2:                                                 \
-               while (!atomic_fcmpset_16((volatile int16_t *)(ptr), \
-                   (int16_t *)&__ret, (new)) && __ret == (old)) \
-                       ;                                       \
-               break;                                          \
-       case 4:                                                 \
-               while (!atomic_fcmpset_32((volatile int32_t *)(ptr), \
-                   (int32_t *)&__ret, (new)) && __ret == (old)) \
-                       ;                                       \
-               break;                                          \
-       case 8:                                                 \
-               while (!atomic_fcmpset_64((volatile int64_t *)(ptr), \
-                   (int64_t *)&__ret, (new)) && __ret == (old)) \
-                       ;                                       \
-               break;                                          \
-       }                                                       \
-       __ret;                                                  \
+#define        cmpxchg(ptr, old, new) ({                                       
\
+       union {                                                         \
+               __typeof(*(ptr)) val;                                   \
+               u8 u8[];                                                \
+               u16 u16[];                                              \
+               u32 u32[];                                              \
+               u64 u64[];                                              \
+       } __ret = { .val = (old) }, __new = { .val = (new) };           \
+                                                                       \
+       CTASSERT(sizeof(__ret.val) == 1 || sizeof(__ret.val) == 2 ||    \
+           sizeof(__ret.val) == 4 || sizeof(__ret.val) == 8);          \
+                                                                       \
+       switch (sizeof(__ret.val)) {                                    \
+       case 1:                                                         \
+               while (!atomic_fcmpset_8((volatile u8 *)(ptr),          \
+                   __ret.u8, __new.u8[0]) && __ret.val == (old))       \
+                       ;                                               \
+               break;                                                  \
+       case 2:                                                         \
+               while (!atomic_fcmpset_16((volatile u16 *)(ptr),        \
+                   __ret.u16, __new.u16[0]) && __ret.val == (old))     \
+                       ;                                               \
+               break;                                                  \
+       case 4:                                                         \
+               while (!atomic_fcmpset_32((volatile u32 *)(ptr),        \
+                   __ret.u32, __new.u32[0]) && __ret.val == (old))     \
+                       ;                                               \
+               break;                                                  \
+       case 8:                                                         \
+               while (!atomic_fcmpset_64((volatile u64 *)(ptr),        \
+                   __ret.u64, __new.u64[0]) && __ret.val == (old))     \
+                       ;                                               \
+               break;                                                  \
+       }                                                               \
+       __ret.val;                                                      \
 })
 
 #define        cmpxchg_relaxed(...)    cmpxchg(__VA_ARGS__)
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to