Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Feb 2018 15:20:21 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r329371 - head/sys/compat/linuxkpi/common/include/asm
Message-ID:  <201802161520.w1GFKLiA049085@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <johalun0@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__)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201802161520.w1GFKLiA049085>