1
2
3
4
5
6
7#include <linux/bitmap.h>
8#include <linux/bitops.h>
9#include <linux/bug.h>
10#include <linux/ctype.h>
11#include <linux/device.h>
12#include <linux/errno.h>
13#include <linux/export.h>
14#include <linux/kernel.h>
15#include <linux/mm.h>
16#include <linux/slab.h>
17#include <linux/string.h>
18#include <linux/thread_info.h>
19#include <linux/uaccess.h>
20
21#include <asm/page.h>
22
23#include "kstrtox.h"
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48int __bitmap_equal(const unsigned long *bitmap1,
49 const unsigned long *bitmap2, unsigned int bits)
50{
51 unsigned int k, lim = bits/BITS_PER_LONG;
52 for (k = 0; k < lim; ++k)
53 if (bitmap1[k] != bitmap2[k])
54 return 0;
55
56 if (bits % BITS_PER_LONG)
57 if ((bitmap1[k] ^ bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits))
58 return 0;
59
60 return 1;
61}
62EXPORT_SYMBOL(__bitmap_equal);
63
64bool __bitmap_or_equal(const unsigned long *bitmap1,
65 const unsigned long *bitmap2,
66 const unsigned long *bitmap3,
67 unsigned int bits)
68{
69 unsigned int k, lim = bits / BITS_PER_LONG;
70 unsigned long tmp;
71
72 for (k = 0; k < lim; ++k) {
73 if ((bitmap1[k] | bitmap2[k]) != bitmap3[k])
74 return false;
75 }
76
77 if (!(bits % BITS_PER_LONG))
78 return true;
79
80 tmp = (bitmap1[k] | bitmap2[k]) ^ bitmap3[k];
81 return (tmp & BITMAP_LAST_WORD_MASK(bits)) == 0;
82}
83
84void __bitmap_complement(unsigned long *dst, const unsigned long *src, unsigned int bits)
85{
86 unsigned int k, lim = BITS_TO_LONGS(bits);
87 for (k = 0; k < lim; ++k)
88 dst[k] = ~src[k];
89}
90EXPORT_SYMBOL(__bitmap_complement);
91
92
93
94
95
96
97
98
99
100
101
102
103void __bitmap_shift_right(unsigned long *dst, const unsigned long *src,
104 unsigned shift, unsigned nbits)
105{
106 unsigned k, lim = BITS_TO_LONGS(nbits);
107 unsigned off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG;
108 unsigned long mask = BITMAP_LAST_WORD_MASK(nbits);
109 for (k = 0; off + k < lim; ++k) {
110 unsigned long upper, lower;
111
112
113
114
115
116 if (!rem || off + k + 1 >= lim)
117 upper = 0;
118 else {
119 upper = src[off + k + 1];
120 if (off + k + 1 == lim - 1)
121 upper &= mask;
122 upper <<= (BITS_PER_LONG - rem);
123 }
124 lower = src[off + k];
125 if (off + k == lim - 1)
126 lower &= mask;
127 lower >>= rem;
128 dst[k] = lower | upper;
129 }
130 if (off)
131 memset(&dst[lim - off], 0, off*sizeof(unsigned long));
132}
133EXPORT_SYMBOL(__bitmap_shift_right);
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148void __bitmap_shift_left(unsigned long *dst, const unsigned long *src,
149 unsigned int shift, unsigned int nbits)
150{
151 int k;
152 unsigned int lim = BITS_TO_LONGS(nbits);
153 unsigned int off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG;
154 for (k = lim - off - 1; k >= 0; --k) {
155 unsigned long upper, lower;
156
157
158
159
160
161 if (rem && k > 0)
162 lower = src[k - 1] >> (BITS_PER_LONG - rem);
163 else
164 lower = 0;
165 upper = src[k] << rem;
166 dst[k + off] = lower | upper;
167 }
168 if (off)
169 memset(dst, 0, off*sizeof(unsigned long));
170}
171EXPORT_SYMBOL(__bitmap_shift_left);
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210void bitmap_cut(unsigned long *dst, const unsigned long *src,
211 unsigned int first, unsigned int cut, unsigned int nbits)
212{
213 unsigned int len = BITS_TO_LONGS(nbits);
214 unsigned long keep = 0, carry;
215 int i;
216
217 if (first % BITS_PER_LONG) {
218 keep = src[first / BITS_PER_LONG] &
219 (~0UL >> (BITS_PER_LONG - first % BITS_PER_LONG));
220 }
221
222 memmove(dst, src, len * sizeof(*dst));
223
224 while (cut--) {
225 for (i = first / BITS_PER_LONG; i < len; i++) {
226 if (i < len - 1)
227 carry = dst[i + 1] & 1UL;
228 else
229 carry = 0;
230
231 dst[i] = (dst[i] >> 1) | (carry << (BITS_PER_LONG - 1));
232 }
233 }
234
235 dst[first / BITS_PER_LONG] &= ~0UL << (first % BITS_PER_LONG);
236 dst[first / BITS_PER_LONG] |= keep;
237}
238EXPORT_SYMBOL(bitmap_cut);
239
240int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
241 const unsigned long *bitmap2, unsigned int bits)
242{
243 unsigned int k;
244 unsigned int lim = bits/BITS_PER_LONG;
245 unsigned long result = 0;
246
247 for (k = 0; k < lim; k++)
248 result |= (dst[k] = bitmap1[k] & bitmap2[k]);
249 if (bits % BITS_PER_LONG)
250 result |= (dst[k] = bitmap1[k] & bitmap2[k] &
251 BITMAP_LAST_WORD_MASK(bits));
252 return result != 0;
253}
254EXPORT_SYMBOL(__bitmap_and);
255
256void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
257 const unsigned long *bitmap2, unsigned int bits)
258{
259 unsigned int k;
260 unsigned int nr = BITS_TO_LONGS(bits);
261
262 for (k = 0; k < nr; k++)
263 dst[k] = bitmap1[k] | bitmap2[k];
264}
265EXPORT_SYMBOL(__bitmap_or);
266
267void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
268 const unsigned long *bitmap2, unsigned int bits)
269{
270 unsigned int k;
271 unsigned int nr = BITS_TO_LONGS(bits);
272
273 for (k = 0; k < nr; k++)
274 dst[k] = bitmap1[k] ^ bitmap2[k];
275}
276EXPORT_SYMBOL(__bitmap_xor);
277
278int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
279 const unsigned long *bitmap2, unsigned int bits)
280{
281 unsigned int k;
282 unsigned int lim = bits/BITS_PER_LONG;
283 unsigned long result = 0;
284
285 for (k = 0; k < lim; k++)
286 result |= (dst[k] = bitmap1[k] & ~bitmap2[k]);
287 if (bits % BITS_PER_LONG)
288 result |= (dst[k] = bitmap1[k] & ~bitmap2[k] &
289 BITMAP_LAST_WORD_MASK(bits));
290 return result != 0;
291}
292EXPORT_SYMBOL(__bitmap_andnot);
293
294void __bitmap_replace(unsigned long *dst,
295 const unsigned long *old, const unsigned long *new,
296 const unsigned long *mask, unsigned int nbits)
297{
298 unsigned int k;
299 unsigned int nr = BITS_TO_LONGS(nbits);
300
301 for (k = 0; k < nr; k++)
302 dst[k] = (old[k] & ~mask[k]) | (new[k] & mask[k]);
303}
304EXPORT_SYMBOL(__bitmap_replace);
305
306int __bitmap_intersects(const unsigned long *bitmap1,
307 const unsigned long *bitmap2, unsigned int bits)
308{
309 unsigned int k, lim = bits/BITS_PER_LONG;
310 for (k = 0; k < lim; ++k)
311 if (bitmap1[k] & bitmap2[k])
312 return 1;
313
314 if (bits % BITS_PER_LONG)
315 if ((bitmap1[k] & bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits))
316 return 1;
317 return 0;
318}
319EXPORT_SYMBOL(__bitmap_intersects);
320
321int __bitmap_subset(const unsigned long *bitmap1,
322 const unsigned long *bitmap2, unsigned int bits)
323{
324 unsigned int k, lim = bits/BITS_PER_LONG;
325 for (k = 0; k < lim; ++k)
326 if (bitmap1[k] & ~bitmap2[k])
327 return 0;
328
329 if (bits % BITS_PER_LONG)
330 if ((bitmap1[k] & ~bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits))
331 return 0;
332 return 1;
333}
334EXPORT_SYMBOL(__bitmap_subset);
335
336int __bitmap_weight(const unsigned long *bitmap, unsigned int bits)
337{
338 unsigned int k, lim = bits/BITS_PER_LONG;
339 int w = 0;
340
341 for (k = 0; k < lim; k++)
342 w += hweight_long(bitmap[k]);
343
344 if (bits % BITS_PER_LONG)
345 w += hweight_long(bitmap[k] & BITMAP_LAST_WORD_MASK(bits));
346
347 return w;
348}
349EXPORT_SYMBOL(__bitmap_weight);
350
351void __bitmap_set(unsigned long *map, unsigned int start, int len)
352{
353 unsigned long *p = map + BIT_WORD(start);
354 const unsigned int size = start + len;
355 int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG);
356 unsigned long mask_to_set = BITMAP_FIRST_WORD_MASK(start);
357
358 while (len - bits_to_set >= 0) {
359 *p |= mask_to_set;
360 len -= bits_to_set;
361 bits_to_set = BITS_PER_LONG;
362 mask_to_set = ~0UL;
363 p++;
364 }
365 if (len) {
366 mask_to_set &= BITMAP_LAST_WORD_MASK(size);
367 *p |= mask_to_set;
368 }
369}
370EXPORT_SYMBOL(__bitmap_set);
371
372void __bitmap_clear(unsigned long *map, unsigned int start, int len)
373{
374 unsigned long *p = map + BIT_WORD(start);
375 const unsigned int size = start + len;
376 int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG);
377 unsigned long mask_to_clear = BITMAP_FIRST_WORD_MASK(start);
378
379 while (len - bits_to_clear >= 0) {
380 *p &= ~mask_to_clear;
381 len -= bits_to_clear;
382 bits_to_clear = BITS_PER_LONG;
383 mask_to_clear = ~0UL;
384 p++;
385 }
386 if (len) {
387 mask_to_clear &= BITMAP_LAST_WORD_MASK(size);
388 *p &= ~mask_to_clear;
389 }
390}
391EXPORT_SYMBOL(__bitmap_clear);
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
407 unsigned long size,
408 unsigned long start,
409 unsigned int nr,
410 unsigned long align_mask,
411 unsigned long align_offset)
412{
413 unsigned long index, end, i;
414again:
415 index = find_next_zero_bit(map, size, start);
416
417
418 index = __ALIGN_MASK(index + align_offset, align_mask) - align_offset;
419
420 end = index + nr;
421 if (end > size)
422 return end;
423 i = find_next_bit(map, end, index);
424 if (i < end) {
425 start = i + 1;
426 goto again;
427 }
428 return index;
429}
430EXPORT_SYMBOL(bitmap_find_next_zero_area_off);
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446int bitmap_parse_user(const char __user *ubuf,
447 unsigned int ulen, unsigned long *maskp,
448 int nmaskbits)
449{
450 char *buf;
451 int ret;
452
453 buf = memdup_user_nul(ubuf, ulen);
454 if (IS_ERR(buf))
455 return PTR_ERR(buf);
456
457 ret = bitmap_parse(buf, UINT_MAX, maskp, nmaskbits);
458
459 kfree(buf);
460 return ret;
461}
462EXPORT_SYMBOL(bitmap_parse_user);
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480int bitmap_print_to_pagebuf(bool list, char *buf, const unsigned long *maskp,
481 int nmaskbits)
482{
483 ptrdiff_t len = PAGE_SIZE - offset_in_page(buf);
484
485 return list ? scnprintf(buf, len, "%*pbl\n", nmaskbits, maskp) :
486 scnprintf(buf, len, "%*pb\n", nmaskbits, maskp);
487}
488EXPORT_SYMBOL(bitmap_print_to_pagebuf);
489
490
491
492
493
494
495
496
497struct region {
498 unsigned int start;
499 unsigned int off;
500 unsigned int group_len;
501 unsigned int end;
502 unsigned int nbits;
503};
504
505static void bitmap_set_region(const struct region *r, unsigned long *bitmap)
506{
507 unsigned int start;
508
509 for (start = r->start; start <= r->end; start += r->group_len)
510 bitmap_set(bitmap, start, min(r->end - start + 1, r->off));
511}
512
513static int bitmap_check_region(const struct region *r)
514{
515 if (r->start > r->end || r->group_len == 0 || r->off > r->group_len)
516 return -EINVAL;
517
518 if (r->end >= r->nbits)
519 return -ERANGE;
520
521 return 0;
522}
523
524static const char *bitmap_getnum(const char *str, unsigned int *num,
525 unsigned int lastbit)
526{
527 unsigned long long n;
528 unsigned int len;
529
530 if (str[0] == 'N') {
531 *num = lastbit;
532 return str + 1;
533 }
534
535 len = _parse_integer(str, 10, &n);
536 if (!len)
537 return ERR_PTR(-EINVAL);
538 if (len & KSTRTOX_OVERFLOW || n != (unsigned int)n)
539 return ERR_PTR(-EOVERFLOW);
540
541 *num = n;
542 return str + len;
543}
544
545static inline bool end_of_str(char c)
546{
547 return c == '\0' || c == '\n';
548}
549
550static inline bool __end_of_region(char c)
551{
552 return isspace(c) || c == ',';
553}
554
555static inline bool end_of_region(char c)
556{
557 return __end_of_region(c) || end_of_str(c);
558}
559
560
561
562
563
564static const char *bitmap_find_region(const char *str)
565{
566 while (__end_of_region(*str))
567 str++;
568
569 return end_of_str(*str) ? NULL : str;
570}
571
572static const char *bitmap_find_region_reverse(const char *start, const char *end)
573{
574 while (start <= end && __end_of_region(*end))
575 end--;
576
577 return end;
578}
579
580static const char *bitmap_parse_region(const char *str, struct region *r)
581{
582 unsigned int lastbit = r->nbits - 1;
583
584 str = bitmap_getnum(str, &r->start, lastbit);
585 if (IS_ERR(str))
586 return str;
587
588 if (end_of_region(*str))
589 goto no_end;
590
591 if (*str != '-')
592 return ERR_PTR(-EINVAL);
593
594 str = bitmap_getnum(str + 1, &r->end, lastbit);
595 if (IS_ERR(str))
596 return str;
597
598 if (end_of_region(*str))
599 goto no_pattern;
600
601 if (*str != ':')
602 return ERR_PTR(-EINVAL);
603
604 str = bitmap_getnum(str + 1, &r->off, lastbit);
605 if (IS_ERR(str))
606 return str;
607
608 if (*str != '/')
609 return ERR_PTR(-EINVAL);
610
611 return bitmap_getnum(str + 1, &r->group_len, lastbit);
612
613no_end:
614 r->end = r->start;
615no_pattern:
616 r->off = r->end + 1;
617 r->group_len = r->end + 1;
618
619 return end_of_str(*str) ? NULL : str;
620}
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650int bitmap_parselist(const char *buf, unsigned long *maskp, int nmaskbits)
651{
652 struct region r;
653 long ret;
654
655 r.nbits = nmaskbits;
656 bitmap_zero(maskp, r.nbits);
657
658 while (buf) {
659 buf = bitmap_find_region(buf);
660 if (buf == NULL)
661 return 0;
662
663 buf = bitmap_parse_region(buf, &r);
664 if (IS_ERR(buf))
665 return PTR_ERR(buf);
666
667 ret = bitmap_check_region(&r);
668 if (ret)
669 return ret;
670
671 bitmap_set_region(&r, maskp);
672 }
673
674 return 0;
675}
676EXPORT_SYMBOL(bitmap_parselist);
677
678
679
680
681
682
683
684
685
686
687
688
689
690int bitmap_parselist_user(const char __user *ubuf,
691 unsigned int ulen, unsigned long *maskp,
692 int nmaskbits)
693{
694 char *buf;
695 int ret;
696
697 buf = memdup_user_nul(ubuf, ulen);
698 if (IS_ERR(buf))
699 return PTR_ERR(buf);
700
701 ret = bitmap_parselist(buf, maskp, nmaskbits);
702
703 kfree(buf);
704 return ret;
705}
706EXPORT_SYMBOL(bitmap_parselist_user);
707
708static const char *bitmap_get_x32_reverse(const char *start,
709 const char *end, u32 *num)
710{
711 u32 ret = 0;
712 int c, i;
713
714 for (i = 0; i < 32; i += 4) {
715 c = hex_to_bin(*end--);
716 if (c < 0)
717 return ERR_PTR(-EINVAL);
718
719 ret |= c << i;
720
721 if (start > end || __end_of_region(*end))
722 goto out;
723 }
724
725 if (hex_to_bin(*end--) >= 0)
726 return ERR_PTR(-EOVERFLOW);
727out:
728 *num = ret;
729 return end;
730}
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748int bitmap_parse(const char *start, unsigned int buflen,
749 unsigned long *maskp, int nmaskbits)
750{
751 const char *end = strnchrnul(start, buflen, '\n') - 1;
752 int chunks = BITS_TO_U32(nmaskbits);
753 u32 *bitmap = (u32 *)maskp;
754 int unset_bit;
755 int chunk;
756
757 for (chunk = 0; ; chunk++) {
758 end = bitmap_find_region_reverse(start, end);
759 if (start > end)
760 break;
761
762 if (!chunks--)
763 return -EOVERFLOW;
764
765#if defined(CONFIG_64BIT) && defined(__BIG_ENDIAN)
766 end = bitmap_get_x32_reverse(start, end, &bitmap[chunk ^ 1]);
767#else
768 end = bitmap_get_x32_reverse(start, end, &bitmap[chunk]);
769#endif
770 if (IS_ERR(end))
771 return PTR_ERR(end);
772 }
773
774 unset_bit = (BITS_TO_U32(nmaskbits) - chunks) * 32;
775 if (unset_bit < nmaskbits) {
776 bitmap_clear(maskp, unset_bit, nmaskbits - unset_bit);
777 return 0;
778 }
779
780 if (find_next_bit(maskp, unset_bit, nmaskbits) != unset_bit)
781 return -EOVERFLOW;
782
783 return 0;
784}
785EXPORT_SYMBOL(bitmap_parse);
786
787
788#ifdef CONFIG_NUMA
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807static int bitmap_pos_to_ord(const unsigned long *buf, unsigned int pos, unsigned int nbits)
808{
809 if (pos >= nbits || !test_bit(pos, buf))
810 return -1;
811
812 return __bitmap_weight(buf, pos);
813}
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833unsigned int bitmap_ord_to_pos(const unsigned long *buf, unsigned int ord, unsigned int nbits)
834{
835 unsigned int pos;
836
837 for (pos = find_first_bit(buf, nbits);
838 pos < nbits && ord;
839 pos = find_next_bit(buf, nbits, pos + 1))
840 ord--;
841
842 return pos;
843}
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877void bitmap_remap(unsigned long *dst, const unsigned long *src,
878 const unsigned long *old, const unsigned long *new,
879 unsigned int nbits)
880{
881 unsigned int oldbit, w;
882
883 if (dst == src)
884 return;
885 bitmap_zero(dst, nbits);
886
887 w = bitmap_weight(new, nbits);
888 for_each_set_bit(oldbit, src, nbits) {
889 int n = bitmap_pos_to_ord(old, oldbit, nbits);
890
891 if (n < 0 || w == 0)
892 set_bit(oldbit, dst);
893 else
894 set_bit(bitmap_ord_to_pos(new, n % w, nbits), dst);
895 }
896}
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924int bitmap_bitremap(int oldbit, const unsigned long *old,
925 const unsigned long *new, int bits)
926{
927 int w = bitmap_weight(new, bits);
928 int n = bitmap_pos_to_ord(old, oldbit, bits);
929 if (n < 0 || w == 0)
930 return oldbit;
931 else
932 return bitmap_ord_to_pos(new, n % w, bits);
933}
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041void bitmap_onto(unsigned long *dst, const unsigned long *orig,
1042 const unsigned long *relmap, unsigned int bits)
1043{
1044 unsigned int n, m;
1045
1046 if (dst == orig)
1047 return;
1048 bitmap_zero(dst, bits);
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060 m = 0;
1061 for_each_set_bit(n, relmap, bits) {
1062
1063 if (test_bit(m, orig))
1064 set_bit(n, dst);
1065 m++;
1066 }
1067}
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080void bitmap_fold(unsigned long *dst, const unsigned long *orig,
1081 unsigned int sz, unsigned int nbits)
1082{
1083 unsigned int oldbit;
1084
1085 if (dst == orig)
1086 return;
1087 bitmap_zero(dst, nbits);
1088
1089 for_each_set_bit(oldbit, orig, nbits)
1090 set_bit(oldbit % sz, dst);
1091}
1092#endif
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112enum {
1113 REG_OP_ISFREE,
1114 REG_OP_ALLOC,
1115 REG_OP_RELEASE,
1116};
1117
1118static int __reg_op(unsigned long *bitmap, unsigned int pos, int order, int reg_op)
1119{
1120 int nbits_reg;
1121 int index;
1122 int offset;
1123 int nlongs_reg;
1124 int nbitsinlong;
1125 unsigned long mask;
1126 int i;
1127 int ret = 0;
1128
1129
1130
1131
1132
1133 nbits_reg = 1 << order;
1134 index = pos / BITS_PER_LONG;
1135 offset = pos - (index * BITS_PER_LONG);
1136 nlongs_reg = BITS_TO_LONGS(nbits_reg);
1137 nbitsinlong = min(nbits_reg, BITS_PER_LONG);
1138
1139
1140
1141
1142
1143 mask = (1UL << (nbitsinlong - 1));
1144 mask += mask - 1;
1145 mask <<= offset;
1146
1147 switch (reg_op) {
1148 case REG_OP_ISFREE:
1149 for (i = 0; i < nlongs_reg; i++) {
1150 if (bitmap[index + i] & mask)
1151 goto done;
1152 }
1153 ret = 1;
1154 break;
1155
1156 case REG_OP_ALLOC:
1157 for (i = 0; i < nlongs_reg; i++)
1158 bitmap[index + i] |= mask;
1159 break;
1160
1161 case REG_OP_RELEASE:
1162 for (i = 0; i < nlongs_reg; i++)
1163 bitmap[index + i] &= ~mask;
1164 break;
1165 }
1166done:
1167 return ret;
1168}
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184int bitmap_find_free_region(unsigned long *bitmap, unsigned int bits, int order)
1185{
1186 unsigned int pos, end;
1187
1188 for (pos = 0 ; (end = pos + (1U << order)) <= bits; pos = end) {
1189 if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE))
1190 continue;
1191 __reg_op(bitmap, pos, order, REG_OP_ALLOC);
1192 return pos;
1193 }
1194 return -ENOMEM;
1195}
1196EXPORT_SYMBOL(bitmap_find_free_region);
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int order)
1210{
1211 __reg_op(bitmap, pos, order, REG_OP_RELEASE);
1212}
1213EXPORT_SYMBOL(bitmap_release_region);
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order)
1227{
1228 if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE))
1229 return -EBUSY;
1230 return __reg_op(bitmap, pos, order, REG_OP_ALLOC);
1231}
1232EXPORT_SYMBOL(bitmap_allocate_region);
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242#ifdef __BIG_ENDIAN
1243void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int nbits)
1244{
1245 unsigned int i;
1246
1247 for (i = 0; i < nbits/BITS_PER_LONG; i++) {
1248 if (BITS_PER_LONG == 64)
1249 dst[i] = cpu_to_le64(src[i]);
1250 else
1251 dst[i] = cpu_to_le32(src[i]);
1252 }
1253}
1254EXPORT_SYMBOL(bitmap_copy_le);
1255#endif
1256
1257unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags)
1258{
1259 return kmalloc_array(BITS_TO_LONGS(nbits), sizeof(unsigned long),
1260 flags);
1261}
1262EXPORT_SYMBOL(bitmap_alloc);
1263
1264unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags)
1265{
1266 return bitmap_alloc(nbits, flags | __GFP_ZERO);
1267}
1268EXPORT_SYMBOL(bitmap_zalloc);
1269
1270void bitmap_free(const unsigned long *bitmap)
1271{
1272 kfree(bitmap);
1273}
1274EXPORT_SYMBOL(bitmap_free);
1275
1276static void devm_bitmap_free(void *data)
1277{
1278 unsigned long *bitmap = data;
1279
1280 bitmap_free(bitmap);
1281}
1282
1283unsigned long *devm_bitmap_alloc(struct device *dev,
1284 unsigned int nbits, gfp_t flags)
1285{
1286 unsigned long *bitmap;
1287 int ret;
1288
1289 bitmap = bitmap_alloc(nbits, flags);
1290 if (!bitmap)
1291 return NULL;
1292
1293 ret = devm_add_action_or_reset(dev, devm_bitmap_free, bitmap);
1294 if (ret)
1295 return NULL;
1296
1297 return bitmap;
1298}
1299EXPORT_SYMBOL_GPL(devm_bitmap_alloc);
1300
1301unsigned long *devm_bitmap_zalloc(struct device *dev,
1302 unsigned int nbits, gfp_t flags)
1303{
1304 return devm_bitmap_alloc(dev, nbits, flags | __GFP_ZERO);
1305}
1306EXPORT_SYMBOL_GPL(devm_bitmap_zalloc);
1307
1308#if BITS_PER_LONG == 64
1309
1310
1311
1312
1313
1314
1315void bitmap_from_arr32(unsigned long *bitmap, const u32 *buf, unsigned int nbits)
1316{
1317 unsigned int i, halfwords;
1318
1319 halfwords = DIV_ROUND_UP(nbits, 32);
1320 for (i = 0; i < halfwords; i++) {
1321 bitmap[i/2] = (unsigned long) buf[i];
1322 if (++i < halfwords)
1323 bitmap[i/2] |= ((unsigned long) buf[i]) << 32;
1324 }
1325
1326
1327 if (nbits % BITS_PER_LONG)
1328 bitmap[(halfwords - 1) / 2] &= BITMAP_LAST_WORD_MASK(nbits);
1329}
1330EXPORT_SYMBOL(bitmap_from_arr32);
1331
1332
1333
1334
1335
1336
1337
1338void bitmap_to_arr32(u32 *buf, const unsigned long *bitmap, unsigned int nbits)
1339{
1340 unsigned int i, halfwords;
1341
1342 halfwords = DIV_ROUND_UP(nbits, 32);
1343 for (i = 0; i < halfwords; i++) {
1344 buf[i] = (u32) (bitmap[i/2] & UINT_MAX);
1345 if (++i < halfwords)
1346 buf[i] = (u32) (bitmap[i/2] >> 32);
1347 }
1348
1349
1350 if (nbits % BITS_PER_LONG)
1351 buf[halfwords - 1] &= (u32) (UINT_MAX >> ((-nbits) & 31));
1352}
1353EXPORT_SYMBOL(bitmap_to_arr32);
1354
1355#endif
1356