1
2#ifndef __LINUX_BITMAP_H
3#define __LINUX_BITMAP_H
4
5#ifndef __ASSEMBLY__
6
7#include <linux/align.h>
8#include <linux/bitops.h>
9#include <linux/limits.h>
10#include <linux/string.h>
11#include <linux/types.h>
12
13struct device;
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags);
125unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags);
126unsigned long *bitmap_alloc_node(unsigned int nbits, gfp_t flags, int node);
127unsigned long *bitmap_zalloc_node(unsigned int nbits, gfp_t flags, int node);
128void bitmap_free(const unsigned long *bitmap);
129
130
131unsigned long *devm_bitmap_alloc(struct device *dev,
132 unsigned int nbits, gfp_t flags);
133unsigned long *devm_bitmap_zalloc(struct device *dev,
134 unsigned int nbits, gfp_t flags);
135
136
137
138
139
140int __bitmap_equal(const unsigned long *bitmap1,
141 const unsigned long *bitmap2, unsigned int nbits);
142bool __pure __bitmap_or_equal(const unsigned long *src1,
143 const unsigned long *src2,
144 const unsigned long *src3,
145 unsigned int nbits);
146void __bitmap_complement(unsigned long *dst, const unsigned long *src,
147 unsigned int nbits);
148void __bitmap_shift_right(unsigned long *dst, const unsigned long *src,
149 unsigned int shift, unsigned int nbits);
150void __bitmap_shift_left(unsigned long *dst, const unsigned long *src,
151 unsigned int shift, unsigned int nbits);
152void bitmap_cut(unsigned long *dst, const unsigned long *src,
153 unsigned int first, unsigned int cut, unsigned int nbits);
154int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
155 const unsigned long *bitmap2, unsigned int nbits);
156void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
157 const unsigned long *bitmap2, unsigned int nbits);
158void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
159 const unsigned long *bitmap2, unsigned int nbits);
160int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
161 const unsigned long *bitmap2, unsigned int nbits);
162void __bitmap_replace(unsigned long *dst,
163 const unsigned long *old, const unsigned long *new,
164 const unsigned long *mask, unsigned int nbits);
165int __bitmap_intersects(const unsigned long *bitmap1,
166 const unsigned long *bitmap2, unsigned int nbits);
167int __bitmap_subset(const unsigned long *bitmap1,
168 const unsigned long *bitmap2, unsigned int nbits);
169int __bitmap_weight(const unsigned long *bitmap, unsigned int nbits);
170void __bitmap_set(unsigned long *map, unsigned int start, int len);
171void __bitmap_clear(unsigned long *map, unsigned int start, int len);
172
173unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
174 unsigned long size,
175 unsigned long start,
176 unsigned int nr,
177 unsigned long align_mask,
178 unsigned long align_offset);
179
180
181
182
183
184
185
186
187
188
189
190
191
192static inline unsigned long
193bitmap_find_next_zero_area(unsigned long *map,
194 unsigned long size,
195 unsigned long start,
196 unsigned int nr,
197 unsigned long align_mask)
198{
199 return bitmap_find_next_zero_area_off(map, size, start, nr,
200 align_mask, 0);
201}
202
203int bitmap_parse(const char *buf, unsigned int buflen,
204 unsigned long *dst, int nbits);
205int bitmap_parse_user(const char __user *ubuf, unsigned int ulen,
206 unsigned long *dst, int nbits);
207int bitmap_parselist(const char *buf, unsigned long *maskp,
208 int nmaskbits);
209int bitmap_parselist_user(const char __user *ubuf, unsigned int ulen,
210 unsigned long *dst, int nbits);
211void bitmap_remap(unsigned long *dst, const unsigned long *src,
212 const unsigned long *old, const unsigned long *new, unsigned int nbits);
213int bitmap_bitremap(int oldbit,
214 const unsigned long *old, const unsigned long *new, int bits);
215void bitmap_onto(unsigned long *dst, const unsigned long *orig,
216 const unsigned long *relmap, unsigned int bits);
217void bitmap_fold(unsigned long *dst, const unsigned long *orig,
218 unsigned int sz, unsigned int nbits);
219int bitmap_find_free_region(unsigned long *bitmap, unsigned int bits, int order);
220void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int order);
221int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order);
222
223#ifdef __BIG_ENDIAN
224void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int nbits);
225#else
226#define bitmap_copy_le bitmap_copy
227#endif
228unsigned int bitmap_ord_to_pos(const unsigned long *bitmap, unsigned int ord, unsigned int nbits);
229int bitmap_print_to_pagebuf(bool list, char *buf,
230 const unsigned long *maskp, int nmaskbits);
231
232extern int bitmap_print_bitmask_to_buf(char *buf, const unsigned long *maskp,
233 int nmaskbits, loff_t off, size_t count);
234
235extern int bitmap_print_list_to_buf(char *buf, const unsigned long *maskp,
236 int nmaskbits, loff_t off, size_t count);
237
238#define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1)))
239#define BITMAP_LAST_WORD_MASK(nbits) (~0UL >> (-(nbits) & (BITS_PER_LONG - 1)))
240
241static inline void bitmap_zero(unsigned long *dst, unsigned int nbits)
242{
243 unsigned int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
244 memset(dst, 0, len);
245}
246
247static inline void bitmap_fill(unsigned long *dst, unsigned int nbits)
248{
249 unsigned int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
250 memset(dst, 0xff, len);
251}
252
253static inline void bitmap_copy(unsigned long *dst, const unsigned long *src,
254 unsigned int nbits)
255{
256 unsigned int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
257 memcpy(dst, src, len);
258}
259
260
261
262
263static inline void bitmap_copy_clear_tail(unsigned long *dst,
264 const unsigned long *src, unsigned int nbits)
265{
266 bitmap_copy(dst, src, nbits);
267 if (nbits % BITS_PER_LONG)
268 dst[nbits / BITS_PER_LONG] &= BITMAP_LAST_WORD_MASK(nbits);
269}
270
271
272
273
274
275#if BITS_PER_LONG == 64
276void bitmap_from_arr32(unsigned long *bitmap, const u32 *buf,
277 unsigned int nbits);
278void bitmap_to_arr32(u32 *buf, const unsigned long *bitmap,
279 unsigned int nbits);
280#else
281#define bitmap_from_arr32(bitmap, buf, nbits) \
282 bitmap_copy_clear_tail((unsigned long *) (bitmap), \
283 (const unsigned long *) (buf), (nbits))
284#define bitmap_to_arr32(buf, bitmap, nbits) \
285 bitmap_copy_clear_tail((unsigned long *) (buf), \
286 (const unsigned long *) (bitmap), (nbits))
287#endif
288
289static inline int bitmap_and(unsigned long *dst, const unsigned long *src1,
290 const unsigned long *src2, unsigned int nbits)
291{
292 if (small_const_nbits(nbits))
293 return (*dst = *src1 & *src2 & BITMAP_LAST_WORD_MASK(nbits)) != 0;
294 return __bitmap_and(dst, src1, src2, nbits);
295}
296
297static inline void bitmap_or(unsigned long *dst, const unsigned long *src1,
298 const unsigned long *src2, unsigned int nbits)
299{
300 if (small_const_nbits(nbits))
301 *dst = *src1 | *src2;
302 else
303 __bitmap_or(dst, src1, src2, nbits);
304}
305
306static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1,
307 const unsigned long *src2, unsigned int nbits)
308{
309 if (small_const_nbits(nbits))
310 *dst = *src1 ^ *src2;
311 else
312 __bitmap_xor(dst, src1, src2, nbits);
313}
314
315static inline int bitmap_andnot(unsigned long *dst, const unsigned long *src1,
316 const unsigned long *src2, unsigned int nbits)
317{
318 if (small_const_nbits(nbits))
319 return (*dst = *src1 & ~(*src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0;
320 return __bitmap_andnot(dst, src1, src2, nbits);
321}
322
323static inline void bitmap_complement(unsigned long *dst, const unsigned long *src,
324 unsigned int nbits)
325{
326 if (small_const_nbits(nbits))
327 *dst = ~(*src);
328 else
329 __bitmap_complement(dst, src, nbits);
330}
331
332#ifdef __LITTLE_ENDIAN
333#define BITMAP_MEM_ALIGNMENT 8
334#else
335#define BITMAP_MEM_ALIGNMENT (8 * sizeof(unsigned long))
336#endif
337#define BITMAP_MEM_MASK (BITMAP_MEM_ALIGNMENT - 1)
338
339static inline int bitmap_equal(const unsigned long *src1,
340 const unsigned long *src2, unsigned int nbits)
341{
342 if (small_const_nbits(nbits))
343 return !((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits));
344 if (__builtin_constant_p(nbits & BITMAP_MEM_MASK) &&
345 IS_ALIGNED(nbits, BITMAP_MEM_ALIGNMENT))
346 return !memcmp(src1, src2, nbits / 8);
347 return __bitmap_equal(src1, src2, nbits);
348}
349
350
351
352
353
354
355
356
357
358
359static inline bool bitmap_or_equal(const unsigned long *src1,
360 const unsigned long *src2,
361 const unsigned long *src3,
362 unsigned int nbits)
363{
364 if (!small_const_nbits(nbits))
365 return __bitmap_or_equal(src1, src2, src3, nbits);
366
367 return !(((*src1 | *src2) ^ *src3) & BITMAP_LAST_WORD_MASK(nbits));
368}
369
370static inline int bitmap_intersects(const unsigned long *src1,
371 const unsigned long *src2, unsigned int nbits)
372{
373 if (small_const_nbits(nbits))
374 return ((*src1 & *src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0;
375 else
376 return __bitmap_intersects(src1, src2, nbits);
377}
378
379static inline int bitmap_subset(const unsigned long *src1,
380 const unsigned long *src2, unsigned int nbits)
381{
382 if (small_const_nbits(nbits))
383 return ! ((*src1 & ~(*src2)) & BITMAP_LAST_WORD_MASK(nbits));
384 else
385 return __bitmap_subset(src1, src2, nbits);
386}
387
388static inline bool bitmap_empty(const unsigned long *src, unsigned nbits)
389{
390 if (small_const_nbits(nbits))
391 return ! (*src & BITMAP_LAST_WORD_MASK(nbits));
392
393 return find_first_bit(src, nbits) == nbits;
394}
395
396static inline bool bitmap_full(const unsigned long *src, unsigned int nbits)
397{
398 if (small_const_nbits(nbits))
399 return ! (~(*src) & BITMAP_LAST_WORD_MASK(nbits));
400
401 return find_first_zero_bit(src, nbits) == nbits;
402}
403
404static __always_inline int bitmap_weight(const unsigned long *src, unsigned int nbits)
405{
406 if (small_const_nbits(nbits))
407 return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits));
408 return __bitmap_weight(src, nbits);
409}
410
411static __always_inline void bitmap_set(unsigned long *map, unsigned int start,
412 unsigned int nbits)
413{
414 if (__builtin_constant_p(nbits) && nbits == 1)
415 __set_bit(start, map);
416 else if (__builtin_constant_p(start & BITMAP_MEM_MASK) &&
417 IS_ALIGNED(start, BITMAP_MEM_ALIGNMENT) &&
418 __builtin_constant_p(nbits & BITMAP_MEM_MASK) &&
419 IS_ALIGNED(nbits, BITMAP_MEM_ALIGNMENT))
420 memset((char *)map + start / 8, 0xff, nbits / 8);
421 else
422 __bitmap_set(map, start, nbits);
423}
424
425static __always_inline void bitmap_clear(unsigned long *map, unsigned int start,
426 unsigned int nbits)
427{
428 if (__builtin_constant_p(nbits) && nbits == 1)
429 __clear_bit(start, map);
430 else if (__builtin_constant_p(start & BITMAP_MEM_MASK) &&
431 IS_ALIGNED(start, BITMAP_MEM_ALIGNMENT) &&
432 __builtin_constant_p(nbits & BITMAP_MEM_MASK) &&
433 IS_ALIGNED(nbits, BITMAP_MEM_ALIGNMENT))
434 memset((char *)map + start / 8, 0, nbits / 8);
435 else
436 __bitmap_clear(map, start, nbits);
437}
438
439static inline void bitmap_shift_right(unsigned long *dst, const unsigned long *src,
440 unsigned int shift, unsigned int nbits)
441{
442 if (small_const_nbits(nbits))
443 *dst = (*src & BITMAP_LAST_WORD_MASK(nbits)) >> shift;
444 else
445 __bitmap_shift_right(dst, src, shift, nbits);
446}
447
448static inline void bitmap_shift_left(unsigned long *dst, const unsigned long *src,
449 unsigned int shift, unsigned int nbits)
450{
451 if (small_const_nbits(nbits))
452 *dst = (*src << shift) & BITMAP_LAST_WORD_MASK(nbits);
453 else
454 __bitmap_shift_left(dst, src, shift, nbits);
455}
456
457static inline void bitmap_replace(unsigned long *dst,
458 const unsigned long *old,
459 const unsigned long *new,
460 const unsigned long *mask,
461 unsigned int nbits)
462{
463 if (small_const_nbits(nbits))
464 *dst = (*old & ~(*mask)) | (*new & *mask);
465 else
466 __bitmap_replace(dst, old, new, mask, nbits);
467}
468
469static inline void bitmap_next_clear_region(unsigned long *bitmap,
470 unsigned int *rs, unsigned int *re,
471 unsigned int end)
472{
473 *rs = find_next_zero_bit(bitmap, end, *rs);
474 *re = find_next_bit(bitmap, end, *rs + 1);
475}
476
477static inline void bitmap_next_set_region(unsigned long *bitmap,
478 unsigned int *rs, unsigned int *re,
479 unsigned int end)
480{
481 *rs = find_next_bit(bitmap, end, *rs);
482 *re = find_next_zero_bit(bitmap, end, *rs + 1);
483}
484
485
486
487
488
489
490#define bitmap_for_each_clear_region(bitmap, rs, re, start, end) \
491 for ((rs) = (start), \
492 bitmap_next_clear_region((bitmap), &(rs), &(re), (end)); \
493 (rs) < (re); \
494 (rs) = (re) + 1, \
495 bitmap_next_clear_region((bitmap), &(rs), &(re), (end)))
496
497#define bitmap_for_each_set_region(bitmap, rs, re, start, end) \
498 for ((rs) = (start), \
499 bitmap_next_set_region((bitmap), &(rs), &(re), (end)); \
500 (rs) < (re); \
501 (rs) = (re) + 1, \
502 bitmap_next_set_region((bitmap), &(rs), &(re), (end)))
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530#if __BITS_PER_LONG == 64
531#define BITMAP_FROM_U64(n) (n)
532#else
533#define BITMAP_FROM_U64(n) ((unsigned long) ((u64)(n) & ULONG_MAX)), \
534 ((unsigned long) ((u64)(n) >> 32))
535#endif
536
537
538
539
540
541
542
543
544
545
546
547static inline void bitmap_from_u64(unsigned long *dst, u64 mask)
548{
549 dst[0] = mask & ULONG_MAX;
550
551 if (sizeof(mask) > sizeof(unsigned long))
552 dst[1] = mask >> 32;
553}
554
555
556
557
558
559
560
561
562
563static inline unsigned long bitmap_get_value8(const unsigned long *map,
564 unsigned long start)
565{
566 const size_t index = BIT_WORD(start);
567 const unsigned long offset = start % BITS_PER_LONG;
568
569 return (map[index] >> offset) & 0xFF;
570}
571
572
573
574
575
576
577
578static inline void bitmap_set_value8(unsigned long *map, unsigned long value,
579 unsigned long start)
580{
581 const size_t index = BIT_WORD(start);
582 const unsigned long offset = start % BITS_PER_LONG;
583
584 map[index] &= ~(0xFFUL << offset);
585 map[index] |= value << offset;
586}
587
588#endif
589
590#endif
591