0001
0002
0003
0004
0005
0006
0007 #include <linux/bitmap.h>
0008 #include <linux/bitops.h>
0009 #include <linux/bug.h>
0010 #include <linux/ctype.h>
0011 #include <linux/device.h>
0012 #include <linux/errno.h>
0013 #include <linux/export.h>
0014 #include <linux/kernel.h>
0015 #include <linux/mm.h>
0016 #include <linux/slab.h>
0017 #include <linux/string.h>
0018 #include <linux/thread_info.h>
0019 #include <linux/uaccess.h>
0020
0021 #include <asm/page.h>
0022
0023 #include "kstrtox.h"
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048 bool __bitmap_equal(const unsigned long *bitmap1,
0049 const unsigned long *bitmap2, unsigned int bits)
0050 {
0051 unsigned int k, lim = bits/BITS_PER_LONG;
0052 for (k = 0; k < lim; ++k)
0053 if (bitmap1[k] != bitmap2[k])
0054 return false;
0055
0056 if (bits % BITS_PER_LONG)
0057 if ((bitmap1[k] ^ bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits))
0058 return false;
0059
0060 return true;
0061 }
0062 EXPORT_SYMBOL(__bitmap_equal);
0063
0064 bool __bitmap_or_equal(const unsigned long *bitmap1,
0065 const unsigned long *bitmap2,
0066 const unsigned long *bitmap3,
0067 unsigned int bits)
0068 {
0069 unsigned int k, lim = bits / BITS_PER_LONG;
0070 unsigned long tmp;
0071
0072 for (k = 0; k < lim; ++k) {
0073 if ((bitmap1[k] | bitmap2[k]) != bitmap3[k])
0074 return false;
0075 }
0076
0077 if (!(bits % BITS_PER_LONG))
0078 return true;
0079
0080 tmp = (bitmap1[k] | bitmap2[k]) ^ bitmap3[k];
0081 return (tmp & BITMAP_LAST_WORD_MASK(bits)) == 0;
0082 }
0083
0084 void __bitmap_complement(unsigned long *dst, const unsigned long *src, unsigned int bits)
0085 {
0086 unsigned int k, lim = BITS_TO_LONGS(bits);
0087 for (k = 0; k < lim; ++k)
0088 dst[k] = ~src[k];
0089 }
0090 EXPORT_SYMBOL(__bitmap_complement);
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103 void __bitmap_shift_right(unsigned long *dst, const unsigned long *src,
0104 unsigned shift, unsigned nbits)
0105 {
0106 unsigned k, lim = BITS_TO_LONGS(nbits);
0107 unsigned off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG;
0108 unsigned long mask = BITMAP_LAST_WORD_MASK(nbits);
0109 for (k = 0; off + k < lim; ++k) {
0110 unsigned long upper, lower;
0111
0112
0113
0114
0115
0116 if (!rem || off + k + 1 >= lim)
0117 upper = 0;
0118 else {
0119 upper = src[off + k + 1];
0120 if (off + k + 1 == lim - 1)
0121 upper &= mask;
0122 upper <<= (BITS_PER_LONG - rem);
0123 }
0124 lower = src[off + k];
0125 if (off + k == lim - 1)
0126 lower &= mask;
0127 lower >>= rem;
0128 dst[k] = lower | upper;
0129 }
0130 if (off)
0131 memset(&dst[lim - off], 0, off*sizeof(unsigned long));
0132 }
0133 EXPORT_SYMBOL(__bitmap_shift_right);
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148 void __bitmap_shift_left(unsigned long *dst, const unsigned long *src,
0149 unsigned int shift, unsigned int nbits)
0150 {
0151 int k;
0152 unsigned int lim = BITS_TO_LONGS(nbits);
0153 unsigned int off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG;
0154 for (k = lim - off - 1; k >= 0; --k) {
0155 unsigned long upper, lower;
0156
0157
0158
0159
0160
0161 if (rem && k > 0)
0162 lower = src[k - 1] >> (BITS_PER_LONG - rem);
0163 else
0164 lower = 0;
0165 upper = src[k] << rem;
0166 dst[k + off] = lower | upper;
0167 }
0168 if (off)
0169 memset(dst, 0, off*sizeof(unsigned long));
0170 }
0171 EXPORT_SYMBOL(__bitmap_shift_left);
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210 void bitmap_cut(unsigned long *dst, const unsigned long *src,
0211 unsigned int first, unsigned int cut, unsigned int nbits)
0212 {
0213 unsigned int len = BITS_TO_LONGS(nbits);
0214 unsigned long keep = 0, carry;
0215 int i;
0216
0217 if (first % BITS_PER_LONG) {
0218 keep = src[first / BITS_PER_LONG] &
0219 (~0UL >> (BITS_PER_LONG - first % BITS_PER_LONG));
0220 }
0221
0222 memmove(dst, src, len * sizeof(*dst));
0223
0224 while (cut--) {
0225 for (i = first / BITS_PER_LONG; i < len; i++) {
0226 if (i < len - 1)
0227 carry = dst[i + 1] & 1UL;
0228 else
0229 carry = 0;
0230
0231 dst[i] = (dst[i] >> 1) | (carry << (BITS_PER_LONG - 1));
0232 }
0233 }
0234
0235 dst[first / BITS_PER_LONG] &= ~0UL << (first % BITS_PER_LONG);
0236 dst[first / BITS_PER_LONG] |= keep;
0237 }
0238 EXPORT_SYMBOL(bitmap_cut);
0239
0240 bool __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
0241 const unsigned long *bitmap2, unsigned int bits)
0242 {
0243 unsigned int k;
0244 unsigned int lim = bits/BITS_PER_LONG;
0245 unsigned long result = 0;
0246
0247 for (k = 0; k < lim; k++)
0248 result |= (dst[k] = bitmap1[k] & bitmap2[k]);
0249 if (bits % BITS_PER_LONG)
0250 result |= (dst[k] = bitmap1[k] & bitmap2[k] &
0251 BITMAP_LAST_WORD_MASK(bits));
0252 return result != 0;
0253 }
0254 EXPORT_SYMBOL(__bitmap_and);
0255
0256 void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
0257 const unsigned long *bitmap2, unsigned int bits)
0258 {
0259 unsigned int k;
0260 unsigned int nr = BITS_TO_LONGS(bits);
0261
0262 for (k = 0; k < nr; k++)
0263 dst[k] = bitmap1[k] | bitmap2[k];
0264 }
0265 EXPORT_SYMBOL(__bitmap_or);
0266
0267 void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
0268 const unsigned long *bitmap2, unsigned int bits)
0269 {
0270 unsigned int k;
0271 unsigned int nr = BITS_TO_LONGS(bits);
0272
0273 for (k = 0; k < nr; k++)
0274 dst[k] = bitmap1[k] ^ bitmap2[k];
0275 }
0276 EXPORT_SYMBOL(__bitmap_xor);
0277
0278 bool __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
0279 const unsigned long *bitmap2, unsigned int bits)
0280 {
0281 unsigned int k;
0282 unsigned int lim = bits/BITS_PER_LONG;
0283 unsigned long result = 0;
0284
0285 for (k = 0; k < lim; k++)
0286 result |= (dst[k] = bitmap1[k] & ~bitmap2[k]);
0287 if (bits % BITS_PER_LONG)
0288 result |= (dst[k] = bitmap1[k] & ~bitmap2[k] &
0289 BITMAP_LAST_WORD_MASK(bits));
0290 return result != 0;
0291 }
0292 EXPORT_SYMBOL(__bitmap_andnot);
0293
0294 void __bitmap_replace(unsigned long *dst,
0295 const unsigned long *old, const unsigned long *new,
0296 const unsigned long *mask, unsigned int nbits)
0297 {
0298 unsigned int k;
0299 unsigned int nr = BITS_TO_LONGS(nbits);
0300
0301 for (k = 0; k < nr; k++)
0302 dst[k] = (old[k] & ~mask[k]) | (new[k] & mask[k]);
0303 }
0304 EXPORT_SYMBOL(__bitmap_replace);
0305
0306 bool __bitmap_intersects(const unsigned long *bitmap1,
0307 const unsigned long *bitmap2, unsigned int bits)
0308 {
0309 unsigned int k, lim = bits/BITS_PER_LONG;
0310 for (k = 0; k < lim; ++k)
0311 if (bitmap1[k] & bitmap2[k])
0312 return true;
0313
0314 if (bits % BITS_PER_LONG)
0315 if ((bitmap1[k] & bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits))
0316 return true;
0317 return false;
0318 }
0319 EXPORT_SYMBOL(__bitmap_intersects);
0320
0321 bool __bitmap_subset(const unsigned long *bitmap1,
0322 const unsigned long *bitmap2, unsigned int bits)
0323 {
0324 unsigned int k, lim = bits/BITS_PER_LONG;
0325 for (k = 0; k < lim; ++k)
0326 if (bitmap1[k] & ~bitmap2[k])
0327 return false;
0328
0329 if (bits % BITS_PER_LONG)
0330 if ((bitmap1[k] & ~bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits))
0331 return false;
0332 return true;
0333 }
0334 EXPORT_SYMBOL(__bitmap_subset);
0335
0336 unsigned int __bitmap_weight(const unsigned long *bitmap, unsigned int bits)
0337 {
0338 unsigned int k, lim = bits/BITS_PER_LONG, w = 0;
0339
0340 for (k = 0; k < lim; k++)
0341 w += hweight_long(bitmap[k]);
0342
0343 if (bits % BITS_PER_LONG)
0344 w += hweight_long(bitmap[k] & BITMAP_LAST_WORD_MASK(bits));
0345
0346 return w;
0347 }
0348 EXPORT_SYMBOL(__bitmap_weight);
0349
0350 void __bitmap_set(unsigned long *map, unsigned int start, int len)
0351 {
0352 unsigned long *p = map + BIT_WORD(start);
0353 const unsigned int size = start + len;
0354 int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG);
0355 unsigned long mask_to_set = BITMAP_FIRST_WORD_MASK(start);
0356
0357 while (len - bits_to_set >= 0) {
0358 *p |= mask_to_set;
0359 len -= bits_to_set;
0360 bits_to_set = BITS_PER_LONG;
0361 mask_to_set = ~0UL;
0362 p++;
0363 }
0364 if (len) {
0365 mask_to_set &= BITMAP_LAST_WORD_MASK(size);
0366 *p |= mask_to_set;
0367 }
0368 }
0369 EXPORT_SYMBOL(__bitmap_set);
0370
0371 void __bitmap_clear(unsigned long *map, unsigned int start, int len)
0372 {
0373 unsigned long *p = map + BIT_WORD(start);
0374 const unsigned int size = start + len;
0375 int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG);
0376 unsigned long mask_to_clear = BITMAP_FIRST_WORD_MASK(start);
0377
0378 while (len - bits_to_clear >= 0) {
0379 *p &= ~mask_to_clear;
0380 len -= bits_to_clear;
0381 bits_to_clear = BITS_PER_LONG;
0382 mask_to_clear = ~0UL;
0383 p++;
0384 }
0385 if (len) {
0386 mask_to_clear &= BITMAP_LAST_WORD_MASK(size);
0387 *p &= ~mask_to_clear;
0388 }
0389 }
0390 EXPORT_SYMBOL(__bitmap_clear);
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405 unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
0406 unsigned long size,
0407 unsigned long start,
0408 unsigned int nr,
0409 unsigned long align_mask,
0410 unsigned long align_offset)
0411 {
0412 unsigned long index, end, i;
0413 again:
0414 index = find_next_zero_bit(map, size, start);
0415
0416
0417 index = __ALIGN_MASK(index + align_offset, align_mask) - align_offset;
0418
0419 end = index + nr;
0420 if (end > size)
0421 return end;
0422 i = find_next_bit(map, end, index);
0423 if (i < end) {
0424 start = i + 1;
0425 goto again;
0426 }
0427 return index;
0428 }
0429 EXPORT_SYMBOL(bitmap_find_next_zero_area_off);
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445 int bitmap_parse_user(const char __user *ubuf,
0446 unsigned int ulen, unsigned long *maskp,
0447 int nmaskbits)
0448 {
0449 char *buf;
0450 int ret;
0451
0452 buf = memdup_user_nul(ubuf, ulen);
0453 if (IS_ERR(buf))
0454 return PTR_ERR(buf);
0455
0456 ret = bitmap_parse(buf, UINT_MAX, maskp, nmaskbits);
0457
0458 kfree(buf);
0459 return ret;
0460 }
0461 EXPORT_SYMBOL(bitmap_parse_user);
0462
0463
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479 int bitmap_print_to_pagebuf(bool list, char *buf, const unsigned long *maskp,
0480 int nmaskbits)
0481 {
0482 ptrdiff_t len = PAGE_SIZE - offset_in_page(buf);
0483
0484 return list ? scnprintf(buf, len, "%*pbl\n", nmaskbits, maskp) :
0485 scnprintf(buf, len, "%*pb\n", nmaskbits, maskp);
0486 }
0487 EXPORT_SYMBOL(bitmap_print_to_pagebuf);
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500 static int bitmap_print_to_buf(bool list, char *buf, const unsigned long *maskp,
0501 int nmaskbits, loff_t off, size_t count)
0502 {
0503 const char *fmt = list ? "%*pbl\n" : "%*pb\n";
0504 ssize_t size;
0505 void *data;
0506
0507 data = kasprintf(GFP_KERNEL, fmt, nmaskbits, maskp);
0508 if (!data)
0509 return -ENOMEM;
0510
0511 size = memory_read_from_buffer(buf, count, &off, data, strlen(data) + 1);
0512 kfree(data);
0513
0514 return size;
0515 }
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536
0537
0538
0539
0540
0541
0542
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
0569
0570
0571
0572
0573
0574
0575
0576
0577
0578
0579
0580
0581
0582
0583
0584
0585
0586
0587
0588
0589
0590
0591
0592
0593
0594
0595
0596
0597
0598
0599
0600
0601 int bitmap_print_bitmask_to_buf(char *buf, const unsigned long *maskp,
0602 int nmaskbits, loff_t off, size_t count)
0603 {
0604 return bitmap_print_to_buf(false, buf, maskp, nmaskbits, off, count);
0605 }
0606 EXPORT_SYMBOL(bitmap_print_bitmask_to_buf);
0607
0608
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619 int bitmap_print_list_to_buf(char *buf, const unsigned long *maskp,
0620 int nmaskbits, loff_t off, size_t count)
0621 {
0622 return bitmap_print_to_buf(true, buf, maskp, nmaskbits, off, count);
0623 }
0624 EXPORT_SYMBOL(bitmap_print_list_to_buf);
0625
0626
0627
0628
0629
0630
0631
0632
0633 struct region {
0634 unsigned int start;
0635 unsigned int off;
0636 unsigned int group_len;
0637 unsigned int end;
0638 unsigned int nbits;
0639 };
0640
0641 static void bitmap_set_region(const struct region *r, unsigned long *bitmap)
0642 {
0643 unsigned int start;
0644
0645 for (start = r->start; start <= r->end; start += r->group_len)
0646 bitmap_set(bitmap, start, min(r->end - start + 1, r->off));
0647 }
0648
0649 static int bitmap_check_region(const struct region *r)
0650 {
0651 if (r->start > r->end || r->group_len == 0 || r->off > r->group_len)
0652 return -EINVAL;
0653
0654 if (r->end >= r->nbits)
0655 return -ERANGE;
0656
0657 return 0;
0658 }
0659
0660 static const char *bitmap_getnum(const char *str, unsigned int *num,
0661 unsigned int lastbit)
0662 {
0663 unsigned long long n;
0664 unsigned int len;
0665
0666 if (str[0] == 'N') {
0667 *num = lastbit;
0668 return str + 1;
0669 }
0670
0671 len = _parse_integer(str, 10, &n);
0672 if (!len)
0673 return ERR_PTR(-EINVAL);
0674 if (len & KSTRTOX_OVERFLOW || n != (unsigned int)n)
0675 return ERR_PTR(-EOVERFLOW);
0676
0677 *num = n;
0678 return str + len;
0679 }
0680
0681 static inline bool end_of_str(char c)
0682 {
0683 return c == '\0' || c == '\n';
0684 }
0685
0686 static inline bool __end_of_region(char c)
0687 {
0688 return isspace(c) || c == ',';
0689 }
0690
0691 static inline bool end_of_region(char c)
0692 {
0693 return __end_of_region(c) || end_of_str(c);
0694 }
0695
0696
0697
0698
0699
0700 static const char *bitmap_find_region(const char *str)
0701 {
0702 while (__end_of_region(*str))
0703 str++;
0704
0705 return end_of_str(*str) ? NULL : str;
0706 }
0707
0708 static const char *bitmap_find_region_reverse(const char *start, const char *end)
0709 {
0710 while (start <= end && __end_of_region(*end))
0711 end--;
0712
0713 return end;
0714 }
0715
0716 static const char *bitmap_parse_region(const char *str, struct region *r)
0717 {
0718 unsigned int lastbit = r->nbits - 1;
0719
0720 if (!strncasecmp(str, "all", 3)) {
0721 r->start = 0;
0722 r->end = lastbit;
0723 str += 3;
0724
0725 goto check_pattern;
0726 }
0727
0728 str = bitmap_getnum(str, &r->start, lastbit);
0729 if (IS_ERR(str))
0730 return str;
0731
0732 if (end_of_region(*str))
0733 goto no_end;
0734
0735 if (*str != '-')
0736 return ERR_PTR(-EINVAL);
0737
0738 str = bitmap_getnum(str + 1, &r->end, lastbit);
0739 if (IS_ERR(str))
0740 return str;
0741
0742 check_pattern:
0743 if (end_of_region(*str))
0744 goto no_pattern;
0745
0746 if (*str != ':')
0747 return ERR_PTR(-EINVAL);
0748
0749 str = bitmap_getnum(str + 1, &r->off, lastbit);
0750 if (IS_ERR(str))
0751 return str;
0752
0753 if (*str != '/')
0754 return ERR_PTR(-EINVAL);
0755
0756 return bitmap_getnum(str + 1, &r->group_len, lastbit);
0757
0758 no_end:
0759 r->end = r->start;
0760 no_pattern:
0761 r->off = r->end + 1;
0762 r->group_len = r->end + 1;
0763
0764 return end_of_str(*str) ? NULL : str;
0765 }
0766
0767
0768
0769
0770
0771
0772
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791
0792
0793
0794
0795 int bitmap_parselist(const char *buf, unsigned long *maskp, int nmaskbits)
0796 {
0797 struct region r;
0798 long ret;
0799
0800 r.nbits = nmaskbits;
0801 bitmap_zero(maskp, r.nbits);
0802
0803 while (buf) {
0804 buf = bitmap_find_region(buf);
0805 if (buf == NULL)
0806 return 0;
0807
0808 buf = bitmap_parse_region(buf, &r);
0809 if (IS_ERR(buf))
0810 return PTR_ERR(buf);
0811
0812 ret = bitmap_check_region(&r);
0813 if (ret)
0814 return ret;
0815
0816 bitmap_set_region(&r, maskp);
0817 }
0818
0819 return 0;
0820 }
0821 EXPORT_SYMBOL(bitmap_parselist);
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836 int bitmap_parselist_user(const char __user *ubuf,
0837 unsigned int ulen, unsigned long *maskp,
0838 int nmaskbits)
0839 {
0840 char *buf;
0841 int ret;
0842
0843 buf = memdup_user_nul(ubuf, ulen);
0844 if (IS_ERR(buf))
0845 return PTR_ERR(buf);
0846
0847 ret = bitmap_parselist(buf, maskp, nmaskbits);
0848
0849 kfree(buf);
0850 return ret;
0851 }
0852 EXPORT_SYMBOL(bitmap_parselist_user);
0853
0854 static const char *bitmap_get_x32_reverse(const char *start,
0855 const char *end, u32 *num)
0856 {
0857 u32 ret = 0;
0858 int c, i;
0859
0860 for (i = 0; i < 32; i += 4) {
0861 c = hex_to_bin(*end--);
0862 if (c < 0)
0863 return ERR_PTR(-EINVAL);
0864
0865 ret |= c << i;
0866
0867 if (start > end || __end_of_region(*end))
0868 goto out;
0869 }
0870
0871 if (hex_to_bin(*end--) >= 0)
0872 return ERR_PTR(-EOVERFLOW);
0873 out:
0874 *num = ret;
0875 return end;
0876 }
0877
0878
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894 int bitmap_parse(const char *start, unsigned int buflen,
0895 unsigned long *maskp, int nmaskbits)
0896 {
0897 const char *end = strnchrnul(start, buflen, '\n') - 1;
0898 int chunks = BITS_TO_U32(nmaskbits);
0899 u32 *bitmap = (u32 *)maskp;
0900 int unset_bit;
0901 int chunk;
0902
0903 for (chunk = 0; ; chunk++) {
0904 end = bitmap_find_region_reverse(start, end);
0905 if (start > end)
0906 break;
0907
0908 if (!chunks--)
0909 return -EOVERFLOW;
0910
0911 #if defined(CONFIG_64BIT) && defined(__BIG_ENDIAN)
0912 end = bitmap_get_x32_reverse(start, end, &bitmap[chunk ^ 1]);
0913 #else
0914 end = bitmap_get_x32_reverse(start, end, &bitmap[chunk]);
0915 #endif
0916 if (IS_ERR(end))
0917 return PTR_ERR(end);
0918 }
0919
0920 unset_bit = (BITS_TO_U32(nmaskbits) - chunks) * 32;
0921 if (unset_bit < nmaskbits) {
0922 bitmap_clear(maskp, unset_bit, nmaskbits - unset_bit);
0923 return 0;
0924 }
0925
0926 if (find_next_bit(maskp, unset_bit, nmaskbits) != unset_bit)
0927 return -EOVERFLOW;
0928
0929 return 0;
0930 }
0931 EXPORT_SYMBOL(bitmap_parse);
0932
0933
0934
0935
0936
0937
0938
0939
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949
0950
0951 static int bitmap_pos_to_ord(const unsigned long *buf, unsigned int pos, unsigned int nbits)
0952 {
0953 if (pos >= nbits || !test_bit(pos, buf))
0954 return -1;
0955
0956 return __bitmap_weight(buf, pos);
0957 }
0958
0959
0960
0961
0962
0963
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977 unsigned int bitmap_ord_to_pos(const unsigned long *buf, unsigned int ord, unsigned int nbits)
0978 {
0979 unsigned int pos;
0980
0981 for (pos = find_first_bit(buf, nbits);
0982 pos < nbits && ord;
0983 pos = find_next_bit(buf, nbits, pos + 1))
0984 ord--;
0985
0986 return pos;
0987 }
0988
0989
0990
0991
0992
0993
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021 void bitmap_remap(unsigned long *dst, const unsigned long *src,
1022 const unsigned long *old, const unsigned long *new,
1023 unsigned int nbits)
1024 {
1025 unsigned int oldbit, w;
1026
1027 if (dst == src)
1028 return;
1029 bitmap_zero(dst, nbits);
1030
1031 w = bitmap_weight(new, nbits);
1032 for_each_set_bit(oldbit, src, nbits) {
1033 int n = bitmap_pos_to_ord(old, oldbit, nbits);
1034
1035 if (n < 0 || w == 0)
1036 set_bit(oldbit, dst);
1037 else
1038 set_bit(bitmap_ord_to_pos(new, n % w, nbits), dst);
1039 }
1040 }
1041 EXPORT_SYMBOL(bitmap_remap);
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069 int bitmap_bitremap(int oldbit, const unsigned long *old,
1070 const unsigned long *new, int bits)
1071 {
1072 int w = bitmap_weight(new, bits);
1073 int n = bitmap_pos_to_ord(old, oldbit, bits);
1074 if (n < 0 || w == 0)
1075 return oldbit;
1076 else
1077 return bitmap_ord_to_pos(new, n % w, bits);
1078 }
1079 EXPORT_SYMBOL(bitmap_bitremap);
1080
1081 #ifdef CONFIG_NUMA
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188 void bitmap_onto(unsigned long *dst, const unsigned long *orig,
1189 const unsigned long *relmap, unsigned int bits)
1190 {
1191 unsigned int n, m;
1192
1193 if (dst == orig)
1194 return;
1195 bitmap_zero(dst, bits);
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207 m = 0;
1208 for_each_set_bit(n, relmap, bits) {
1209
1210 if (test_bit(m, orig))
1211 set_bit(n, dst);
1212 m++;
1213 }
1214 }
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227 void bitmap_fold(unsigned long *dst, const unsigned long *orig,
1228 unsigned int sz, unsigned int nbits)
1229 {
1230 unsigned int oldbit;
1231
1232 if (dst == orig)
1233 return;
1234 bitmap_zero(dst, nbits);
1235
1236 for_each_set_bit(oldbit, orig, nbits)
1237 set_bit(oldbit % sz, dst);
1238 }
1239 #endif
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259 enum {
1260 REG_OP_ISFREE,
1261 REG_OP_ALLOC,
1262 REG_OP_RELEASE,
1263 };
1264
1265 static int __reg_op(unsigned long *bitmap, unsigned int pos, int order, int reg_op)
1266 {
1267 int nbits_reg;
1268 int index;
1269 int offset;
1270 int nlongs_reg;
1271 int nbitsinlong;
1272 unsigned long mask;
1273 int i;
1274 int ret = 0;
1275
1276
1277
1278
1279
1280 nbits_reg = 1 << order;
1281 index = pos / BITS_PER_LONG;
1282 offset = pos - (index * BITS_PER_LONG);
1283 nlongs_reg = BITS_TO_LONGS(nbits_reg);
1284 nbitsinlong = min(nbits_reg, BITS_PER_LONG);
1285
1286
1287
1288
1289
1290 mask = (1UL << (nbitsinlong - 1));
1291 mask += mask - 1;
1292 mask <<= offset;
1293
1294 switch (reg_op) {
1295 case REG_OP_ISFREE:
1296 for (i = 0; i < nlongs_reg; i++) {
1297 if (bitmap[index + i] & mask)
1298 goto done;
1299 }
1300 ret = 1;
1301 break;
1302
1303 case REG_OP_ALLOC:
1304 for (i = 0; i < nlongs_reg; i++)
1305 bitmap[index + i] |= mask;
1306 break;
1307
1308 case REG_OP_RELEASE:
1309 for (i = 0; i < nlongs_reg; i++)
1310 bitmap[index + i] &= ~mask;
1311 break;
1312 }
1313 done:
1314 return ret;
1315 }
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331 int bitmap_find_free_region(unsigned long *bitmap, unsigned int bits, int order)
1332 {
1333 unsigned int pos, end;
1334
1335 for (pos = 0 ; (end = pos + (1U << order)) <= bits; pos = end) {
1336 if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE))
1337 continue;
1338 __reg_op(bitmap, pos, order, REG_OP_ALLOC);
1339 return pos;
1340 }
1341 return -ENOMEM;
1342 }
1343 EXPORT_SYMBOL(bitmap_find_free_region);
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356 void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int order)
1357 {
1358 __reg_op(bitmap, pos, order, REG_OP_RELEASE);
1359 }
1360 EXPORT_SYMBOL(bitmap_release_region);
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373 int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order)
1374 {
1375 if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE))
1376 return -EBUSY;
1377 return __reg_op(bitmap, pos, order, REG_OP_ALLOC);
1378 }
1379 EXPORT_SYMBOL(bitmap_allocate_region);
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389 #ifdef __BIG_ENDIAN
1390 void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int nbits)
1391 {
1392 unsigned int i;
1393
1394 for (i = 0; i < nbits/BITS_PER_LONG; i++) {
1395 if (BITS_PER_LONG == 64)
1396 dst[i] = cpu_to_le64(src[i]);
1397 else
1398 dst[i] = cpu_to_le32(src[i]);
1399 }
1400 }
1401 EXPORT_SYMBOL(bitmap_copy_le);
1402 #endif
1403
1404 unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags)
1405 {
1406 return kmalloc_array(BITS_TO_LONGS(nbits), sizeof(unsigned long),
1407 flags);
1408 }
1409 EXPORT_SYMBOL(bitmap_alloc);
1410
1411 unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags)
1412 {
1413 return bitmap_alloc(nbits, flags | __GFP_ZERO);
1414 }
1415 EXPORT_SYMBOL(bitmap_zalloc);
1416
1417 unsigned long *bitmap_alloc_node(unsigned int nbits, gfp_t flags, int node)
1418 {
1419 return kmalloc_array_node(BITS_TO_LONGS(nbits), sizeof(unsigned long),
1420 flags, node);
1421 }
1422 EXPORT_SYMBOL(bitmap_alloc_node);
1423
1424 unsigned long *bitmap_zalloc_node(unsigned int nbits, gfp_t flags, int node)
1425 {
1426 return bitmap_alloc_node(nbits, flags | __GFP_ZERO, node);
1427 }
1428 EXPORT_SYMBOL(bitmap_zalloc_node);
1429
1430 void bitmap_free(const unsigned long *bitmap)
1431 {
1432 kfree(bitmap);
1433 }
1434 EXPORT_SYMBOL(bitmap_free);
1435
1436 static void devm_bitmap_free(void *data)
1437 {
1438 unsigned long *bitmap = data;
1439
1440 bitmap_free(bitmap);
1441 }
1442
1443 unsigned long *devm_bitmap_alloc(struct device *dev,
1444 unsigned int nbits, gfp_t flags)
1445 {
1446 unsigned long *bitmap;
1447 int ret;
1448
1449 bitmap = bitmap_alloc(nbits, flags);
1450 if (!bitmap)
1451 return NULL;
1452
1453 ret = devm_add_action_or_reset(dev, devm_bitmap_free, bitmap);
1454 if (ret)
1455 return NULL;
1456
1457 return bitmap;
1458 }
1459 EXPORT_SYMBOL_GPL(devm_bitmap_alloc);
1460
1461 unsigned long *devm_bitmap_zalloc(struct device *dev,
1462 unsigned int nbits, gfp_t flags)
1463 {
1464 return devm_bitmap_alloc(dev, nbits, flags | __GFP_ZERO);
1465 }
1466 EXPORT_SYMBOL_GPL(devm_bitmap_zalloc);
1467
1468 #if BITS_PER_LONG == 64
1469
1470
1471
1472
1473
1474
1475 void bitmap_from_arr32(unsigned long *bitmap, const u32 *buf, unsigned int nbits)
1476 {
1477 unsigned int i, halfwords;
1478
1479 halfwords = DIV_ROUND_UP(nbits, 32);
1480 for (i = 0; i < halfwords; i++) {
1481 bitmap[i/2] = (unsigned long) buf[i];
1482 if (++i < halfwords)
1483 bitmap[i/2] |= ((unsigned long) buf[i]) << 32;
1484 }
1485
1486
1487 if (nbits % BITS_PER_LONG)
1488 bitmap[(halfwords - 1) / 2] &= BITMAP_LAST_WORD_MASK(nbits);
1489 }
1490 EXPORT_SYMBOL(bitmap_from_arr32);
1491
1492
1493
1494
1495
1496
1497
1498 void bitmap_to_arr32(u32 *buf, const unsigned long *bitmap, unsigned int nbits)
1499 {
1500 unsigned int i, halfwords;
1501
1502 halfwords = DIV_ROUND_UP(nbits, 32);
1503 for (i = 0; i < halfwords; i++) {
1504 buf[i] = (u32) (bitmap[i/2] & UINT_MAX);
1505 if (++i < halfwords)
1506 buf[i] = (u32) (bitmap[i/2] >> 32);
1507 }
1508
1509
1510 if (nbits % BITS_PER_LONG)
1511 buf[halfwords - 1] &= (u32) (UINT_MAX >> ((-nbits) & 31));
1512 }
1513 EXPORT_SYMBOL(bitmap_to_arr32);
1514 #endif
1515
1516 #if (BITS_PER_LONG == 32) && defined(__BIG_ENDIAN)
1517
1518
1519
1520
1521
1522
1523 void bitmap_from_arr64(unsigned long *bitmap, const u64 *buf, unsigned int nbits)
1524 {
1525 int n;
1526
1527 for (n = nbits; n > 0; n -= 64) {
1528 u64 val = *buf++;
1529
1530 *bitmap++ = val;
1531 if (n > 32)
1532 *bitmap++ = val >> 32;
1533 }
1534
1535
1536
1537
1538
1539
1540
1541
1542 if (nbits % BITS_PER_LONG)
1543 bitmap[-1] &= BITMAP_LAST_WORD_MASK(nbits);
1544 }
1545 EXPORT_SYMBOL(bitmap_from_arr64);
1546
1547
1548
1549
1550
1551
1552
1553 void bitmap_to_arr64(u64 *buf, const unsigned long *bitmap, unsigned int nbits)
1554 {
1555 const unsigned long *end = bitmap + BITS_TO_LONGS(nbits);
1556
1557 while (bitmap < end) {
1558 *buf = *bitmap++;
1559 if (bitmap < end)
1560 *buf |= (u64)(*bitmap++) << 32;
1561 buf++;
1562 }
1563
1564
1565 if (nbits % 64)
1566 buf[-1] &= GENMASK_ULL((nbits - 1) % 64, 0);
1567 }
1568 EXPORT_SYMBOL(bitmap_to_arr64);
1569 #endif