All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yujie Liu <yujie.liu@intel.com>
To: "Paul E. McKenney" <paulmck@kernel.org>
Cc: kernel test robot <lkp@intel.com>,
	<oe-kbuild-all@lists.linux.dev>,
	"Linux Memory Management List" <linux-mm@kvack.org>
Subject: Re: [linux-next:master 2559/3220] arch/riscv/include/asm/cmpxchg.h:329:23: warning: assignment to 'struct tty_struct *' from 'uintptr_t' {aka 'long unsigned int'} makes pointer from integer without a cast
Date: Wed, 3 Apr 2024 14:57:54 +0800	[thread overview]
Message-ID: <Zgz98szFLLjTIZSO@yujie-X299> (raw)
In-Reply-To: <55cfb596-8b21-4177-ab4c-0d531fb74c86@paulmck-laptop>

Hi Paul,

On Tue, Apr 02, 2024 at 10:20:59AM -0700, Paul E. McKenney wrote:
> On Tue, Apr 02, 2024 at 03:08:07PM +0800, kernel test robot wrote:
> > tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
> > head:   c0b832517f627ead3388c6f0c74e8ac10ad5774b
> > commit: df35ee400e06b23ecd44fdb66451a5343932f834 [2559/3220] riscv: Emulate one-byte and two-byte cmpxchg
> > config: riscv-randconfig-r061-20240402 (https://download.01.org/0day-ci/archive/20240402/202404021504.YTP51bL3-lkp@intel.com/config)
> > compiler: riscv64-linux-gcc (GCC) 13.2.0
> > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240402/202404021504.YTP51bL3-lkp@intel.com/reproduce)
> > 
> > If you fix the issue in a separate patch/commit (i.e. not just a new version of
> > the same patch/commit), kindly add following tags
> > | Reported-by: kernel test robot <lkp@intel.com>
> > | Closes: https://lore.kernel.org/oe-kbuild-all/202404021504.YTP51bL3-lkp@intel.com/
> 
> One fix leads to another.  ;-)
> 
> Does the patch at the end of this email clear things up?

Please kindly see the inline comments.

> 
> 							Thanx, Paul
> 
> > All warnings (new ones prefixed by >>):
> > 
> >    In file included from arch/riscv/include/asm/atomic.h:19,
> >                     from include/linux/atomic.h:7,
> >                     from include/linux/cpumask.h:14,
> >                     from include/linux/smp.h:13,
> >                     from include/linux/lockdep.h:14,
> >                     from include/linux/spinlock.h:63,
> >                     from include/linux/mmzone.h:8,
> >                     from include/linux/gfp.h:7,
> >                     from include/linux/slab.h:16,
> >                     from drivers/accessibility/speakup/selection.c:2:
> >    drivers/accessibility/speakup/selection.c: In function 'speakup_set_selection':
> >    arch/riscv/include/asm/cmpxchg.h:329:62: warning: passing argument 2 of 'cmpxchg_emu_u8' makes integer from pointer without a cast [-Wint-conversion]
> >      329 |                 __ret = cmpxchg_emu_u8((volatile u8 *)__ptr, __old, __new); \
> >          |                                                              ^~~~~
> >          |                                                              |
> >          |                                                              struct tty_struct *

This warning is fixed after adding uintptr_t cast for __old and __new.

