Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] bitops: generic sched_find_first_bit()

This patch introduces the C-language equivalent of the function: int
sched_find_first_bit(const unsigned long *b);

In include/asm-generic/bitops/sched.h

This code largely copied from: include/asm-powerpc/bitops.h

Signed-off-by: Akinobu Mita <mita@miraclelinux.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Akinobu Mita and committed by
Linus Torvalds
6d29ea23 c7f612cd

+36
+36
include/asm-generic/bitops/sched.h
··· 1 + #ifndef _ASM_GENERIC_BITOPS_SCHED_H_ 2 + #define _ASM_GENERIC_BITOPS_SCHED_H_ 3 + 4 + #include <linux/compiler.h> /* unlikely() */ 5 + #include <asm/types.h> 6 + 7 + /* 8 + * Every architecture must define this function. It's the fastest 9 + * way of searching a 140-bit bitmap where the first 100 bits are 10 + * unlikely to be set. It's guaranteed that at least one of the 140 11 + * bits is cleared. 12 + */ 13 + static inline int sched_find_first_bit(const unsigned long *b) 14 + { 15 + #if BITS_PER_LONG == 64 16 + if (unlikely(b[0])) 17 + return __ffs(b[0]); 18 + if (unlikely(b[1])) 19 + return __ffs(b[1]) + 64; 20 + return __ffs(b[2]) + 128; 21 + #elif BITS_PER_LONG == 32 22 + if (unlikely(b[0])) 23 + return __ffs(b[0]); 24 + if (unlikely(b[1])) 25 + return __ffs(b[1]) + 32; 26 + if (unlikely(b[2])) 27 + return __ffs(b[2]) + 64; 28 + if (b[3]) 29 + return __ffs(b[3]) + 96; 30 + return __ffs(b[4]) + 128; 31 + #else 32 + #error BITS_PER_LONG not defined 33 + #endif 34 + } 35 + 36 + #endif /* _ASM_GENERIC_BITOPS_SCHED_H_ */