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

Configure Feed

Select the types of activity you want to include in your feed.

at v5.16 145 lines 3.9 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef _TOOLS_LINUX_ASM_GENERIC_BITOPS_FIND_H_ 3#define _TOOLS_LINUX_ASM_GENERIC_BITOPS_FIND_H_ 4 5extern unsigned long _find_next_bit(const unsigned long *addr1, 6 const unsigned long *addr2, unsigned long nbits, 7 unsigned long start, unsigned long invert, unsigned long le); 8extern unsigned long _find_first_bit(const unsigned long *addr, unsigned long size); 9extern unsigned long _find_first_zero_bit(const unsigned long *addr, unsigned long size); 10extern unsigned long _find_last_bit(const unsigned long *addr, unsigned long size); 11 12#ifndef find_next_bit 13/** 14 * find_next_bit - find the next set bit in a memory region 15 * @addr: The address to base the search on 16 * @offset: The bitnumber to start searching at 17 * @size: The bitmap size in bits 18 * 19 * Returns the bit number for the next set bit 20 * If no bits are set, returns @size. 21 */ 22static inline 23unsigned long find_next_bit(const unsigned long *addr, unsigned long size, 24 unsigned long offset) 25{ 26 if (small_const_nbits(size)) { 27 unsigned long val; 28 29 if (unlikely(offset >= size)) 30 return size; 31 32 val = *addr & GENMASK(size - 1, offset); 33 return val ? __ffs(val) : size; 34 } 35 36 return _find_next_bit(addr, NULL, size, offset, 0UL, 0); 37} 38#endif 39 40#ifndef find_next_and_bit 41/** 42 * find_next_and_bit - find the next set bit in both memory regions 43 * @addr1: The first address to base the search on 44 * @addr2: The second address to base the search on 45 * @offset: The bitnumber to start searching at 46 * @size: The bitmap size in bits 47 * 48 * Returns the bit number for the next set bit 49 * If no bits are set, returns @size. 50 */ 51static inline 52unsigned long find_next_and_bit(const unsigned long *addr1, 53 const unsigned long *addr2, unsigned long size, 54 unsigned long offset) 55{ 56 if (small_const_nbits(size)) { 57 unsigned long val; 58 59 if (unlikely(offset >= size)) 60 return size; 61 62 val = *addr1 & *addr2 & GENMASK(size - 1, offset); 63 return val ? __ffs(val) : size; 64 } 65 66 return _find_next_bit(addr1, addr2, size, offset, 0UL, 0); 67} 68#endif 69 70#ifndef find_next_zero_bit 71/** 72 * find_next_zero_bit - find the next cleared bit in a memory region 73 * @addr: The address to base the search on 74 * @offset: The bitnumber to start searching at 75 * @size: The bitmap size in bits 76 * 77 * Returns the bit number of the next zero bit 78 * If no bits are zero, returns @size. 79 */ 80static inline 81unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size, 82 unsigned long offset) 83{ 84 if (small_const_nbits(size)) { 85 unsigned long val; 86 87 if (unlikely(offset >= size)) 88 return size; 89 90 val = *addr | ~GENMASK(size - 1, offset); 91 return val == ~0UL ? size : ffz(val); 92 } 93 94 return _find_next_bit(addr, NULL, size, offset, ~0UL, 0); 95} 96#endif 97 98#ifndef find_first_bit 99 100/** 101 * find_first_bit - find the first set bit in a memory region 102 * @addr: The address to start the search at 103 * @size: The maximum number of bits to search 104 * 105 * Returns the bit number of the first set bit. 106 * If no bits are set, returns @size. 107 */ 108static inline 109unsigned long find_first_bit(const unsigned long *addr, unsigned long size) 110{ 111 if (small_const_nbits(size)) { 112 unsigned long val = *addr & GENMASK(size - 1, 0); 113 114 return val ? __ffs(val) : size; 115 } 116 117 return _find_first_bit(addr, size); 118} 119 120#endif /* find_first_bit */ 121 122#ifndef find_first_zero_bit 123 124/** 125 * find_first_zero_bit - find the first cleared bit in a memory region 126 * @addr: The address to start the search at 127 * @size: The maximum number of bits to search 128 * 129 * Returns the bit number of the first cleared bit. 130 * If no bits are zero, returns @size. 131 */ 132static inline 133unsigned long find_first_zero_bit(const unsigned long *addr, unsigned long size) 134{ 135 if (small_const_nbits(size)) { 136 unsigned long val = *addr | ~GENMASK(size - 1, 0); 137 138 return val == ~0UL ? size : ffz(val); 139 } 140 141 return _find_first_zero_bit(addr, size); 142} 143#endif 144 145#endif /*_TOOLS_LINUX_ASM_GENERIC_BITOPS_FIND_H_ */