DORMANTno replies

[PATCH] powerpc: Silence sparse warnings caused by type casting in (cmp)xchg

From: "Christophe Leroy (CS GROUP)" <chleroy@kernel.org>
Date: 2026-08-13 08:17:14
Also in: lkml
Subsystem: linux for powerpc (32-bit and 64-bit), the rest · Maintainers: Madhavan Srinivasan, Linus Torvalds

Powerpc arch_cmpxchg() wrapper macros cast arguments to
'unsigned long' before calling the functions implementing the
operation. Some type annotations (e.g. __bitwise) generate
sparse warnings like:

  block/blk-crypto-fallback.c:164:17: warning: cast from restricted blk_status_t
  block/blk-crypto-fallback.c:164:17: warning: cast to restricted blk_status_t

Force casting in the macros to avoid the warnings:

Reported-by: kernel test robot <redacted>
Closes: https://lore.kernel.org/oe-kbuild-all/202606012339.rZAl6Xq8-lkp@intel.com/ (local)
Signed-off-by: Christophe Leroy (CS GROUP) <chleroy@kernel.org>
---
 arch/powerpc/include/asm/cmpxchg.h | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/arch/powerpc/include/asm/cmpxchg.h b/arch/powerpc/include/asm/cmpxchg.h
index dbb50c06f0bf..7264e33ef877 100644
--- a/arch/powerpc/include/asm/cmpxchg.h
+++ b/arch/powerpc/include/asm/cmpxchg.h
@@ -700,8 +700,9 @@ __cmpxchg_acquire(void *ptr, unsigned long old, unsigned long new,
   ({									 \
      __typeof__(*(ptr)) _o_ = (o);					 \
      __typeof__(*(ptr)) _n_ = (n);					 \
-     (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,		 \
-				    (unsigned long)_n_, sizeof(*(ptr))); \
+     (__force __typeof__(*(ptr)))					 \
+	__cmpxchg((ptr), (__force unsigned long)_o_,			 \
+		  (__force unsigned long)_n_, sizeof(*(ptr)));		 \
   })
 
 
@@ -709,26 +710,27 @@ __cmpxchg_acquire(void *ptr, unsigned long old, unsigned long new,
   ({									 \
      __typeof__(*(ptr)) _o_ = (o);					 \
      __typeof__(*(ptr)) _n_ = (n);					 \
-     (__typeof__(*(ptr))) __cmpxchg_local((ptr), (unsigned long)_o_,	 \
-				    (unsigned long)_n_, sizeof(*(ptr))); \
+     (__force __typeof__(*(ptr)))					 \
+	__cmpxchg_local((ptr), (__force unsigned long)_o_,		 \
+			(__force unsigned long)_n_, sizeof(*(ptr)));	 \
   })
 
 #define arch_cmpxchg_relaxed(ptr, o, n)					\
 ({									\
 	__typeof__(*(ptr)) _o_ = (o);					\
 	__typeof__(*(ptr)) _n_ = (n);					\
-	(__typeof__(*(ptr))) __cmpxchg_relaxed((ptr),			\
-			(unsigned long)_o_, (unsigned long)_n_,		\
-			sizeof(*(ptr)));				\
+	(__force __typeof__(*(ptr)))					\
+	  __cmpxchg_relaxed((ptr), (__force unsigned long)_o_,		\
+			    (__force unsigned long)_n_, sizeof(*(ptr)));\
 })
 
 #define arch_cmpxchg_acquire(ptr, o, n)					\
 ({									\
 	__typeof__(*(ptr)) _o_ = (o);					\
 	__typeof__(*(ptr)) _n_ = (n);					\
-	(__typeof__(*(ptr))) __cmpxchg_acquire((ptr),			\
-			(unsigned long)_o_, (unsigned long)_n_,		\
-			sizeof(*(ptr)));				\
+	(__force __typeof__(*(ptr)))					\
+	  __cmpxchg_acquire((ptr), (__force unsigned long)_o_,		\
+			    (__force unsigned long)_n_, sizeof(*(ptr)));\
 })
 #ifdef CONFIG_PPC64
 #define arch_cmpxchg64(ptr, o, n)					\
-- 
2.54.0

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help