@@ -14,6 +14,8 @@ unsigned long _find_next_and_bit(const unsigned long *addr1, const unsigned long
14
14
unsigned long nbits , unsigned long start );
15
15
unsigned long _find_next_andnot_bit (const unsigned long * addr1 , const unsigned long * addr2 ,
16
16
unsigned long nbits , unsigned long start );
17
+ unsigned long _find_next_or_bit (const unsigned long * addr1 , const unsigned long * addr2 ,
18
+ unsigned long nbits , unsigned long start );
17
19
unsigned long _find_next_zero_bit (const unsigned long * addr , unsigned long nbits ,
18
20
unsigned long start );
19
21
extern unsigned long _find_first_bit (const unsigned long * addr , unsigned long size );
@@ -127,6 +129,36 @@ unsigned long find_next_andnot_bit(const unsigned long *addr1,
127
129
}
128
130
#endif
129
131
132
+ #ifndef find_next_or_bit
133
+ /**
134
+ * find_next_or_bit - find the next set bit in either memory regions
135
+ * @addr1: The first address to base the search on
136
+ * @addr2: The second address to base the search on
137
+ * @size: The bitmap size in bits
138
+ * @offset: The bitnumber to start searching at
139
+ *
140
+ * Returns the bit number for the next set bit
141
+ * If no bits are set, returns @size.
142
+ */
143
+ static inline
144
+ unsigned long find_next_or_bit (const unsigned long * addr1 ,
145
+ const unsigned long * addr2 , unsigned long size ,
146
+ unsigned long offset )
147
+ {
148
+ if (small_const_nbits (size )) {
149
+ unsigned long val ;
150
+
151
+ if (unlikely (offset >= size ))
152
+ return size ;
153
+
154
+ val = (* addr1 | * addr2 ) & GENMASK (size - 1 , offset );
155
+ return val ? __ffs (val ) : size ;
156
+ }
157
+
158
+ return _find_next_or_bit (addr1 , addr2 , size , offset );
159
+ }
160
+ #endif
161
+
130
162
#ifndef find_next_zero_bit
131
163
/**
132
164
* find_next_zero_bit - find the next cleared bit in a memory region
@@ -536,6 +568,11 @@ unsigned long find_next_bit_le(const void *addr, unsigned
536
568
(bit) = find_next_andnot_bit((addr1), (addr2), (size), (bit)), (bit) < (size);\
537
569
(bit)++)
538
570
571
+ #define for_each_or_bit (bit , addr1 , addr2 , size ) \
572
+ for ((bit) = 0; \
573
+ (bit) = find_next_or_bit((addr1), (addr2), (size), (bit)), (bit) < (size);\
574
+ (bit)++)
575
+
539
576
/* same as for_each_set_bit() but use bit as value to start with */
540
577
#define for_each_set_bit_from (bit , addr , size ) \
541
578
for (; (bit) = find_next_bit((addr), (size), (bit)), (bit) < (size); (bit)++)
0 commit comments