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