From: Andrew Morton > Sent: 30 March 2023 23:19 > > On Thu, 30 Mar 2023 21:53:03 +0000 David Laight <David.Laight@xxxxxxxxxx> wrote: > > > > But wouldn't all these issues be addressed by simply doing > > > > > > #define is_power_of_2(n) (n != 0 && ((n & (n - 1)) == 0)) > > > > > > ? > > > > > > (With suitable tweaks to avoid evaluating `n' more than once) > > > > I think you need to use the 'horrid tricks' from min() to get > > a constant expression from constant inputs. > > This > > --- a/include/linux/log2.h~a > +++ a/include/linux/log2.h > @@ -41,11 +41,11 @@ int __ilog2_u64(u64 n) > * *not* considered a power of two. > * Return: true if @n is a power of 2, otherwise false. > */ > -static inline __attribute__((const)) > -bool is_power_of_2(unsigned long n) > -{ > - return (n != 0 && ((n & (n - 1)) == 0)); > -} > +#define is_power_of_2(_n) \ > + ({ \ > + typeof(_n) n = (_n); \ > + n != 0 && ((n & (n - 1)) == 0); \ > + }) > > /** > * __roundup_pow_of_two() - round up to nearest power of two > _ > > worked for me in a simple test. > > --- a/fs/open.c~b > +++ a/fs/open.c > @@ -1564,3 +1564,10 @@ int stream_open(struct inode *inode, str > } > > EXPORT_SYMBOL(stream_open); > + > +#include <linux/log2.h> > + > +int foo(void) > +{ > + return is_power_of_2(43); > +} > _ > > > foo: > # fs/open.c:1573: } > xorl %eax, %eax # > ret > > > Is there some more tricky situation where it breaks? Try: static int x = is_power_of_2(43); I suspect that some (all?) of the compile-time assert checks won't like ({...}) either. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)