svn commit: r210094 - projects/ofed/head/sys/ofed/include/linux
Jeff Roberson
jeff at FreeBSD.org
Thu Jul 15 01:17:41 UTC 2010
Author: jeff
Date: Thu Jul 15 01:17:40 2010
New Revision: 210094
URL: http://svn.freebsd.org/changeset/base/210094
Log:
- Add more bitops for zero, fill, full, etc.
Sponsored by: Isilon Systems, iX Systems, and Panasas.
Modified:
projects/ofed/head/sys/ofed/include/linux/bitops.h
Modified: projects/ofed/head/sys/ofed/include/linux/bitops.h
==============================================================================
--- projects/ofed/head/sys/ofed/include/linux/bitops.h Thu Jul 15 01:17:07 2010 (r210093)
+++ projects/ofed/head/sys/ofed/include/linux/bitops.h Thu Jul 15 01:17:40 2010 (r210094)
@@ -153,6 +153,82 @@ find_next_bit(unsigned long *addr, unsig
return (bit);
}
+static inline unsigned long
+find_next_zero_bit(unsigned long *addr, unsigned long size,
+ unsigned long offset)
+{
+ int mask;
+ int offs;
+ int bit;
+ int pos;
+
+ pos = offset / BITS_PER_LONG;
+ offs = size % BITS_PER_LONG;
+ bit = BITS_PER_LONG * pos;
+ addr += pos;
+ if (offs) {
+ mask = ~(*addr) & ~BIT_MASK(offs);
+ if (mask)
+ return (bit + __ffsl(mask));
+ bit += BITS_PER_LONG;
+ addr++;
+ }
+ for (size -= bit; size >= BITS_PER_LONG;
+ size -= BITS_PER_LONG, bit += BITS_PER_LONG, addr++) {
+ if (~(*addr) == 0)
+ continue;
+ return (bit + __ffsl(~(*addr)));
+ }
+ if (size) {
+ mask = ~(*addr) & BIT_MASK(size);
+ if (mask)
+ bit += __ffsl(mask);
+ else
+ bit += size;
+ }
+ return (bit);
+}
+
+static inline void
+bitmap_zero(unsigned long *addr, int size)
+{
+ int len;
+
+ len = BITS_TO_LONGS(size) * sizeof(*addr);
+ memset(addr, 0, len);
+}
+
+static inline void
+bitmap_fill(unsigned long *addr, int size)
+{
+ int tail;
+ int len;
+
+ len = BITS_TO_LONGS(size) * sizeof(*addr);
+ memset(addr, 0xff, len);
+ tail = size & (BITS_PER_LONG - 1);
+ if (tail)
+ addr[len - 1] = ((unsigned long)-1) >> (BITS_PER_LONG - tail);
+}
+
+static inline int
+bitmap_full(unsigned long *addr, int size)
+{
+ int tail;
+ int len;
+ int i;
+
+ len = size / BITS_PER_LONG;
+ for (i = 0; i < len; i++)
+ if (addr[i] != (unsigned long)-1)
+ return (0);
+ tail = size & (BITS_PER_LONG - 1);
+ if (tail)
+ if (addr[i] != ((unsigned long)-1) >> (BITS_PER_LONG - tail))
+ return (0);
+ return (1);
+}
+
#define NBINT (NBBY * sizeof(int))
#define set_bit(i, a) \
More information about the svn-src-projects
mailing list