Message ID | 20210401003153.97325-6-yury.norov@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | lib/find_bit: fast path for small bitmaps | expand |
On Thu, Apr 1, 2021 at 3:41 AM Yury Norov <yury.norov@gmail.com> wrote: > > find_bit would also benefit from small_const_nbits() optimizations. > The detailed comment is provided by Rasmus Villemoes. Thanks, now it looks good! Acked-by: Andy Shevchenko <andy.shevchenko@gmail.com> > Suggested-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> > Signed-off-by: Yury Norov <yury.norov@gmail.com> > Acked-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> > --- > include/asm-generic/bitsperlong.h | 12 ++++++++++++ > include/linux/bitmap.h | 8 -------- > 2 files changed, 12 insertions(+), 8 deletions(-) > > diff --git a/include/asm-generic/bitsperlong.h b/include/asm-generic/bitsperlong.h > index 3905c1c93dc2..1023e2a4bd37 100644 > --- a/include/asm-generic/bitsperlong.h > +++ b/include/asm-generic/bitsperlong.h > @@ -23,4 +23,16 @@ > #define BITS_PER_LONG_LONG 64 > #endif > > +/* > + * small_const_nbits(n) is true precisely when it is known at compile-time > + * that BITMAP_SIZE(n) is 1, i.e. 1 <= n <= BITS_PER_LONG. This allows > + * various bit/bitmap APIs to provide a fast inline implementation. Bitmaps > + * of size 0 are very rare, and a compile-time-known-size 0 is most likely > + * a sign of error. They will be handled correctly by the bit/bitmap APIs, > + * but using the out-of-line functions, so that the inline implementations > + * can unconditionally dereference the pointer(s). > + */ > +#define small_const_nbits(nbits) \ > + (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG && (nbits) > 0) > + > #endif /* __ASM_GENERIC_BITS_PER_LONG */ > diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h > index 2cb1d7cfe8f9..a36cfcec4e77 100644 > --- a/include/linux/bitmap.h > +++ b/include/linux/bitmap.h > @@ -230,14 +230,6 @@ int bitmap_print_to_pagebuf(bool list, char *buf, > #define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1))) > #define BITMAP_LAST_WORD_MASK(nbits) (~0UL >> (-(nbits) & (BITS_PER_LONG - 1))) > > -/* > - * The static inlines below do not handle constant nbits==0 correctly, > - * 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); > -- > 2.25.1 >
diff --git a/include/asm-generic/bitsperlong.h b/include/asm-generic/bitsperlong.h index 3905c1c93dc2..1023e2a4bd37 100644 --- a/include/asm-generic/bitsperlong.h +++ b/include/asm-generic/bitsperlong.h @@ -23,4 +23,16 @@ #define BITS_PER_LONG_LONG 64 #endif +/* + * small_const_nbits(n) is true precisely when it is known at compile-time + * that BITMAP_SIZE(n) is 1, i.e. 1 <= n <= BITS_PER_LONG. This allows + * various bit/bitmap APIs to provide a fast inline implementation. Bitmaps + * of size 0 are very rare, and a compile-time-known-size 0 is most likely + * a sign of error. They will be handled correctly by the bit/bitmap APIs, + * but using the out-of-line functions, so that the inline implementations + * can unconditionally dereference the pointer(s). + */ +#define small_const_nbits(nbits) \ + (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG && (nbits) > 0) + #endif /* __ASM_GENERIC_BITS_PER_LONG */ diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h index 2cb1d7cfe8f9..a36cfcec4e77 100644 --- a/include/linux/bitmap.h +++ b/include/linux/bitmap.h @@ -230,14 +230,6 @@ int bitmap_print_to_pagebuf(bool list, char *buf, #define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1))) #define BITMAP_LAST_WORD_MASK(nbits) (~0UL >> (-(nbits) & (BITS_PER_LONG - 1))) -/* - * The static inlines below do not handle constant nbits==0 correctly, - * 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);