Message ID | 1482503344-6424-16-git-send-email-vsementsov@virtuozzo.com |
---|---|
State | New |
Headers | show |
On Fri, Dec 23, 2016 at 05:28:58PM +0300, Vladimir Sementsov-Ogievskiy wrote: > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> > Reviewed-by: Pavel Butsykin <pbutsykin@virtuozzo.com> > --- > include/qemu/bitmap.h | 4 ++++ > util/bitmap.c | 27 +++++++++++++++++++++++++++ > 2 files changed, 31 insertions(+) > > diff --git a/include/qemu/bitmap.h b/include/qemu/bitmap.h > index 63ea2d0..3bfc33e 100644 > --- a/include/qemu/bitmap.h > +++ b/include/qemu/bitmap.h > @@ -216,6 +216,10 @@ static inline int bitmap_intersects(const unsigned long *src1, > } > } > > +unsigned long bitmap_count_between(const unsigned long *src, > + unsigned long start, > + unsigned long end); Please add this to the table of functions documented at the top of the header file. > + > void bitmap_set(unsigned long *map, long i, long len); > void bitmap_set_atomic(unsigned long *map, long i, long len); > void bitmap_clear(unsigned long *map, long start, long nr); > diff --git a/util/bitmap.c b/util/bitmap.c > index 43ed011..e5aaa1c 100644 > --- a/util/bitmap.c > +++ b/util/bitmap.c > @@ -336,3 +336,30 @@ int slow_bitmap_intersects(const unsigned long *bitmap1, > } > return 0; > } > + > +unsigned long bitmap_count_between(const unsigned long *src, > + unsigned long start, > + unsigned long end) Most of the other functions use long start and long nr. Please follow that convention.
diff --git a/include/qemu/bitmap.h b/include/qemu/bitmap.h index 63ea2d0..3bfc33e 100644 --- a/include/qemu/bitmap.h +++ b/include/qemu/bitmap.h @@ -216,6 +216,10 @@ static inline int bitmap_intersects(const unsigned long *src1, } } +unsigned long bitmap_count_between(const unsigned long *src, + unsigned long start, + unsigned long end); + void bitmap_set(unsigned long *map, long i, long len); void bitmap_set_atomic(unsigned long *map, long i, long len); void bitmap_clear(unsigned long *map, long start, long nr); diff --git a/util/bitmap.c b/util/bitmap.c index 43ed011..e5aaa1c 100644 --- a/util/bitmap.c +++ b/util/bitmap.c @@ -336,3 +336,30 @@ int slow_bitmap_intersects(const unsigned long *bitmap1, } return 0; } + +unsigned long bitmap_count_between(const unsigned long *src, + unsigned long start, + unsigned long end) +{ + unsigned long first = start / BITS_PER_LONG; + unsigned long lim = end / BITS_PER_LONG; + unsigned long sum, i; + + assert(start < end); + + sum = ctpopl(src[first] & BITMAP_FIRST_WORD_MASK(start)); + + for (i = first + 1; i < lim; ++i) { + sum += ctpopl(src[i]); + } + + if (end % BITS_PER_LONG) { + if (first == lim) { + sum -= ctpopl(src[first] & BITMAP_FIRST_WORD_MASK(end)); + } else { + sum += ctpopl(src[i] & BITMAP_LAST_WORD_MASK(end)); + } + } + + return sum; +}