public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Rusty Russell <rusty@rustcorp.com.au>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org, Mike Travis <travis@sgi.com>
Subject: [PATCH] bitmap: test for constant as well as small size for inline versions
Date: Sun, 16 Nov 2008 09:07:06 +1030	[thread overview]
Message-ID: <200811160907.07140.rusty@rustcorp.com.au> (raw)

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 5985 bytes --]

bitmap_zero et al have a fastpath for nbits <= BITS_PER_LONG, but thisshould really only apply where the nbits is known at compile time.
This only saves about 1200 bytes on an allyesconfig kernel, but withcpumasks going variable that number will increase.
   text		data	bss	dec		hex	filename35327852        5035607 6782976 47146435        2cf65c3 vmlinux-before35326640        5035607 6782976 47145223        2cf6107 vmlinux-after
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>--- include/linux/bitmap.h |   35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-)
diff -r b4540ad329c1 include/linux/bitmap.h--- a/include/linux/bitmap.h	Thu Nov 06 13:00:51 2008 +1100+++ b/include/linux/bitmap.h	Thu Nov 06 14:34:07 2008 +1100@@ -137,9 +137,12 @@ extern void bitmap_copy_le(void *dst, co 		(1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL		\ ) +#define small_const_nbits(nbits) \+	(__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG)+ static inline void bitmap_zero(unsigned long *dst, int nbits) {-	if (nbits <= BITS_PER_LONG)+	if (small_const_nbits(nbits)) 		*dst = 0UL; 	else { 		int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);@@ -150,7 +153,7 @@ static inline void bitmap_fill(unsigned  static inline void bitmap_fill(unsigned long *dst, int nbits) { 	size_t nlongs = BITS_TO_LONGS(nbits);-	if (nlongs > 1) {+	if (!small_const_nbits(nbits)) { 		int len = (nlongs - 1) * sizeof(unsigned long); 		memset(dst, 0xff,  len); 	}@@ -160,7 +163,7 @@ static inline void bitmap_copy(unsigned  static inline void bitmap_copy(unsigned long *dst, const unsigned long *src, 			int nbits) {-	if (nbits <= BITS_PER_LONG)+	if (small_const_nbits(nbits)) 		*dst = *src; 	else { 		int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);@@ -171,7 +174,7 @@ static inline void bitmap_and(unsigned l static inline void bitmap_and(unsigned long *dst, const unsigned long *src1, 			const unsigned long *src2, int nbits) {-	if (nbits <= BITS_PER_LONG)+	if (small_const_nbits(nbits)) 		*dst = *src1 & *src2; 	else 		__bitmap_and(dst, src1, src2, nbits);@@ -180,7 +183,7 @@ static inline void bitmap_or(unsigned lo static inline void bitmap_or(unsigned long *dst, const unsigned long *src1, 			const unsigned long *src2, int nbits) {-	if (nbits <= BITS_PER_LONG)+	if (small_const_nbits(nbits)) 		*dst = *src1 | *src2; 	else 		__bitmap_or(dst, src1, src2, nbits);@@ -189,7 +192,7 @@ static inline void bitmap_xor(unsigned l static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1, 			const unsigned long *src2, int nbits) {-	if (nbits <= BITS_PER_LONG)+	if (small_const_nbits(nbits)) 		*dst = *src1 ^ *src2; 	else 		__bitmap_xor(dst, src1, src2, nbits);@@ -198,7 +201,7 @@ static inline void bitmap_andnot(unsigne static inline void bitmap_andnot(unsigned long *dst, const unsigned long *src1, 			const unsigned long *src2, int nbits) {-	if (nbits <= BITS_PER_LONG)+	if (small_const_nbits(nbits)) 		*dst = *src1 & ~(*src2); 	else 		__bitmap_andnot(dst, src1, src2, nbits);@@ -207,7 +210,7 @@ static inline void bitmap_complement(uns static inline void bitmap_complement(unsigned long *dst, const unsigned long *src, 			int nbits) {-	if (nbits <= BITS_PER_LONG)+	if (small_const_nbits(nbits)) 		*dst = ~(*src) & BITMAP_LAST_WORD_MASK(nbits); 	else 		__bitmap_complement(dst, src, nbits);@@ -216,7 +219,7 @@ static inline int bitmap_equal(const uns static inline int bitmap_equal(const unsigned long *src1, 			const unsigned long *src2, int nbits) {-	if (nbits <= BITS_PER_LONG)+	if (small_const_nbits(nbits)) 		return ! ((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits)); 	else 		return __bitmap_equal(src1, src2, nbits);@@ -225,7 +228,7 @@ static inline int bitmap_intersects(cons static inline int bitmap_intersects(const unsigned long *src1, 			const unsigned long *src2, int nbits) {-	if (nbits <= BITS_PER_LONG)+	if (small_const_nbits(nbits)) 		return ((*src1 & *src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0; 	else 		return __bitmap_intersects(src1, src2, nbits);@@ -234,7 +237,7 @@ static inline int bitmap_subset(const un static inline int bitmap_subset(const unsigned long *src1, 			const unsigned long *src2, int nbits) {-	if (nbits <= BITS_PER_LONG)+	if (small_const_nbits(nbits)) 		return ! ((*src1 & ~(*src2)) & BITMAP_LAST_WORD_MASK(nbits)); 	else 		return __bitmap_subset(src1, src2, nbits);@@ -242,7 +245,7 @@ static inline int bitmap_subset(const un  static inline int bitmap_empty(const unsigned long *src, int nbits) {-	if (nbits <= BITS_PER_LONG)+	if (small_const_nbits(nbits)) 		return ! (*src & BITMAP_LAST_WORD_MASK(nbits)); 	else 		return __bitmap_empty(src, nbits);@@ -250,7 +253,7 @@ static inline int bitmap_empty(const uns  static inline int bitmap_full(const unsigned long *src, int nbits) {-	if (nbits <= BITS_PER_LONG)+	if (small_const_nbits(nbits)) 		return ! (~(*src) & BITMAP_LAST_WORD_MASK(nbits)); 	else 		return __bitmap_full(src, nbits);@@ -258,7 +261,7 @@ static inline int bitmap_full(const unsi  static inline int bitmap_weight(const unsigned long *src, int nbits) {-	if (nbits <= BITS_PER_LONG)+	if (small_const_nbits(nbits)) 		return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits)); 	return __bitmap_weight(src, nbits); }@@ -266,7 +269,7 @@ static inline void bitmap_shift_right(un static inline void bitmap_shift_right(unsigned long *dst, 			const unsigned long *src, int n, int nbits) {-	if (nbits <= BITS_PER_LONG)+	if (small_const_nbits(nbits)) 		*dst = *src >> n; 	else 		__bitmap_shift_right(dst, src, n, nbits);@@ -275,7 +278,7 @@ static inline void bitmap_shift_left(uns static inline void bitmap_shift_left(unsigned long *dst, 			const unsigned long *src, int n, int nbits) {-	if (nbits <= BITS_PER_LONG)+	if (small_const_nbits(nbits)) 		*dst = (*src << n) & BITMAP_LAST_WORD_MASK(nbits); 	else 		__bitmap_shift_left(dst, src, n, nbits);\0ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±þG«éÿŠ{ayº\x1dʇڙë,j\a­¢f£¢·hšïêÿ‘êçz_è®\x03(­éšŽŠÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?™¨è­Ú&£ø§~á¶iO•æ¬z·švØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?–I¥

                 reply	other threads:[~2008-11-15 22:37 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200811160907.07140.rusty@rustcorp.com.au \
    --to=rusty@rustcorp.com.au \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=travis@sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox