On 12/03/2021 06.28, Yury Norov wrote: > On Fri, Feb 19, 2021 at 12:07:27AM +0100, Rasmus Villemoes wrote: >> On 18/02/2021 05.05, Yury Norov wrote: >>> Many algorithms become simpler if they are passed with relatively small >>> input values. One example is bitmap operations when the whole bitmap fits >>> into one word. To implement such simplifications, linux/bitmap.h declares >>> small_const_nbits() macro. >>> >>> Other subsystems may also benefit from optimizations of this sort, like >>> find_bit API in the following patches. So it looks helpful to generalize >>> the macro and extend it's visibility. >> >> Perhaps, but SMALL_CONST is too generic a name, it needs to keep "bits" >> somewhere in there. So why not just keep it at small_const_nbits? >> >>> Signed-off-by: Yury Norov <yury.norov@xxxxxxxxx> >>> --- >>> include/asm-generic/bitsperlong.h | 2 ++ >>> include/linux/bitmap.h | 33 ++++++++++++++----------------- >>> 2 files changed, 17 insertions(+), 18 deletions(-) >>> >>> diff --git a/include/asm-generic/bitsperlong.h b/include/asm-generic/bitsperlong.h >>> index 3905c1c93dc2..0eeb77544f1d 100644 >>> --- a/include/asm-generic/bitsperlong.h >>> +++ b/include/asm-generic/bitsperlong.h >>> @@ -23,4 +23,6 @@ >>> #define BITS_PER_LONG_LONG 64 >>> #endif >>> >>> +#define SMALL_CONST(n) (__builtin_constant_p(n) && (unsigned long)(n) < BITS_PER_LONG) >>> + >>> #endif /* __ASM_GENERIC_BITS_PER_LONG */ >>> diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h >>> index adf7bd9f0467..e89f1dace846 100644 >>> --- a/include/linux/bitmap.h >>> +++ b/include/linux/bitmap.h >>> @@ -224,9 +224,6 @@ extern int bitmap_print_to_pagebuf(bool list, char *buf, >>> * so make such users (should any ever turn up) call the out-of-line >>> * versions. >>> */ >>> -#define small_const_nbits(nbits) \ >>> - (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG && (nbits) > 0) >>> - >>> static inline void bitmap_zero(unsigned long *dst, unsigned int nbits) >>> { >>> unsigned int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); >>> @@ -278,7 +275,7 @@ extern void bitmap_to_arr32(u32 *buf, const unsigned long *bitmap, >>> static inline int bitmap_and(unsigned long *dst, const unsigned long *src1, >>> const unsigned long *src2, unsigned int nbits) >>> { >>> - if (small_const_nbits(nbits)) >>> + if (SMALL_CONST(nbits - 1)) >> >> Please don't force most users to be changed to something less readable. >> What's wrong with just keeping small_const_nbits() the way it is, >> avoiding all this churn and keeping the readability? > > The wrong thing is that it's defined in include/linux/bitmap.h, and I > cannot use it in include/asm-generic/bitops/find.h, so I have to either > move it to a separate header, or generalize and share with find.h and > other users this way. I prefer the latter option, thougt it's more > verbose. The logical place would be the same place the BITS_PER_LONG macro is defined, no? No need to introduce a new header for that, and all current users of small_const_nbits() must already (very possibly indirectly) include asm-generic/bitsperlong.h. I do prefer to keep both the name small_const_nbits() and its current semantics, which, although not currently spelled out that way anywhere, is "is BITMAP_SIZE(nbits) known at compile time and equal to 1", which is precisely what allows the static inlines to unconditionally dereference the pointer (that's the "exclude the 0 case") and just deal with that one word. I don't like either SMALL_CONST or small_const_size, because nothing in there says it has anything to do with bit ops. As I said, if you have some special place that for some reason cannot handle nbits==BITS_PER_LONG, then just add that as an additional constraint with a comment why. Rasmus