.. | .. |
---|
15 | 15 | const unsigned long *bitmap2, int bits); |
---|
16 | 16 | int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, |
---|
17 | 17 | const unsigned long *bitmap2, unsigned int bits); |
---|
| 18 | +int __bitmap_equal(const unsigned long *bitmap1, |
---|
| 19 | + const unsigned long *bitmap2, unsigned int bits); |
---|
| 20 | +void bitmap_clear(unsigned long *map, unsigned int start, int len); |
---|
18 | 21 | |
---|
19 | 22 | #define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1))) |
---|
20 | 23 | |
---|
.. | .. |
---|
123 | 126 | } |
---|
124 | 127 | |
---|
125 | 128 | /* |
---|
| 129 | + * bitmap_free - Free bitmap |
---|
| 130 | + * @bitmap: pointer to bitmap |
---|
| 131 | + */ |
---|
| 132 | +static inline void bitmap_free(unsigned long *bitmap) |
---|
| 133 | +{ |
---|
| 134 | + free(bitmap); |
---|
| 135 | +} |
---|
| 136 | + |
---|
| 137 | +/* |
---|
126 | 138 | * bitmap_scnprintf - print bitmap list into buffer |
---|
127 | 139 | * @bitmap: bitmap |
---|
128 | 140 | * @nbits: size of bitmap |
---|
.. | .. |
---|
147 | 159 | return __bitmap_and(dst, src1, src2, nbits); |
---|
148 | 160 | } |
---|
149 | 161 | |
---|
| 162 | +#ifdef __LITTLE_ENDIAN |
---|
| 163 | +#define BITMAP_MEM_ALIGNMENT 8 |
---|
| 164 | +#else |
---|
| 165 | +#define BITMAP_MEM_ALIGNMENT (8 * sizeof(unsigned long)) |
---|
| 166 | +#endif |
---|
| 167 | +#define BITMAP_MEM_MASK (BITMAP_MEM_ALIGNMENT - 1) |
---|
| 168 | +#define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) - 1)) == 0) |
---|
| 169 | + |
---|
| 170 | +static inline int bitmap_equal(const unsigned long *src1, |
---|
| 171 | + const unsigned long *src2, unsigned int nbits) |
---|
| 172 | +{ |
---|
| 173 | + if (small_const_nbits(nbits)) |
---|
| 174 | + return !((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits)); |
---|
| 175 | + if (__builtin_constant_p(nbits & BITMAP_MEM_MASK) && |
---|
| 176 | + IS_ALIGNED(nbits, BITMAP_MEM_ALIGNMENT)) |
---|
| 177 | + return !memcmp(src1, src2, nbits / 8); |
---|
| 178 | + return __bitmap_equal(src1, src2, nbits); |
---|
| 179 | +} |
---|
| 180 | + |
---|
150 | 181 | #endif /* _PERF_BITOPS_H */ |
---|