Messages in this thread | ![/](/images/icornerl.gif) | | From | Uros Bizjak <> | Date | Fri, 5 Apr 2024 17:16:46 +0200 | Subject | Re: [PATCH] x86/percpu: Use __force to cast from __percpu address space |
| |
On Fri, Apr 5, 2024 at 4:38 PM Nadav Amit <nadav.amit@gmail.com> wrote: > > > > > On 2 Apr 2024, at 20:50, Uros Bizjak <ubizjak@gmail.com> wrote: > > > > Fix sparse warning when casting from __percpu address space by using > > __force in the cast. x86 named address spaces are not considered to > > be subspaces of the generic (flat) address space, so explicit casts > > are required to convert pointers between these address spaces and the > > generic address space (the application should cast to uintptr_t and > > apply the segment base offset). The cast to uintptr_t removes > > __percpu address space tag and sparse reports: > > > > warning: cast removes address space '__percpu' of expression > > > > Use __force to inform sparse that the cast is intentional. > > > > Reported-by: Charlemagne Lasse <charlemagnelasse@gmail.com> > > Closes: https://lore.kernel.org/lkml/CAFGhKbzev7W4aHwhFPWwMZQEHenVgZUj7=aunFieVqZg3mt14A@mail.gmail.com/ > > Fixes: 9a462b9eafa6 ("x86/percpu: Use compiler segment prefix qualifier") > > Signed-off-by: Uros Bizjak <ubizjak@gmail.com> > > Cc: Nadav Amit <nadav.amit@gmail.com> > > Cc: Luc Van Oostenryck <luc.vanoostenryck@gmail.com> > > Cc: Ingo Molnar <mingo@kernel.org> > > Cc: Andy Lutomirski <luto@kernel.org> > > Cc: Brian Gerst <brgerst@gmail.com> > > Cc: Denys Vlasenko <dvlasenk@redhat.com> > > Cc: H. Peter Anvin <hpa@zytor.com> > > Cc: Linus Torvalds <torvalds@linux-foundation.org> > > Cc: Peter Zijlstra <peterz@infradead.org> > > Cc: Thomas Gleixner <tglx@linutronix.de> > > Cc: Josh Poimboeuf <jpoimboe@redhat.com> > > --- > > arch/x86/include/asm/percpu.h | 6 +++--- > > 1 file changed, 3 insertions(+), 3 deletions(-) > > > > diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h > > index 1f6404e0c428..20696df5d567 100644 > > --- a/arch/x86/include/asm/percpu.h > > +++ b/arch/x86/include/asm/percpu.h > > @@ -77,7 +77,7 @@ > > #define arch_raw_cpu_ptr(_ptr) \ > > ({ \ > > unsigned long tcp_ptr__ = __raw_my_cpu_offset; \ > > - tcp_ptr__ += (unsigned long)(_ptr); \ > > + tcp_ptr__ += (__force unsigned long)(_ptr); \ > > (typeof(*(_ptr)) __kernel __force *)tcp_ptr__; \ > > }) > > #else > > @@ -96,8 +96,8 @@ > > #endif /* CONFIG_SMP */ > > > > #define __my_cpu_type(var) typeof(var) __percpu_seg_override > > -#define __my_cpu_ptr(ptr) (__my_cpu_type(*ptr) *)(uintptr_t)(ptr) > > -#define __my_cpu_var(var) (*__my_cpu_ptr(&var)) > > +#define __my_cpu_ptr(ptr) (__my_cpu_type(*ptr)*)(__force uintptr_t)(ptr) > > +#define __my_cpu_var(var) (*__my_cpu_ptr(&(var))) > > If you use "(var)” in __my_cpu_var(),, you might just as well change the first to: > > #define __my_cpu_ptr(ptr) (__my_cpu_type(*(ptr))*)(__force uintptr_t)(ptr) > > [ not that I think of any real issue it might cause - just for consistency]
Yes, I have changed it in one of the follow-up percpu patches [1].
[1] https://lore.kernel.org/lkml/20240404094218.448963-2-ubizjak@gmail.com/
Thanks, Uros.
| ![\](/images/icornerr.gif) |