@@ -20,6 +20,16 @@ static inline
20
20
unsigned long find_next_bit (const unsigned long * addr , unsigned long size ,
21
21
unsigned long offset )
22
22
{
23
+ if (small_const_nbits (size )) {
24
+ unsigned long val ;
25
+
26
+ if (unlikely (offset >= size ))
27
+ return size ;
28
+
29
+ val = * addr & GENMASK (size - 1 , offset );
30
+ return val ? __ffs (val ) : size ;
31
+ }
32
+
23
33
return _find_next_bit (addr , NULL , size , offset , 0UL , 0 );
24
34
}
25
35
#endif
@@ -40,6 +50,16 @@ unsigned long find_next_and_bit(const unsigned long *addr1,
40
50
const unsigned long * addr2 , unsigned long size ,
41
51
unsigned long offset )
42
52
{
53
+ if (small_const_nbits (size )) {
54
+ unsigned long val ;
55
+
56
+ if (unlikely (offset >= size ))
57
+ return size ;
58
+
59
+ val = * addr1 & * addr2 & GENMASK (size - 1 , offset );
60
+ return val ? __ffs (val ) : size ;
61
+ }
62
+
43
63
return _find_next_bit (addr1 , addr2 , size , offset , 0UL , 0 );
44
64
}
45
65
#endif
@@ -58,6 +78,16 @@ static inline
58
78
unsigned long find_next_zero_bit (const unsigned long * addr , unsigned long size ,
59
79
unsigned long offset )
60
80
{
81
+ if (small_const_nbits (size )) {
82
+ unsigned long val ;
83
+
84
+ if (unlikely (offset >= size ))
85
+ return size ;
86
+
87
+ val = * addr | ~GENMASK (size - 1 , offset );
88
+ return val == ~0UL ? size : ffz (val );
89
+ }
90
+
61
91
return _find_next_bit (addr , NULL , size , offset , ~0UL , 0 );
62
92
}
63
93
#endif
0 commit comments