| /* |
| * Taken from Linux kernel version v5.16. |
| */ |
| #include "linux/bitmap.h" |
| #include "linux/find.h" |
| #include "linux/kernel.h" |
| |
| unsigned long _find_next_bit(const unsigned long *addr1, |
| const unsigned long *addr2, unsigned long nbits, |
| unsigned long start, unsigned long invert) |
| { |
| unsigned long tmp, mask; |
| |
| if (start >= nbits) |
| return nbits; |
| |
| tmp = addr1[start / BITS_PER_LONG]; |
| if (addr2) |
| tmp &= addr2[start / BITS_PER_LONG]; |
| tmp ^= invert; |
| |
| /* Handle 1st word. */ |
| mask = BITMAP_FIRST_WORD_MASK(start); |
| tmp &= mask; |
| |
| start = round_down(start, BITS_PER_LONG); |
| |
| while (!tmp) { |
| start += BITS_PER_LONG; |
| if (start >= nbits) |
| return nbits; |
| |
| tmp = addr1[start / BITS_PER_LONG]; |
| if (addr2) |
| tmp &= addr2[start / BITS_PER_LONG]; |
| tmp ^= invert; |
| } |
| |
| return min(start + __builtin_ctzl(tmp), nbits); |
| } |