From: Yury Norov yury.norov@gmail.com
mainline inclusion from mainline-v5.13-rc1 commit 586eaebea5988302c5a8b018096dd6c6f4564940 category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/I6VS35
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?i...
--------------------------------
find_bit would also benefit from small_const_nbits() optimizations. The detailed comment is provided by Rasmus Villemoes.
Link: https://lkml.kernel.org/r/20210401003153.97325-6-yury.norov@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 Acked-by: Andy Shevchenko andy.shevchenko@gmail.com Cc: Alexey Klimov aklimov@redhat.com Cc: Arnd Bergmann arnd@arndb.de Cc: David Sterba dsterba@suse.com Cc: Dennis Zhou dennis@kernel.org Cc: Geert Uytterhoeven geert@linux-m68k.org Cc: Jianpeng Ma jianpeng.ma@intel.com Cc: Joe Perches joe@perches.com Cc: John Paul Adrian Glaubitz glaubitz@physik.fu-berlin.de Cc: Josh Poimboeuf jpoimboe@redhat.com Cc: Rich Felker dalias@libc.org Cc: Stefano Brivio sbrivio@redhat.com Cc: Wei Yang richard.weiyang@linux.alibaba.com Cc: Wolfram Sang wsa+renesas@sang-engineering.com Cc: Yoshinori Sato ysato@users.osdn.me Signed-off-by: Andrew Morton akpm@linux-foundation.org Signed-off-by: Linus Torvalds torvalds@linux-foundation.org Signed-off-by: Zeng Heng zengheng4@huawei.com --- 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 e98da9994cdd..6f8803eaae25 100644 --- a/include/linux/bitmap.h +++ b/include/linux/bitmap.h @@ -234,14 +234,6 @@ extern 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);