Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.26-rc1 /lib/find_next_bit.c

Filename:/lib/find_next_bit.c
Lines Added:60
Lines Deleted:9
Also changed in: (Previous) 2.6.25-git20  2.6.25-git19  2.6.25-git18  2.6.25-git17  2.6.25-git16  2.6.25-git15 
(Following) 2.6.26-rc2  2.6.26-rc3  2.6.26-rc4  2.6.26-rc5  2.6.26-rc6  2.6.26-rc7 

Location
[  2.6.26-rc1
  [  lib
     o  find_next_bit.c

Patch

diff --git a/lib/find_next_bit.c b/lib/find_next_bit.c
index 78ccd73..24c59de 100644
--- a/lib/find_next_bit.c
+++ b/lib/find_next_bit.c
@@ -16,14 +16,12 @@
 
 #define BITOP_WORD(nr)      ((nr) / BITS_PER_LONG)
 
-/**
- * find_next_bit - find the next set bit in a memory region
- * @addr: The address to base the search on
- * @offset: The bitnumber to start searching at
- * @size: The maximum size to search
+#ifdef CONFIG_GENERIC_FIND_NEXT_BIT
+/*
+ * Find the next set bit in a memory region.
  */
 unsigned long find_next_bit(const unsigned long *addr, unsigned long size,
-      unsigned long offset)
+             unsigned long offset)
 {
    const unsigned long *p = addr + BITOP_WORD(offset);
    unsigned long result = offset & ~(BITS_PER_LONG-1);
@@ -60,7 +58,6 @@ found_first:
 found_middle:
    return result + __ffs(tmp);
 }
-
 EXPORT_SYMBOL(find_next_bit);
 
 /*
@@ -68,7 +65,7 @@ EXPORT_SYMBOL(find_next_bit);
  * Linus' asm-alpha/bitops.h.
  */
 unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size,
-      unsigned long offset)
+             unsigned long offset)
 {
    const unsigned long *p = addr + BITOP_WORD(offset);
    unsigned long result = offset & ~(BITS_PER_LONG-1);
@@ -105,8 +102,62 @@ found_first:
 found_middle:
    return result + ffz(tmp);
 }
-
 EXPORT_SYMBOL(find_next_zero_bit);
+#endif /* CONFIG_GENERIC_FIND_NEXT_BIT */
+
+#ifdef CONFIG_GENERIC_FIND_FIRST_BIT
+/*
+ * Find the first set bit in a memory region.
+ */
+unsigned long find_first_bit(const unsigned long *addr, unsigned long size)
+{
+   const unsigned long *p = addr;
+   unsigned long result = 0;
+   unsigned long tmp;
+
+   while (size & ~(BITS_PER_LONG-1)) {
+      if ((tmp = *(p++)))
+         goto found;
+      result += BITS_PER_LONG;
+      size -= BITS_PER_LONG;
+   }
+   if (!size)
+      return result;
+
+   tmp = (*p) & (~0UL >> (BITS_PER_LONG - size));
+   if (tmp == 0UL)      /* Are any bits set? */
+      return result + size;   /* Nope. */
+found:
+   return result + __ffs(tmp);
+}
+EXPORT_SYMBOL(find_first_bit);
+
+/*
+ * Find the first cleared bit in a memory region.
+ */
+unsigned long find_first_zero_bit(const unsigned long *addr, unsigned long size)
+{
+   const unsigned long *p = addr;
+   unsigned long result = 0;
+   unsigned long tmp;
+
+   while (size & ~(BITS_PER_LONG-1)) {
+      if (~(tmp = *(p++)))
+         goto found;
+      result += BITS_PER_LONG;
+      size -= BITS_PER_LONG;
+   }
+   if (!size)
+      return result;
+
+   tmp = (*p) | (~0UL << size);
+   if (tmp == ~0UL)   /* Are any bits zero? */
+      return result + size;   /* Nope. */
+found:
+   return result + ffz(tmp);
+}
+EXPORT_SYMBOL(find_first_zero_bit);
+#endif /* CONFIG_GENERIC_FIND_FIRST_BIT */
 
 #ifdef __BIG_ENDIAN
 


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.