> >    arch/riscv/include/asm/cmpxchg.h:368:30: note: in expansion of macro '__cmpxchg'
> >      368 |         (__typeof__(*(ptr))) __cmpxchg((ptr),                           \
> >          |                              ^~~~~~~~~
> >    include/linux/atomic/atomic-arch-fallback.h:55:21: note: in expansion of macro 'arch_cmpxchg'
> >       55 | #define raw_cmpxchg arch_cmpxchg
> >          |                     ^~~~~~~~~~~~
> >    include/linux/atomic/atomic-instrumented.h:4788:9: note: in expansion of macro 'raw_cmpxchg'
> >     4788 |         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
> >          |         ^~~~~~~~~~~
> >    drivers/accessibility/speakup/selection.c:71:13: note: in expansion of macro 'cmpxchg'
> >       71 |         if (cmpxchg(&speakup_sel_work.tty, NULL, tty)) {
> >          |             ^~~~~~~
> >    In file included from arch/riscv/include/asm/cmpxchg.h:12:
> >    include/linux/cmpxchg-emu.h:13:52: note: expected 'uintptr_t' {aka 'long unsigned int'} but argument is of type 'struct tty_struct *'
> >       13 | uintptr_t cmpxchg_emu_u8(volatile u8 *p, uintptr_t old, uintptr_t new);
> >          |                                          ~~~~~~~~~~^~~
> >    arch/riscv/include/asm/cmpxchg.h:329:69: warning: passing argument 3 of 'cmpxchg_emu_u8' makes integer from pointer without a cast [-Wint-conversion]
> >      329 |                 __ret = cmpxchg_emu_u8((volatile u8 *)__ptr, __old, __new); \
> >          |                                                                     ^~~~~
> >          |                                                                     |
> >          |                                                                     struct tty_struct *

So is this one.

> >    arch/riscv/include/asm/cmpxchg.h:368:30: note: in expansion of macro '__cmpxchg'
> >      368 |         (__typeof__(*(ptr))) __cmpxchg((ptr),                           \
> >          |                              ^~~~~~~~~
> >    include/linux/atomic/atomic-arch-fallback.h:55:21: note: in expansion of macro 'arch_cmpxchg'
> >       55 | #define raw_cmpxchg arch_cmpxchg
> >          |                     ^~~~~~~~~~~~
> >    include/linux/atomic/atomic-instrumented.h:4788:9: note: in expansion of macro 'raw_cmpxchg'
> >     4788 |         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
> >          |         ^~~~~~~~~~~
> >    drivers/accessibility/speakup/selection.c:71:13: note: in expansion of macro 'cmpxchg'
> >       71 |         if (cmpxchg(&speakup_sel_work.tty, NULL, tty)) {
> >          |             ^~~~~~~
> >    include/linux/cmpxchg-emu.h:13:67: note: expected 'uintptr_t' {aka 'long unsigned int'} but argument is of type 'struct tty_struct *'
> >       13 | uintptr_t cmpxchg_emu_u8(volatile u8 *p, uintptr_t old, uintptr_t new);
> >          |                                                         ~~~~~~~~~~^~~
> > >> arch/riscv/include/asm/cmpxchg.h:329:23: warning: assignment to 'struct tty_struct *' from 'uintptr_t' {aka 'long unsigned int'} makes pointer from integer without a cast [-Wint-conversion]
> >      329 |                 __ret = cmpxchg_emu_u8((volatile u8 *)__ptr, __old, __new); \
> >          |                       ^

This warning still exists.

Seems it needs another cast like below to fix this warning:

   __ret = (__typeof__(*(ptr)))cmpxchg_emu_u8((volatile u8 *)__ptr, (uintptr_t)__old, (uintptr_t)__new);

> >    arch/riscv/include/asm/cmpxchg.h:368:30: note: in expansion of macro '__cmpxchg'
> >      368 |         (__typeof__(*(ptr))) __cmpxchg((ptr),                           \
> >          |                              ^~~~~~~~~
> >    include/linux/atomic/atomic-arch-fallback.h:55:21: note: in expansion of macro 'arch_cmpxchg'
> >       55 | #define raw_cmpxchg arch_cmpxchg
> >          |                     ^~~~~~~~~~~~
> >    include/linux/atomic/atomic-instrumented.h:4788:9: note: in expansion of macro 'raw_cmpxchg'
> >     4788 |         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
> >          |         ^~~~~~~~~~~
> >    drivers/accessibility/speakup/selection.c:71:13: note: in expansion of macro 'cmpxchg'
> >       71 |         if (cmpxchg(&speakup_sel_work.tty, NULL, tty)) {
> >          |             ^~~~~~~
> >    arch/riscv/include/asm/cmpxchg.h:333:64: warning: passing argument 2 of 'cmpxchg_emu_u16' makes integer from pointer without a cast [-Wint-conversion]
> >      333 |                 __ret = cmpxchg_emu_u16((volatile u16 *)__ptr, __old, __new); \
> >          |                                                                ^~~~~
> >          |                                                                |
> >          |                                                                struct tty_struct *
> >    arch/riscv/include/asm/cmpxchg.h:368:30: note: in expansion of macro '__cmpxchg'
> >      368 |         (__typeof__(*(ptr))) __cmpxchg((ptr),                           \
> >          |                              ^~~~~~~~~
> >    include/linux/atomic/atomic-arch-fallback.h:55:21: note: in expansion of macro 'arch_cmpxchg'
> >       55 | #define raw_cmpxchg arch_cmpxchg
> >          |                     ^~~~~~~~~~~~
> >    include/linux/atomic/atomic-instrumented.h:4788:9: note: in expansion of macro 'raw_cmpxchg'
> >     4788 |         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
> >          |         ^~~~~~~~~~~
> >    drivers/accessibility/speakup/selection.c:71:13: note: in expansion of macro 'cmpxchg'
> >       71 |         if (cmpxchg(&speakup_sel_work.tty, NULL, tty)) {
> >          |             ^~~~~~~
> >    include/linux/cmpxchg-emu.h:14:54: note: expected 'uintptr_t' {aka 'long unsigned int'} but argument is of type 'struct tty_struct *'
> >       14 | uintptr_t cmpxchg_emu_u16(volatile u16 *p, uintptr_t old, uintptr_t new);
> >          |                                            ~~~~~~~~~~^~~
> >    arch/riscv/include/asm/cmpxchg.h:333:71: warning: passing argument 3 of 'cmpxchg_emu_u16' makes integer from pointer without a cast [-Wint-conversion]
> >      333 |                 __ret = cmpxchg_emu_u16((volatile u16 *)__ptr, __old, __new); \
> >          |                                                                       ^~~~~
> >          |                                                                       |
> >          |                                                                       struct tty_struct *
> >    arch/riscv/include/asm/cmpxchg.h:368:30: note: in expansion of macro '__cmpxchg'
> >      368 |         (__typeof__(*(ptr))) __cmpxchg((ptr),                           \
> >          |                              ^~~~~~~~~
> >    include/linux/atomic/atomic-arch-fallback.h:55:21: note: in expansion of macro 'arch_cmpxchg'
> >       55 | #define raw_cmpxchg arch_cmpxchg
> >          |                     ^~~~~~~~~~~~
> >    include/linux/atomic/atomic-instrumented.h:4788:9: note: in expansion of macro 'raw_cmpxchg'
> >     4788 |         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
> >          |         ^~~~~~~~~~~
> >    drivers/accessibility/speakup/selection.c:71:13: note: in expansion of macro 'cmpxchg'
> >       71 |         if (cmpxchg(&speakup_sel_work.tty, NULL, tty)) {
> >          |             ^~~~~~~
> >    include/linux/cmpxchg-emu.h:14:69: note: expected 'uintptr_t' {aka 'long unsigned int'} but argument is of type 'struct tty_struct *'
> >       14 | uintptr_t cmpxchg_emu_u16(volatile u16 *p, uintptr_t old, uintptr_t new);
> >          |                                                           ~~~~~~~~~~^~~
> >    arch/riscv/include/asm/cmpxchg.h:333:23: warning: assignment to 'struct tty_struct *' from 'uintptr_t' {aka 'long unsigned int'} makes pointer from integer without a cast [-Wint-conversion]
> >      333 |                 __ret = cmpxchg_emu_u16((volatile u16 *)__ptr, __old, __new); \
> >          |                       ^
> >    arch/riscv/include/asm/cmpxchg.h:368:30: note: in expansion of macro '__cmpxchg'
> >      368 |         (__typeof__(*(ptr))) __cmpxchg((ptr),                           \
> >          |                              ^~~~~~~~~
> >    include/linux/atomic/atomic-arch-fallback.h:55:21: note: in expansion of macro 'arch_cmpxchg'
> >       55 | #define raw_cmpxchg arch_cmpxchg
> >          |                     ^~~~~~~~~~~~
> >    include/linux/atomic/atomic-instrumented.h:4788:9: note: in expansion of macro 'raw_cmpxchg'
> >     4788 |         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
> >          |         ^~~~~~~~~~~
> >    drivers/accessibility/speakup/selection.c:71:13: note: in expansion of macro 'cmpxchg'
> >       71 |         if (cmpxchg(&speakup_sel_work.tty, NULL, tty)) {
> >          |             ^~~~~~~
> >    drivers/accessibility/speakup/selection.c: In function 'speakup_paste_selection':
> >    arch/riscv/include/asm/cmpxchg.h:329:62: warning: passing argument 2 of 'cmpxchg_emu_u8' makes integer from pointer without a cast [-Wint-conversion]
> >      329 |                 __ret = cmpxchg_emu_u8((volatile u8 *)__ptr, __old, __new); \
> >          |                                                              ^~~~~
> >          |                                                              |
> >          |                                                              struct tty_struct *
> >    arch/riscv/include/asm/cmpxchg.h:368:30: note: in expansion of macro '__cmpxchg'
> >      368 |         (__typeof__(*(ptr))) __cmpxchg((ptr),                           \
> >          |                              ^~~~~~~~~
> >    include/linux/atomic/atomic-arch-fallback.h:55:21: note: in expansion of macro 'arch_cmpxchg'
> >       55 | #define raw_cmpxchg arch_cmpxchg
> >          |                     ^~~~~~~~~~~~
> >    include/linux/atomic/atomic-instrumented.h:4788:9: note: in expansion of macro 'raw_cmpxchg'
> >     4788 |         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
> >          |         ^~~~~~~~~~~
> >    drivers/accessibility/speakup/selection.c:124:13: note: in expansion of macro 'cmpxchg'
> >      124 |         if (cmpxchg(&speakup_paste_work.tty, NULL, tty)) {
> >          |             ^~~~~~~
> >    include/linux/cmpxchg-emu.h:13:52: note: expected 'uintptr_t' {aka 'long unsigned int'} but argument is of type 'struct tty_struct *'
> >       13 | uintptr_t cmpxchg_emu_u8(volatile u8 *p, uintptr_t old, uintptr_t new);
> >          |                                          ~~~~~~~~~~^~~
> >    arch/riscv/include/asm/cmpxchg.h:329:69: warning: passing argument 3 of 'cmpxchg_emu_u8' makes integer from pointer without a cast [-Wint-conversion]
> >      329 |                 __ret = cmpxchg_emu_u8((volatile u8 *)__ptr, __old, __new); \
> >          |                                                                     ^~~~~
> >          |                                                                     |
> >          |                                                                     struct tty_struct *
> >    arch/riscv/include/asm/cmpxchg.h:368:30: note: in expansion of macro '__cmpxchg'
> >      368 |         (__typeof__(*(ptr))) __cmpxchg((ptr),                           \
> >          |                              ^~~~~~~~~
> >    include/linux/atomic/atomic-arch-fallback.h:55:21: note: in expansion of macro 'arch_cmpxchg'
> >       55 | #define raw_cmpxchg arch_cmpxchg
> >          |                     ^~~~~~~~~~~~
> >    include/linux/atomic/atomic-instrumented.h:4788:9: note: in expansion of macro 'raw_cmpxchg'
> >     4788 |         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
> >          |         ^~~~~~~~~~~
> >    drivers/accessibility/speakup/selection.c:124:13: note: in expansion of macro 'cmpxchg'
> >      124 |         if (cmpxchg(&speakup_paste_work.tty, NULL, tty)) {
> >          |             ^~~~~~~
> >    include/linux/cmpxchg-emu.h:13:67: note: expected 'uintptr_t' {aka 'long unsigned int'} but argument is of type 'struct tty_struct *'
> >       13 | uintptr_t cmpxchg_emu_u8(volatile u8 *p, uintptr_t old, uintptr_t new);
> >          |                                                         ~~~~~~~~~~^~~
> > >> arch/riscv/include/asm/cmpxchg.h:329:23: warning: assignment to 'struct tty_struct *' from 'uintptr_t' {aka 'long unsigned int'} makes pointer from integer without a cast [-Wint-conversion]
> >      329 |                 __ret = cmpxchg_emu_u8((volatile u8 *)__ptr, __old, __new); \
> >          |                       ^
> >    arch/riscv/include/asm/cmpxchg.h:368:30: note: in expansion of macro '__cmpxchg'
> >      368 |         (__typeof__(*(ptr))) __cmpxchg((ptr),                           \
> >          |                              ^~~~~~~~~
> >    include/linux/atomic/atomic-arch-fallback.h:55:21: note: in expansion of macro 'arch_cmpxchg'
> >       55 | #define raw_cmpxchg arch_cmpxchg
> >          |                     ^~~~~~~~~~~~
> >    include/linux/atomic/atomic-instrumented.h:4788:9: note: in expansion of macro 'raw_cmpxchg'
> >     4788 |         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
> >          |         ^~~~~~~~~~~
> >    drivers/accessibility/speakup/selection.c:124:13: note: in expansion of macro 'cmpxchg'
> >      124 |         if (cmpxchg(&speakup_paste_work.tty, NULL, tty)) {
> >          |             ^~~~~~~
> >    arch/riscv/include/asm/cmpxchg.h:333:64: warning: passing argument 2 of 'cmpxchg_emu_u16' makes integer from pointer without a cast [-Wint-conversion]
> >      333 |                 __ret = cmpxchg_emu_u16((volatile u16 *)__ptr, __old, __new); \
> >          |                                                                ^~~~~
> >          |                                                                |
> >          |                                                                struct tty_struct *
> >    arch/riscv/include/asm/cmpxchg.h:368:30: note: in expansion of macro '__cmpxchg'
> >      368 |         (__typeof__(*(ptr))) __cmpxchg((ptr),                           \
> >          |                              ^~~~~~~~~
> >    include/linux/atomic/atomic-arch-fallback.h:55:21: note: in expansion of macro 'arch_cmpxchg'
> >       55 | #define raw_cmpxchg arch_cmpxchg
> >          |                     ^~~~~~~~~~~~
> >    include/linux/atomic/atomic-instrumented.h:4788:9: note: in expansion of macro 'raw_cmpxchg'
> >     4788 |         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
> >          |         ^~~~~~~~~~~
> >    drivers/accessibility/speakup/selection.c:124:13: note: in expansion of macro 'cmpxchg'
> >      124 |         if (cmpxchg(&speakup_paste_work.tty, NULL, tty)) {
> >          |             ^~~~~~~
> >    include/linux/cmpxchg-emu.h:14:54: note: expected 'uintptr_t' {aka 'long unsigned int'} but argument is of type 'struct tty_struct *'
> >       14 | uintptr_t cmpxchg_emu_u16(volatile u16 *p, uintptr_t old, uintptr_t new);
> >          |                                            ~~~~~~~~~~^~~
> >    arch/riscv/include/asm/cmpxchg.h:333:71: warning: passing argument 3 of 'cmpxchg_emu_u16' makes integer from pointer without a cast [-Wint-conversion]
> >      333 |                 __ret = cmpxchg_emu_u16((volatile u16 *)__ptr, __old, __new); \
> >          |                                                                       ^~~~~
> >          |                                                                       |
> >          |                                                                       struct tty_struct *
> >    arch/riscv/include/asm/cmpxchg.h:368:30: note: in expansion of macro '__cmpxchg'
> >      368 |         (__typeof__(*(ptr))) __cmpxchg((ptr),                           \
> >          |                              ^~~~~~~~~
> >    include/linux/atomic/atomic-arch-fallback.h:55:21: note: in expansion of macro 'arch_cmpxchg'
> >       55 | #define raw_cmpxchg arch_cmpxchg
> >          |                     ^~~~~~~~~~~~
> >    include/linux/atomic/atomic-instrumented.h:4788:9: note: in expansion of macro 'raw_cmpxchg'
> >     4788 |         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
> >          |         ^~~~~~~~~~~
> >    drivers/accessibility/speakup/selection.c:124:13: note: in expansion of macro 'cmpxchg'
> >      124 |         if (cmpxchg(&speakup_paste_work.tty, NULL, tty)) {
> >          |             ^~~~~~~
> >    include/linux/cmpxchg-emu.h:14:69: note: expected 'uintptr_t' {aka 'long unsigned int'} but argument is of type 'struct tty_struct *'
> >       14 | uintptr_t cmpxchg_emu_u16(volatile u16 *p, uintptr_t old, uintptr_t new);
> >          |                                                           ~~~~~~~~~~^~~
> >    arch/riscv/include/asm/cmpxchg.h:333:23: warning: assignment to 'struct tty_struct *' from 'uintptr_t' {aka 'long unsigned int'} makes pointer from integer without a cast [-Wint-conversion]
> >      333 |                 __ret = cmpxchg_emu_u16((volatile u16 *)__ptr, __old, __new); \
> >          |                       ^
> >    arch/riscv/include/asm/cmpxchg.h:368:30: note: in expansion of macro '__cmpxchg'
> >      368 |         (__typeof__(*(ptr))) __cmpxchg((ptr),                           \
> >          |                              ^~~~~~~~~
> >    include/linux/atomic/atomic-arch-fallback.h:55:21: note: in expansion of macro 'arch_cmpxchg'
> >       55 | #define raw_cmpxchg arch_cmpxchg
> >          |                     ^~~~~~~~~~~~
> >    include/linux/atomic/atomic-instrumented.h:4788:9: note: in expansion of macro 'raw_cmpxchg'
> >     4788 |         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
> >          |         ^~~~~~~~~~~
> >    drivers/accessibility/speakup/selection.c:124:13: note: in expansion of macro 'cmpxchg'
> >      124 |         if (cmpxchg(&speakup_paste_work.tty, NULL, tty)) {
> >          |             ^~~~~~~
> >    drivers/accessibility/speakup/selection.c: In function 'speakup_set_selection':
> >    arch/riscv/include/asm/cmpxchg.h:333:23: warning: this statement may fall through [-Wimplicit-fallthrough=]
> >      333 |                 __ret = cmpxchg_emu_u16((volatile u16 *)__ptr, __old, __new); \
> >          |                 ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Here is a fallthrough warning. Looks like a copy-paste typo. The "break"
line and the "__ret = ..." line need to be swapped.

> >    arch/riscv/include/asm/cmpxchg.h:368:30: note: in expansion of macro '__cmpxchg'
> >      368 |         (__typeof__(*(ptr))) __cmpxchg((ptr),                           \
> >          |                              ^~~~~~~~~
> >    include/linux/atomic/atomic-arch-fallback.h:55:21: note: in expansion of macro 'arch_cmpxchg'
> >       55 | #define raw_cmpxchg arch_cmpxchg
> >          |                     ^~~~~~~~~~~~
> >    include/linux/atomic/atomic-instrumented.h:4788:9: note: in expansion of macro 'raw_cmpxchg'
> >     4788 |         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
> >          |         ^~~~~~~~~~~
> >    drivers/accessibility/speakup/selection.c:71:13: note: in expansion of macro 'cmpxchg'
> >       71 |         if (cmpxchg(&speakup_sel_work.tty, NULL, tty)) {
> >          |             ^~~~~~~
> >    arch/riscv/include/asm/cmpxchg.h:334:9: note: here
> >      334 |         case 4:                                                         \
> >          |         ^~~~
> >    arch/riscv/include/asm/cmpxchg.h:368:30: note: in expansion of macro '__cmpxchg'
> >      368 |         (__typeof__(*(ptr))) __cmpxchg((ptr),                           \
> >          |                              ^~~~~~~~~
> >    include/linux/atomic/atomic-arch-fallback.h:55:21: note: in expansion of macro 'arch_cmpxchg'
> >       55 | #define raw_cmpxchg arch_cmpxchg
> >          |                     ^~~~~~~~~~~~
> >    include/linux/atomic/atomic-instrumented.h:4788:9: note: in expansion of macro 'raw_cmpxchg'
> >     4788 |         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
> >          |         ^~~~~~~~~~~
> >    drivers/accessibility/speakup/selection.c:71:13: note: in expansion of macro 'cmpxchg'
> >       71 |         if (cmpxchg(&speakup_sel_work.tty, NULL, tty)) {
> >          |             ^~~~~~~
> > 
> > 
> > vim +329 arch/riscv/include/asm/cmpxchg.h
> > 
> >    319	
> >    320	#define __cmpxchg(ptr, old, new, size)					\
> >    321	({									\
> >    322		__typeof__(ptr) __ptr = (ptr);					\
> >    323		__typeof__(*(ptr)) __old = (old);				\
> >    324		__typeof__(*(ptr)) __new = (new);				\
> >    325		__typeof__(*(ptr)) __ret;					\
> >    326		register unsigned int __rc;					\
> >    327		switch (size) {							\
> >    328		case 1:								\
> >  > 329			__ret = cmpxchg_emu_u8((volatile u8 *)__ptr, __old, __new); \
> >    330			break;							\
> >    331		case 2:								\
> >    332			break;							\
> >    333			__ret = cmpxchg_emu_u16((volatile u16 *)__ptr, __old, __new); \

Seems "break" is supposed to come after the assignment of __ret.

> >    334		case 4:								\
> >    335			__asm__ __volatile__ (					\
> >    336				"0:	lr.w %0, %2\n"				\
> >    337				"	bne  %0, %z3, 1f\n"			\
> >    338				"	sc.w.rl %1, %z4, %2\n"			\
> >    339				"	bnez %1, 0b\n"				\
> >    340				RISCV_FULL_BARRIER				\
> >    341				"1:\n"						\
> >    342				: "=&r" (__ret), "=&r" (__rc), "+A" (*__ptr)	\
> >    343				: "rJ" ((long)__old), "rJ" (__new)		\
> >    344				: "memory");					\
> >    345			break;							\
> >    346		case 8:								\
> >    347			__asm__ __volatile__ (					\
> >    348				"0:	lr.d %0, %2\n"				\
> >    349				"	bne %0, %z3, 1f\n"			\
> >    350				"	sc.d.rl %1, %z4, %2\n"			\
> >    351				"	bnez %1, 0b\n"				\
> >    352				RISCV_FULL_BARRIER				\
> >    353				"1:\n"						\
> >    354				: "=&r" (__ret), "=&r" (__rc), "+A" (*__ptr)	\
> >    355				: "rJ" (__old), "rJ" (__new)			\
> >    356				: "memory");					\
> >    357			break;							\
> >    358		default:							\
> >    359			BUILD_BUG();						\
> >    360		}								\
> >    361		__ret;								\
> >    362	})
> >    363	
> > 
> > -- 
> > 0-DAY CI Kernel Test Service
> > https://github.com/intel/lkp-tests/wiki
> 
> ------------------------------------------------------------------------
> 
> diff --git a/arch/riscv/include/asm/cmpxchg.h b/arch/riscv/include/asm/cmpxchg.h
> index a5b377481785c..fb1ac86ac2bf6 100644
> --- a/arch/riscv/include/asm/cmpxchg.h
> +++ b/arch/riscv/include/asm/cmpxchg.h
> @@ -172,11 +172,11 @@
>  	register unsigned int __rc;					\
>  	switch (size) {							\
>  	case 1:								\
> -		__ret = cmpxchg_emu_u8((volatile u8 *)__ptr, __old, __new); \
> +		__ret = cmpxchg_emu_u8((volatile u8 *)__ptr, (uintptr_t)__old, (uintptr_t)__new); \
>  		break;							\
>  	case 2:								\
>  		break;							\
> -		__ret = cmpxchg_emu_u16((volatile u16 *)__ptr, __old, __new); \
> +		__ret = cmpxchg_emu_u16((volatile u16 *)__ptr, (uintptr_t)__old, (uintptr_t)__new); \
>  	case 4:								\
>  		__asm__ __volatile__ (					\
>  			"0:	lr.w %0, %2\n"				\

I drafted an extended fix patch as below. Could you help review? Not
sure if similar fixes should also be applied to the patches for other
architectures in the series?

Thanks,
Yujie

-------------------------------------------------------------------------

diff --git a/arch/riscv/include/asm/cmpxchg.h b/arch/riscv/include/asm/cmpxchg.h
index a5b377481785c..4d5c281b1aced 100644
--- a/arch/riscv/include/asm/cmpxchg.h
+++ b/arch/riscv/include/asm/cmpxchg.h
@@ -172,11 +172,11 @@
        register unsigned int __rc;                                     \
        switch (size) {                                                 \
        case 1:                                                         \
-               __ret = cmpxchg_emu_u8((volatile u8 *)__ptr, __old, __new); \
+               __ret = (__typeof__(*(ptr)))cmpxchg_emu_u8((volatile u8 *)__ptr, (uintptr_t)__old, (uintptr_t)__new); \
                break;                                                  \
        case 2:                                                         \
+               __ret = (__typeof__(*(ptr)))cmpxchg_emu_u16((volatile u16 *)__ptr, (uintptr_t)__old, (uintptr_t)__new); \
                break;                                                  \
-               __ret = cmpxchg_emu_u16((volatile u16 *)__ptr, __old, __new); \
        case 4:                                                         \
                __asm__ __volatile__ (                                  \
                        "0:     lr.w %0, %2\n"                          \
@@ -222,11 +222,11 @@
        register unsigned int __rc;                                     \
        switch (size) {                                                 \
        case 1:                                                         \
-               __ret = cmpxchg_emu_u8((volatile u8 *)__ptr, __old, __new); \
+               __ret = (__typeof__(*(ptr)))cmpxchg_emu_u8((volatile u8 *)__ptr, (uintptr_t)__old, (uintptr_t)__new); \
                break;                                                  \
        case 2:                                                         \
+               __ret = (__typeof__(*(ptr)))cmpxchg_emu_u16((volatile u16 *)__ptr, (uintptr_t)__old, (uintptr_t)__new); \
                break;                                                  \
-               __ret = cmpxchg_emu_u16((volatile u16 *)__ptr, __old, __new); \
        case 4:                                                         \
                __asm__ __volatile__ (                                  \
                        "0:     lr.w %0, %2\n"                          \
@@ -274,11 +274,11 @@
        register unsigned int __rc;                                     \
        switch (size) {                                                 \
        case 1:                                                         \
-               __ret = cmpxchg_emu_u8((volatile u8 *)__ptr, __old, __new); \
+               __ret = (__typeof__(*(ptr)))cmpxchg_emu_u8((volatile u8 *)__ptr, (uintptr_t)__old, (uintptr_t)__new); \
                break;                                                  \
        case 2:                                                         \
+               __ret = (__typeof__(*(ptr)))cmpxchg_emu_u16((volatile u16 *)__ptr, (uintptr_t)__old, (uintptr_t)__new); \
                break;                                                  \
-               __ret = cmpxchg_emu_u16((volatile u16 *)__ptr, __old, __new); \
        case 4:                                                         \
                __asm__ __volatile__ (                                  \
                        RISCV_RELEASE_BARRIER                           \
@@ -326,11 +326,11 @@
        register unsigned int __rc;                                     \
        switch (size) {                                                 \
        case 1:                                                         \
-               __ret = cmpxchg_emu_u8((volatile u8 *)__ptr, __old, __new); \
+               __ret = (__typeof__(*(ptr)))cmpxchg_emu_u8((volatile u8 *)__ptr, (uintptr_t)__old, (uintptr_t)__new); \
                break;                                                  \
        case 2:                                                         \
+               __ret = (__typeof__(*(ptr)))cmpxchg_emu_u16((volatile u16 *)__ptr, (uintptr_t)__old, (uintptr_t)__new); \
                break;                                                  \
-               __ret = cmpxchg_emu_u16((volatile u16 *)__ptr, __old, __new); \
        case 4:                                                         \
                __asm__ __volatile__ (                                  \
                        "0:     lr.w %0, %2\n"                          \


  reply	other threads:[~2024-04-03  7:04 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-02  7:08 [linux-next:master 2559/3220] arch/riscv/include/asm/cmpxchg.h:329:23: warning: assignment to 'struct tty_struct *' from 'uintptr_t' {aka 'long unsigned int'} makes pointer from integer without a cast kernel test robot
2024-04-02 17:20 ` Paul E. McKenney
2024-04-03  6:57   ` Yujie Liu [this message]
2024-04-03 22:21     ` Paul E. McKenney

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Zgz98szFLLjTIZSO@yujie-X299 \
    --to=yujie.liu@intel.com \
    --cc=linux-mm@kvack.org \
    --cc=lkp@intel.com \
    --cc=oe-kbuild-all@lists.linux.dev \
    --cc=paulmck@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.