aboutsummaryrefslogtreecommitdiffstats
path: root/lib/bitmap.c
diff options
context:
space:
mode:
authorRasmus Villemoes <linux@rasmusvillemoes.dk>2015-02-12 18:02:07 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2015-02-12 21:54:14 -0500
commitdf1d80a9eb16d98002673f68a7ebbe881f6e6946 (patch)
tree354e5cd242fdd024e258f40460887d231d48e2aa /lib/bitmap.c
parentb26ad5836c3a0a9d456eb60b9f841ca15403ee59 (diff)
lib/bitmap.c: simplify bitmap_pos_to_ord
The ordinal of a set bit is simply the number of set bits before it; counting those doesn't need to be done one bit at a time. While at it, update the parameters to unsigned int. It is not completely unthinkable that gcc would see pos as compile-time constant 0 in one of the uses of bitmap_pos_to_ord. Since the static inline frontend bitmap_weight doesn't handle nbits==0 correctly (it would behave exactly as if nbits==BITS_PER_LONG), use __bitmap_weight. Alternatively, the last line could be spelled bitmap_weight(buf, pos+1)-1, but this is simpler. Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'lib/bitmap.c')
-rw-r--r--lib/bitmap.c22
1 files changed, 6 insertions, 16 deletions
diff --git a/lib/bitmap.c b/lib/bitmap.c
index b0d3e823dab3..84d20b5c6bf1 100644
--- a/lib/bitmap.c
+++ b/lib/bitmap.c
@@ -744,10 +744,10 @@ EXPORT_SYMBOL(bitmap_parselist_user);
744/** 744/**
745 * bitmap_pos_to_ord - find ordinal of set bit at given position in bitmap 745 * bitmap_pos_to_ord - find ordinal of set bit at given position in bitmap
746 * @buf: pointer to a bitmap 746 * @buf: pointer to a bitmap
747 * @pos: a bit position in @buf (0 <= @pos < @bits) 747 * @pos: a bit position in @buf (0 <= @pos < @nbits)
748 * @bits: number of valid bit positions in @buf 748 * @nbits: number of valid bit positions in @buf
749 * 749 *
750 * Map the bit at position @pos in @buf (of length @bits) to the 750 * Map the bit at position @pos in @buf (of length @nbits) to the
751 * ordinal of which set bit it is. If it is not set or if @pos 751 * ordinal of which set bit it is. If it is not set or if @pos
752 * is not a valid bit position, map to -1. 752 * is not a valid bit position, map to -1.
753 * 753 *
@@ -759,22 +759,12 @@ EXPORT_SYMBOL(bitmap_parselist_user);
759 * 759 *
760 * The bit positions 0 through @bits are valid positions in @buf. 760 * The bit positions 0 through @bits are valid positions in @buf.
761 */ 761 */
762static int bitmap_pos_to_ord(const unsigned long *buf, int pos, int bits) 762static int bitmap_pos_to_ord(const unsigned long *buf, unsigned int pos, unsigned int nbits)
763{ 763{
764 int i, ord; 764 if (pos >= nbits || !test_bit(pos, buf))
765
766 if (pos < 0 || pos >= bits || !test_bit(pos, buf))
767 return -1; 765 return -1;
768 766
769 i = find_first_bit(buf, bits); 767 return __bitmap_weight(buf, pos);
770 ord = 0;
771 while (i < pos) {
772 i = find_next_bit(buf, bits, i + 1);
773 ord++;
774 }
775 BUG_ON(i != pos);
776
777 return ord;
778} 768}
779 769
780/** 770/**