On 14.03.2024 17:23, Andrew Cooper wrote: > On 14/03/2024 2:16 pm, Jan Beulich wrote: >> On 13.03.2024 18:27, Andrew Cooper wrote: >>> --- a/xen/arch/arm/include/asm/bitops.h >>> +++ b/xen/arch/arm/include/asm/bitops.h >>> @@ -157,7 +157,7 @@ static inline int fls(unsigned int x) >>> } >>> >>> >>> -#define ffs(x) ({ unsigned int __t = (x); fls(ISOLATE_LSB(__t)); }) >>> +#define arch_ffs(x) ({ unsigned int __t = (x); fls(ISOLATE_LSB(__t)); }) >> The way the macro is invoked, I don't think the helper local variable >> is then needed anymore? > > I strongly suspect It is still needed. ISOLATE_LSB() double-expands its > parameter.
Even that double evaluation doesn't matter when the invoking entity is an inline function, and it doesn't use any non-trivial expression as argument. >>> --- a/xen/include/xen/bitops.h >>> +++ b/xen/include/xen/bitops.h >>> @@ -110,6 +110,21 @@ static inline int generic_flsl(unsigned long x) >>> >>> #include <asm/bitops.h> >>> >>> +/* >>> + * Find First Set bit. Bits are labelled from 1. >>> + */ >>> +static always_inline __pure unsigned int ffs(unsigned int x) >> Why always_inline? > > For all the normal reasons to counter Clang and GCC doing stupid things > with inlines that contain assembly. Hmm, there are issues when the asm() would look "complex" to the compiler, but that's not the case here. I was asking because, as you imply by how you responded, we may need to gain many more always_inline when at some time even you were arguing against overriding compiler decisions like this (unless I'm mis-remembering). Jan