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]

 



On Wed, Apr 03, 2024 at 02:57:54PM +0800, Yujie Liu wrote:
> 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.

Good points, thank you, and alleged fix in progress.  ;-)

							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