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 Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxx/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@xxxxxxxxx/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@xxxxxxxxx>
> > | Closes: https://lore.kernel.org/oe-kbuild-all/202404021504.YTP51bL3-lkp@xxxxxxxxx/
> 
> 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"                          \





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux