|  | #include <linux/compiler.h> | 
|  | #include <linux/types.h> | 
|  | #include <asm/intrinsics.h> | 
|  | #include <linux/module.h> | 
|  | #include <linux/bitops.h> | 
|  |  | 
|  | /* | 
|  | * Find next zero bit in a bitmap reasonably efficiently.. | 
|  | */ | 
|  |  | 
|  | int __find_next_zero_bit (const void *addr, unsigned long size, unsigned long offset) | 
|  | { | 
|  | unsigned long *p = ((unsigned long *) addr) + (offset >> 6); | 
|  | unsigned long result = offset & ~63UL; | 
|  | unsigned long tmp; | 
|  |  | 
|  | if (offset >= size) | 
|  | return size; | 
|  | size -= result; | 
|  | offset &= 63UL; | 
|  | if (offset) { | 
|  | tmp = *(p++); | 
|  | tmp |= ~0UL >> (64-offset); | 
|  | if (size < 64) | 
|  | goto found_first; | 
|  | if (~tmp) | 
|  | goto found_middle; | 
|  | size -= 64; | 
|  | result += 64; | 
|  | } | 
|  | while (size & ~63UL) { | 
|  | if (~(tmp = *(p++))) | 
|  | goto found_middle; | 
|  | result += 64; | 
|  | size -= 64; | 
|  | } | 
|  | if (!size) | 
|  | return result; | 
|  | tmp = *p; | 
|  | found_first: | 
|  | tmp |= ~0UL << size; | 
|  | if (tmp == ~0UL)		/* any bits zero? */ | 
|  | return result + size;	/* nope */ | 
|  | found_middle: | 
|  | return result + ffz(tmp); | 
|  | } | 
|  | EXPORT_SYMBOL(__find_next_zero_bit); | 
|  |  | 
|  | /* | 
|  | * Find next bit in a bitmap reasonably efficiently.. | 
|  | */ | 
|  | int __find_next_bit(const void *addr, unsigned long size, unsigned long offset) | 
|  | { | 
|  | unsigned long *p = ((unsigned long *) addr) + (offset >> 6); | 
|  | unsigned long result = offset & ~63UL; | 
|  | unsigned long tmp; | 
|  |  | 
|  | if (offset >= size) | 
|  | return size; | 
|  | size -= result; | 
|  | offset &= 63UL; | 
|  | if (offset) { | 
|  | tmp = *(p++); | 
|  | tmp &= ~0UL << offset; | 
|  | if (size < 64) | 
|  | goto found_first; | 
|  | if (tmp) | 
|  | goto found_middle; | 
|  | size -= 64; | 
|  | result += 64; | 
|  | } | 
|  | while (size & ~63UL) { | 
|  | if ((tmp = *(p++))) | 
|  | goto found_middle; | 
|  | result += 64; | 
|  | size -= 64; | 
|  | } | 
|  | if (!size) | 
|  | return result; | 
|  | tmp = *p; | 
|  | found_first: | 
|  | tmp &= ~0UL >> (64-size); | 
|  | if (tmp == 0UL)		/* Are any bits set? */ | 
|  | return result + size; /* Nope. */ | 
|  | found_middle: | 
|  | return result + __ffs(tmp); | 
|  | } | 
|  | EXPORT_SYMBOL(__find_next_bit); |