Merge branch 'ib/4.17-bitmap' into next
[linux-2.6-microblaze.git] / lib / bitmap.c
1 /*
2  * lib/bitmap.c
3  * Helper functions for bitmap.h.
4  *
5  * This source code is licensed under the GNU General Public License,
6  * Version 2.  See the file COPYING for more details.
7  */
8 #include <linux/export.h>
9 #include <linux/thread_info.h>
10 #include <linux/ctype.h>
11 #include <linux/errno.h>
12 #include <linux/bitmap.h>
13 #include <linux/bitops.h>
14 #include <linux/bug.h>
15 #include <linux/kernel.h>
16 #include <linux/slab.h>
17 #include <linux/string.h>
18 #include <linux/uaccess.h>
19
20 #include <asm/page.h>
21
22 /**
23  * DOC: bitmap introduction
24  *
25  * bitmaps provide an array of bits, implemented using an an
26  * array of unsigned longs.  The number of valid bits in a
27  * given bitmap does _not_ need to be an exact multiple of
28  * BITS_PER_LONG.
29  *
30  * The possible unused bits in the last, partially used word
31  * of a bitmap are 'don't care'.  The implementation makes
32  * no particular effort to keep them zero.  It ensures that
33  * their value will not affect the results of any operation.
34  * The bitmap operations that return Boolean (bitmap_empty,
35  * for example) or scalar (bitmap_weight, for example) results
36  * carefully filter out these unused bits from impacting their
37  * results.
38  *
39  * These operations actually hold to a slightly stronger rule:
40  * if you don't input any bitmaps to these ops that have some
41  * unused bits set, then they won't output any set unused bits
42  * in output bitmaps.
43  *
44  * The byte ordering of bitmaps is more natural on little
45  * endian architectures.  See the big-endian headers
46  * include/asm-ppc64/bitops.h and include/asm-s390/bitops.h
47  * for the best explanations of this ordering.
48  */
49
50 int __bitmap_equal(const unsigned long *bitmap1,
51                 const unsigned long *bitmap2, unsigned int bits)
52 {
53         unsigned int k, lim = bits/BITS_PER_LONG;
54         for (k = 0; k < lim; ++k)
55                 if (bitmap1[k] != bitmap2[k])
56                         return 0;
57
58         if (bits % BITS_PER_LONG)
59                 if ((bitmap1[k] ^ bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits))
60                         return 0;
61
62         return 1;
63 }
64 EXPORT_SYMBOL(__bitmap_equal);
65
66 void __bitmap_complement(unsigned long *dst, const unsigned long *src, unsigned int bits)
67 {
68         unsigned int k, lim = bits/BITS_PER_LONG;
69         for (k = 0; k < lim; ++k)
70                 dst[k] = ~src[k];
71
72         if (bits % BITS_PER_LONG)
73                 dst[k] = ~src[k];
74 }
75 EXPORT_SYMBOL(__bitmap_complement);
76
77 /**
78  * __bitmap_shift_right - logical right shift of the bits in a bitmap
79  *   @dst : destination bitmap
80  *   @src : source bitmap
81  *   @shift : shift by this many bits
82  *   @nbits : bitmap size, in bits
83  *
84  * Shifting right (dividing) means moving bits in the MS -> LS bit
85  * direction.  Zeros are fed into the vacated MS positions and the
86  * LS bits shifted off the bottom are lost.
87  */
88 void __bitmap_shift_right(unsigned long *dst, const unsigned long *src,
89                         unsigned shift, unsigned nbits)
90 {
91         unsigned k, lim = BITS_TO_LONGS(nbits);
92         unsigned off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG;
93         unsigned long mask = BITMAP_LAST_WORD_MASK(nbits);
94         for (k = 0; off + k < lim; ++k) {
95                 unsigned long upper, lower;
96
97                 /*
98                  * If shift is not word aligned, take lower rem bits of
99                  * word above and make them the top rem bits of result.
100                  */
101                 if (!rem || off + k + 1 >= lim)
102                         upper = 0;
103                 else {
104                         upper = src[off + k + 1];
105                         if (off + k + 1 == lim - 1)
106                                 upper &= mask;
107                         upper <<= (BITS_PER_LONG - rem);
108                 }
109                 lower = src[off + k];
110                 if (off + k == lim - 1)
111                         lower &= mask;
112                 lower >>= rem;
113                 dst[k] = lower | upper;
114         }
115         if (off)
116                 memset(&dst[lim - off], 0, off*sizeof(unsigned long));
117 }
118 EXPORT_SYMBOL(__bitmap_shift_right);
119
120
121 /**
122  * __bitmap_shift_left - logical left shift of the bits in a bitmap
123  *   @dst : destination bitmap
124  *   @src : source bitmap
125  *   @shift : shift by this many bits
126  *   @nbits : bitmap size, in bits
127  *
128  * Shifting left (multiplying) means moving bits in the LS -> MS
129  * direction.  Zeros are fed into the vacated LS bit positions
130  * and those MS bits shifted off the top are lost.
131  */
132
133 void __bitmap_shift_left(unsigned long *dst, const unsigned long *src,
134                         unsigned int shift, unsigned int nbits)
135 {
136         int k;
137         unsigned int lim = BITS_TO_LONGS(nbits);
138         unsigned int off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG;
139         for (k = lim - off - 1; k >= 0; --k) {
140                 unsigned long upper, lower;
141
142                 /*
143                  * If shift is not word aligned, take upper rem bits of
144                  * word below and make them the bottom rem bits of result.
145                  */
146                 if (rem && k > 0)
147                         lower = src[k - 1] >> (BITS_PER_LONG - rem);
148                 else
149                         lower = 0;
150                 upper = src[k] << rem;
151                 dst[k + off] = lower | upper;
152         }
153         if (off)
154                 memset(dst, 0, off*sizeof(unsigned long));
155 }
156 EXPORT_SYMBOL(__bitmap_shift_left);
157
158 int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
159                                 const unsigned long *bitmap2, unsigned int bits)
160 {
161         unsigned int k;
162         unsigned int lim = bits/BITS_PER_LONG;
163         unsigned long result = 0;
164
165         for (k = 0; k < lim; k++)
166                 result |= (dst[k] = bitmap1[k] & bitmap2[k]);
167         if (bits % BITS_PER_LONG)
168                 result |= (dst[k] = bitmap1[k] & bitmap2[k] &
169                            BITMAP_LAST_WORD_MASK(bits));
170         return result != 0;
171 }
172 EXPORT_SYMBOL(__bitmap_and);
173
174 void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
175                                 const unsigned long *bitmap2, unsigned int bits)
176 {
177         unsigned int k;
178         unsigned int nr = BITS_TO_LONGS(bits);
179
180         for (k = 0; k < nr; k++)
181                 dst[k] = bitmap1[k] | bitmap2[k];
182 }
183 EXPORT_SYMBOL(__bitmap_or);
184
185 void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
186                                 const unsigned long *bitmap2, unsigned int bits)
187 {
188         unsigned int k;
189         unsigned int nr = BITS_TO_LONGS(bits);
190
191         for (k = 0; k < nr; k++)
192                 dst[k] = bitmap1[k] ^ bitmap2[k];
193 }
194 EXPORT_SYMBOL(__bitmap_xor);
195
196 int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
197                                 const unsigned long *bitmap2, unsigned int bits)
198 {
199         unsigned int k;
200         unsigned int lim = bits/BITS_PER_LONG;
201         unsigned long result = 0;
202
203         for (k = 0; k < lim; k++)
204                 result |= (dst[k] = bitmap1[k] & ~bitmap2[k]);
205         if (bits % BITS_PER_LONG)
206                 result |= (dst[k] = bitmap1[k] & ~bitmap2[k] &
207                            BITMAP_LAST_WORD_MASK(bits));
208         return result != 0;
209 }
210 EXPORT_SYMBOL(__bitmap_andnot);
211
212 int __bitmap_intersects(const unsigned long *bitmap1,
213                         const unsigned long *bitmap2, unsigned int bits)
214 {
215         unsigned int k, lim = bits/BITS_PER_LONG;
216         for (k = 0; k < lim; ++k)
217                 if (bitmap1[k] & bitmap2[k])
218                         return 1;
219
220         if (bits % BITS_PER_LONG)
221                 if ((bitmap1[k] & bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits))
222                         return 1;
223         return 0;
224 }
225 EXPORT_SYMBOL(__bitmap_intersects);
226
227 int __bitmap_subset(const unsigned long *bitmap1,
228                     const unsigned long *bitmap2, unsigned int bits)
229 {
230         unsigned int k, lim = bits/BITS_PER_LONG;
231         for (k = 0; k < lim; ++k)
232                 if (bitmap1[k] & ~bitmap2[k])
233                         return 0;
234
235         if (bits % BITS_PER_LONG)
236                 if ((bitmap1[k] & ~bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits))
237                         return 0;
238         return 1;
239 }
240 EXPORT_SYMBOL(__bitmap_subset);
241
242 int __bitmap_weight(const unsigned long *bitmap, unsigned int bits)
243 {
244         unsigned int k, lim = bits/BITS_PER_LONG;
245         int w = 0;
246
247         for (k = 0; k < lim; k++)
248                 w += hweight_long(bitmap[k]);
249
250         if (bits % BITS_PER_LONG)
251                 w += hweight_long(bitmap[k] & BITMAP_LAST_WORD_MASK(bits));
252
253         return w;
254 }
255 EXPORT_SYMBOL(__bitmap_weight);
256
257 void __bitmap_set(unsigned long *map, unsigned int start, int len)
258 {
259         unsigned long *p = map + BIT_WORD(start);
260         const unsigned int size = start + len;
261         int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG);
262         unsigned long mask_to_set = BITMAP_FIRST_WORD_MASK(start);
263
264         while (len - bits_to_set >= 0) {
265                 *p |= mask_to_set;
266                 len -= bits_to_set;
267                 bits_to_set = BITS_PER_LONG;
268                 mask_to_set = ~0UL;
269                 p++;
270         }
271         if (len) {
272                 mask_to_set &= BITMAP_LAST_WORD_MASK(size);
273                 *p |= mask_to_set;
274         }
275 }
276 EXPORT_SYMBOL(__bitmap_set);
277
278 void __bitmap_clear(unsigned long *map, unsigned int start, int len)
279 {
280         unsigned long *p = map + BIT_WORD(start);
281         const unsigned int size = start + len;
282         int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG);
283         unsigned long mask_to_clear = BITMAP_FIRST_WORD_MASK(start);
284
285         while (len - bits_to_clear >= 0) {
286                 *p &= ~mask_to_clear;
287                 len -= bits_to_clear;
288                 bits_to_clear = BITS_PER_LONG;
289                 mask_to_clear = ~0UL;
290                 p++;
291         }
292         if (len) {
293                 mask_to_clear &= BITMAP_LAST_WORD_MASK(size);
294                 *p &= ~mask_to_clear;
295         }
296 }
297 EXPORT_SYMBOL(__bitmap_clear);
298
299 /**
300  * bitmap_find_next_zero_area_off - find a contiguous aligned zero area
301  * @map: The address to base the search on
302  * @size: The bitmap size in bits
303  * @start: The bitnumber to start searching at
304  * @nr: The number of zeroed bits we're looking for
305  * @align_mask: Alignment mask for zero area
306  * @align_offset: Alignment offset for zero area.
307  *
308  * The @align_mask should be one less than a power of 2; the effect is that
309  * the bit offset of all zero areas this function finds plus @align_offset
310  * is multiple of that power of 2.
311  */
312 unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
313                                              unsigned long size,
314                                              unsigned long start,
315                                              unsigned int nr,
316                                              unsigned long align_mask,
317                                              unsigned long align_offset)
318 {
319         unsigned long index, end, i;
320 again:
321         index = find_next_zero_bit(map, size, start);
322
323         /* Align allocation */
324         index = __ALIGN_MASK(index + align_offset, align_mask) - align_offset;
325
326         end = index + nr;
327         if (end > size)
328                 return end;
329         i = find_next_bit(map, end, index);
330         if (i < end) {
331                 start = i + 1;
332                 goto again;
333         }
334         return index;
335 }
336 EXPORT_SYMBOL(bitmap_find_next_zero_area_off);
337
338 /*
339  * Bitmap printing & parsing functions: first version by Nadia Yvette Chambers,
340  * second version by Paul Jackson, third by Joe Korty.
341  */
342
343 #define CHUNKSZ                         32
344 #define nbits_to_hold_value(val)        fls(val)
345 #define BASEDEC 10              /* fancier cpuset lists input in decimal */
346
347 /**
348  * __bitmap_parse - convert an ASCII hex string into a bitmap.
349  * @buf: pointer to buffer containing string.
350  * @buflen: buffer size in bytes.  If string is smaller than this
351  *    then it must be terminated with a \0.
352  * @is_user: location of buffer, 0 indicates kernel space
353  * @maskp: pointer to bitmap array that will contain result.
354  * @nmaskbits: size of bitmap, in bits.
355  *
356  * Commas group hex digits into chunks.  Each chunk defines exactly 32
357  * bits of the resultant bitmask.  No chunk may specify a value larger
358  * than 32 bits (%-EOVERFLOW), and if a chunk specifies a smaller value
359  * then leading 0-bits are prepended.  %-EINVAL is returned for illegal
360  * characters and for grouping errors such as "1,,5", ",44", "," and "".
361  * Leading and trailing whitespace accepted, but not embedded whitespace.
362  */
363 int __bitmap_parse(const char *buf, unsigned int buflen,
364                 int is_user, unsigned long *maskp,
365                 int nmaskbits)
366 {
367         int c, old_c, totaldigits, ndigits, nchunks, nbits;
368         u32 chunk;
369         const char __user __force *ubuf = (const char __user __force *)buf;
370
371         bitmap_zero(maskp, nmaskbits);
372
373         nchunks = nbits = totaldigits = c = 0;
374         do {
375                 chunk = 0;
376                 ndigits = totaldigits;
377
378                 /* Get the next chunk of the bitmap */
379                 while (buflen) {
380                         old_c = c;
381                         if (is_user) {
382                                 if (__get_user(c, ubuf++))
383                                         return -EFAULT;
384                         }
385                         else
386                                 c = *buf++;
387                         buflen--;
388                         if (isspace(c))
389                                 continue;
390
391                         /*
392                          * If the last character was a space and the current
393                          * character isn't '\0', we've got embedded whitespace.
394                          * This is a no-no, so throw an error.
395                          */
396                         if (totaldigits && c && isspace(old_c))
397                                 return -EINVAL;
398
399                         /* A '\0' or a ',' signal the end of the chunk */
400                         if (c == '\0' || c == ',')
401                                 break;
402
403                         if (!isxdigit(c))
404                                 return -EINVAL;
405
406                         /*
407                          * Make sure there are at least 4 free bits in 'chunk'.
408                          * If not, this hexdigit will overflow 'chunk', so
409                          * throw an error.
410                          */
411                         if (chunk & ~((1UL << (CHUNKSZ - 4)) - 1))
412                                 return -EOVERFLOW;
413
414                         chunk = (chunk << 4) | hex_to_bin(c);
415                         totaldigits++;
416                 }
417                 if (ndigits == totaldigits)
418                         return -EINVAL;
419                 if (nchunks == 0 && chunk == 0)
420                         continue;
421
422                 __bitmap_shift_left(maskp, maskp, CHUNKSZ, nmaskbits);
423                 *maskp |= chunk;
424                 nchunks++;
425                 nbits += (nchunks == 1) ? nbits_to_hold_value(chunk) : CHUNKSZ;
426                 if (nbits > nmaskbits)
427                         return -EOVERFLOW;
428         } while (buflen && c == ',');
429
430         return 0;
431 }
432 EXPORT_SYMBOL(__bitmap_parse);
433
434 /**
435  * bitmap_parse_user - convert an ASCII hex string in a user buffer into a bitmap
436  *
437  * @ubuf: pointer to user buffer containing string.
438  * @ulen: buffer size in bytes.  If string is smaller than this
439  *    then it must be terminated with a \0.
440  * @maskp: pointer to bitmap array that will contain result.
441  * @nmaskbits: size of bitmap, in bits.
442  *
443  * Wrapper for __bitmap_parse(), providing it with user buffer.
444  *
445  * We cannot have this as an inline function in bitmap.h because it needs
446  * linux/uaccess.h to get the access_ok() declaration and this causes
447  * cyclic dependencies.
448  */
449 int bitmap_parse_user(const char __user *ubuf,
450                         unsigned int ulen, unsigned long *maskp,
451                         int nmaskbits)
452 {
453         if (!access_ok(VERIFY_READ, ubuf, ulen))
454                 return -EFAULT;
455         return __bitmap_parse((const char __force *)ubuf,
456                                 ulen, 1, maskp, nmaskbits);
457
458 }
459 EXPORT_SYMBOL(bitmap_parse_user);
460
461 /**
462  * bitmap_print_to_pagebuf - convert bitmap to list or hex format ASCII string
463  * @list: indicates whether the bitmap must be list
464  * @buf: page aligned buffer into which string is placed
465  * @maskp: pointer to bitmap to convert
466  * @nmaskbits: size of bitmap, in bits
467  *
468  * Output format is a comma-separated list of decimal numbers and
469  * ranges if list is specified or hex digits grouped into comma-separated
470  * sets of 8 digits/set. Returns the number of characters written to buf.
471  *
472  * It is assumed that @buf is a pointer into a PAGE_SIZE area and that
473  * sufficient storage remains at @buf to accommodate the
474  * bitmap_print_to_pagebuf() output.
475  */
476 int bitmap_print_to_pagebuf(bool list, char *buf, const unsigned long *maskp,
477                             int nmaskbits)
478 {
479         ptrdiff_t len = PTR_ALIGN(buf + PAGE_SIZE - 1, PAGE_SIZE) - buf;
480         int n = 0;
481
482         if (len > 1)
483                 n = list ? scnprintf(buf, len, "%*pbl\n", nmaskbits, maskp) :
484                            scnprintf(buf, len, "%*pb\n", nmaskbits, maskp);
485         return n;
486 }
487 EXPORT_SYMBOL(bitmap_print_to_pagebuf);
488
489 /**
490  * __bitmap_parselist - convert list format ASCII string to bitmap
491  * @buf: read nul-terminated user string from this buffer
492  * @buflen: buffer size in bytes.  If string is smaller than this
493  *    then it must be terminated with a \0.
494  * @is_user: location of buffer, 0 indicates kernel space
495  * @maskp: write resulting mask here
496  * @nmaskbits: number of bits in mask to be written
497  *
498  * Input format is a comma-separated list of decimal numbers and
499  * ranges.  Consecutively set bits are shown as two hyphen-separated
500  * decimal numbers, the smallest and largest bit numbers set in
501  * the range.
502  * Optionally each range can be postfixed to denote that only parts of it
503  * should be set. The range will divided to groups of specific size.
504  * From each group will be used only defined amount of bits.
505  * Syntax: range:used_size/group_size
506  * Example: 0-1023:2/256 ==> 0,1,256,257,512,513,768,769
507  *
508  * Returns: 0 on success, -errno on invalid input strings. Error values:
509  *
510  *   - ``-EINVAL``: second number in range smaller than first
511  *   - ``-EINVAL``: invalid character in string
512  *   - ``-ERANGE``: bit number specified too large for mask
513  */
514 static int __bitmap_parselist(const char *buf, unsigned int buflen,
515                 int is_user, unsigned long *maskp,
516                 int nmaskbits)
517 {
518         unsigned int a, b, old_a, old_b;
519         unsigned int group_size, used_size, off;
520         int c, old_c, totaldigits, ndigits;
521         const char __user __force *ubuf = (const char __user __force *)buf;
522         int at_start, in_range, in_partial_range;
523
524         totaldigits = c = 0;
525         old_a = old_b = 0;
526         group_size = used_size = 0;
527         bitmap_zero(maskp, nmaskbits);
528         do {
529                 at_start = 1;
530                 in_range = 0;
531                 in_partial_range = 0;
532                 a = b = 0;
533                 ndigits = totaldigits;
534
535                 /* Get the next cpu# or a range of cpu#'s */
536                 while (buflen) {
537                         old_c = c;
538                         if (is_user) {
539                                 if (__get_user(c, ubuf++))
540                                         return -EFAULT;
541                         } else
542                                 c = *buf++;
543                         buflen--;
544                         if (isspace(c))
545                                 continue;
546
547                         /* A '\0' or a ',' signal the end of a cpu# or range */
548                         if (c == '\0' || c == ',')
549                                 break;
550                         /*
551                         * whitespaces between digits are not allowed,
552                         * but it's ok if whitespaces are on head or tail.
553                         * when old_c is whilespace,
554                         * if totaldigits == ndigits, whitespace is on head.
555                         * if whitespace is on tail, it should not run here.
556                         * as c was ',' or '\0',
557                         * the last code line has broken the current loop.
558                         */
559                         if ((totaldigits != ndigits) && isspace(old_c))
560                                 return -EINVAL;
561
562                         if (c == '/') {
563                                 used_size = a;
564                                 at_start = 1;
565                                 in_range = 0;
566                                 a = b = 0;
567                                 continue;
568                         }
569
570                         if (c == ':') {
571                                 old_a = a;
572                                 old_b = b;
573                                 at_start = 1;
574                                 in_range = 0;
575                                 in_partial_range = 1;
576                                 a = b = 0;
577                                 continue;
578                         }
579
580                         if (c == '-') {
581                                 if (at_start || in_range)
582                                         return -EINVAL;
583                                 b = 0;
584                                 in_range = 1;
585                                 at_start = 1;
586                                 continue;
587                         }
588
589                         if (!isdigit(c))
590                                 return -EINVAL;
591
592                         b = b * 10 + (c - '0');
593                         if (!in_range)
594                                 a = b;
595                         at_start = 0;
596                         totaldigits++;
597                 }
598                 if (ndigits == totaldigits)
599                         continue;
600                 if (in_partial_range) {
601                         group_size = a;
602                         a = old_a;
603                         b = old_b;
604                         old_a = old_b = 0;
605                 } else {
606                         used_size = group_size = b - a + 1;
607                 }
608                 /* if no digit is after '-', it's wrong*/
609                 if (at_start && in_range)
610                         return -EINVAL;
611                 if (!(a <= b) || group_size == 0 || !(used_size <= group_size))
612                         return -EINVAL;
613                 if (b >= nmaskbits)
614                         return -ERANGE;
615                 while (a <= b) {
616                         off = min(b - a + 1, used_size);
617                         bitmap_set(maskp, a, off);
618                         a += group_size;
619                 }
620         } while (buflen && c == ',');
621         return 0;
622 }
623
624 int bitmap_parselist(const char *bp, unsigned long *maskp, int nmaskbits)
625 {
626         char *nl  = strchrnul(bp, '\n');
627         int len = nl - bp;
628
629         return __bitmap_parselist(bp, len, 0, maskp, nmaskbits);
630 }
631 EXPORT_SYMBOL(bitmap_parselist);
632
633
634 /**
635  * bitmap_parselist_user()
636  *
637  * @ubuf: pointer to user buffer containing string.
638  * @ulen: buffer size in bytes.  If string is smaller than this
639  *    then it must be terminated with a \0.
640  * @maskp: pointer to bitmap array that will contain result.
641  * @nmaskbits: size of bitmap, in bits.
642  *
643  * Wrapper for bitmap_parselist(), providing it with user buffer.
644  *
645  * We cannot have this as an inline function in bitmap.h because it needs
646  * linux/uaccess.h to get the access_ok() declaration and this causes
647  * cyclic dependencies.
648  */
649 int bitmap_parselist_user(const char __user *ubuf,
650                         unsigned int ulen, unsigned long *maskp,
651                         int nmaskbits)
652 {
653         if (!access_ok(VERIFY_READ, ubuf, ulen))
654                 return -EFAULT;
655         return __bitmap_parselist((const char __force *)ubuf,
656                                         ulen, 1, maskp, nmaskbits);
657 }
658 EXPORT_SYMBOL(bitmap_parselist_user);
659
660
661 /**
662  * bitmap_pos_to_ord - find ordinal of set bit at given position in bitmap
663  *      @buf: pointer to a bitmap
664  *      @pos: a bit position in @buf (0 <= @pos < @nbits)
665  *      @nbits: number of valid bit positions in @buf
666  *
667  * Map the bit at position @pos in @buf (of length @nbits) to the
668  * ordinal of which set bit it is.  If it is not set or if @pos
669  * is not a valid bit position, map to -1.
670  *
671  * If for example, just bits 4 through 7 are set in @buf, then @pos
672  * values 4 through 7 will get mapped to 0 through 3, respectively,
673  * and other @pos values will get mapped to -1.  When @pos value 7
674  * gets mapped to (returns) @ord value 3 in this example, that means
675  * that bit 7 is the 3rd (starting with 0th) set bit in @buf.
676  *
677  * The bit positions 0 through @bits are valid positions in @buf.
678  */
679 static int bitmap_pos_to_ord(const unsigned long *buf, unsigned int pos, unsigned int nbits)
680 {
681         if (pos >= nbits || !test_bit(pos, buf))
682                 return -1;
683
684         return __bitmap_weight(buf, pos);
685 }
686
687 /**
688  * bitmap_ord_to_pos - find position of n-th set bit in bitmap
689  *      @buf: pointer to bitmap
690  *      @ord: ordinal bit position (n-th set bit, n >= 0)
691  *      @nbits: number of valid bit positions in @buf
692  *
693  * Map the ordinal offset of bit @ord in @buf to its position in @buf.
694  * Value of @ord should be in range 0 <= @ord < weight(buf). If @ord
695  * >= weight(buf), returns @nbits.
696  *
697  * If for example, just bits 4 through 7 are set in @buf, then @ord
698  * values 0 through 3 will get mapped to 4 through 7, respectively,
699  * and all other @ord values returns @nbits.  When @ord value 3
700  * gets mapped to (returns) @pos value 7 in this example, that means
701  * that the 3rd set bit (starting with 0th) is at position 7 in @buf.
702  *
703  * The bit positions 0 through @nbits-1 are valid positions in @buf.
704  */
705 unsigned int bitmap_ord_to_pos(const unsigned long *buf, unsigned int ord, unsigned int nbits)
706 {
707         unsigned int pos;
708
709         for (pos = find_first_bit(buf, nbits);
710              pos < nbits && ord;
711              pos = find_next_bit(buf, nbits, pos + 1))
712                 ord--;
713
714         return pos;
715 }
716
717 /**
718  * bitmap_remap - Apply map defined by a pair of bitmaps to another bitmap
719  *      @dst: remapped result
720  *      @src: subset to be remapped
721  *      @old: defines domain of map
722  *      @new: defines range of map
723  *      @nbits: number of bits in each of these bitmaps
724  *
725  * Let @old and @new define a mapping of bit positions, such that
726  * whatever position is held by the n-th set bit in @old is mapped
727  * to the n-th set bit in @new.  In the more general case, allowing
728  * for the possibility that the weight 'w' of @new is less than the
729  * weight of @old, map the position of the n-th set bit in @old to
730  * the position of the m-th set bit in @new, where m == n % w.
731  *
732  * If either of the @old and @new bitmaps are empty, or if @src and
733  * @dst point to the same location, then this routine copies @src
734  * to @dst.
735  *
736  * The positions of unset bits in @old are mapped to themselves
737  * (the identify map).
738  *
739  * Apply the above specified mapping to @src, placing the result in
740  * @dst, clearing any bits previously set in @dst.
741  *
742  * For example, lets say that @old has bits 4 through 7 set, and
743  * @new has bits 12 through 15 set.  This defines the mapping of bit
744  * position 4 to 12, 5 to 13, 6 to 14 and 7 to 15, and of all other
745  * bit positions unchanged.  So if say @src comes into this routine
746  * with bits 1, 5 and 7 set, then @dst should leave with bits 1,
747  * 13 and 15 set.
748  */
749 void bitmap_remap(unsigned long *dst, const unsigned long *src,
750                 const unsigned long *old, const unsigned long *new,
751                 unsigned int nbits)
752 {
753         unsigned int oldbit, w;
754
755         if (dst == src)         /* following doesn't handle inplace remaps */
756                 return;
757         bitmap_zero(dst, nbits);
758
759         w = bitmap_weight(new, nbits);
760         for_each_set_bit(oldbit, src, nbits) {
761                 int n = bitmap_pos_to_ord(old, oldbit, nbits);
762
763                 if (n < 0 || w == 0)
764                         set_bit(oldbit, dst);   /* identity map */
765                 else
766                         set_bit(bitmap_ord_to_pos(new, n % w, nbits), dst);
767         }
768 }
769 EXPORT_SYMBOL(bitmap_remap);
770
771 /**
772  * bitmap_bitremap - Apply map defined by a pair of bitmaps to a single bit
773  *      @oldbit: bit position to be mapped
774  *      @old: defines domain of map
775  *      @new: defines range of map
776  *      @bits: number of bits in each of these bitmaps
777  *
778  * Let @old and @new define a mapping of bit positions, such that
779  * whatever position is held by the n-th set bit in @old is mapped
780  * to the n-th set bit in @new.  In the more general case, allowing
781  * for the possibility that the weight 'w' of @new is less than the
782  * weight of @old, map the position of the n-th set bit in @old to
783  * the position of the m-th set bit in @new, where m == n % w.
784  *
785  * The positions of unset bits in @old are mapped to themselves
786  * (the identify map).
787  *
788  * Apply the above specified mapping to bit position @oldbit, returning
789  * the new bit position.
790  *
791  * For example, lets say that @old has bits 4 through 7 set, and
792  * @new has bits 12 through 15 set.  This defines the mapping of bit
793  * position 4 to 12, 5 to 13, 6 to 14 and 7 to 15, and of all other
794  * bit positions unchanged.  So if say @oldbit is 5, then this routine
795  * returns 13.
796  */
797 int bitmap_bitremap(int oldbit, const unsigned long *old,
798                                 const unsigned long *new, int bits)
799 {
800         int w = bitmap_weight(new, bits);
801         int n = bitmap_pos_to_ord(old, oldbit, bits);
802         if (n < 0 || w == 0)
803                 return oldbit;
804         else
805                 return bitmap_ord_to_pos(new, n % w, bits);
806 }
807 EXPORT_SYMBOL(bitmap_bitremap);
808
809 /**
810  * bitmap_onto - translate one bitmap relative to another
811  *      @dst: resulting translated bitmap
812  *      @orig: original untranslated bitmap
813  *      @relmap: bitmap relative to which translated
814  *      @bits: number of bits in each of these bitmaps
815  *
816  * Set the n-th bit of @dst iff there exists some m such that the
817  * n-th bit of @relmap is set, the m-th bit of @orig is set, and
818  * the n-th bit of @relmap is also the m-th _set_ bit of @relmap.
819  * (If you understood the previous sentence the first time your
820  * read it, you're overqualified for your current job.)
821  *
822  * In other words, @orig is mapped onto (surjectively) @dst,
823  * using the map { <n, m> | the n-th bit of @relmap is the
824  * m-th set bit of @relmap }.
825  *
826  * Any set bits in @orig above bit number W, where W is the
827  * weight of (number of set bits in) @relmap are mapped nowhere.
828  * In particular, if for all bits m set in @orig, m >= W, then
829  * @dst will end up empty.  In situations where the possibility
830  * of such an empty result is not desired, one way to avoid it is
831  * to use the bitmap_fold() operator, below, to first fold the
832  * @orig bitmap over itself so that all its set bits x are in the
833  * range 0 <= x < W.  The bitmap_fold() operator does this by
834  * setting the bit (m % W) in @dst, for each bit (m) set in @orig.
835  *
836  * Example [1] for bitmap_onto():
837  *  Let's say @relmap has bits 30-39 set, and @orig has bits
838  *  1, 3, 5, 7, 9 and 11 set.  Then on return from this routine,
839  *  @dst will have bits 31, 33, 35, 37 and 39 set.
840  *
841  *  When bit 0 is set in @orig, it means turn on the bit in
842  *  @dst corresponding to whatever is the first bit (if any)
843  *  that is turned on in @relmap.  Since bit 0 was off in the
844  *  above example, we leave off that bit (bit 30) in @dst.
845  *
846  *  When bit 1 is set in @orig (as in the above example), it
847  *  means turn on the bit in @dst corresponding to whatever
848  *  is the second bit that is turned on in @relmap.  The second
849  *  bit in @relmap that was turned on in the above example was
850  *  bit 31, so we turned on bit 31 in @dst.
851  *
852  *  Similarly, we turned on bits 33, 35, 37 and 39 in @dst,
853  *  because they were the 4th, 6th, 8th and 10th set bits
854  *  set in @relmap, and the 4th, 6th, 8th and 10th bits of
855  *  @orig (i.e. bits 3, 5, 7 and 9) were also set.
856  *
857  *  When bit 11 is set in @orig, it means turn on the bit in
858  *  @dst corresponding to whatever is the twelfth bit that is
859  *  turned on in @relmap.  In the above example, there were
860  *  only ten bits turned on in @relmap (30..39), so that bit
861  *  11 was set in @orig had no affect on @dst.
862  *
863  * Example [2] for bitmap_fold() + bitmap_onto():
864  *  Let's say @relmap has these ten bits set::
865  *
866  *              40 41 42 43 45 48 53 61 74 95
867  *
868  *  (for the curious, that's 40 plus the first ten terms of the
869  *  Fibonacci sequence.)
870  *
871  *  Further lets say we use the following code, invoking
872  *  bitmap_fold() then bitmap_onto, as suggested above to
873  *  avoid the possibility of an empty @dst result::
874  *
875  *      unsigned long *tmp;     // a temporary bitmap's bits
876  *
877  *      bitmap_fold(tmp, orig, bitmap_weight(relmap, bits), bits);
878  *      bitmap_onto(dst, tmp, relmap, bits);
879  *
880  *  Then this table shows what various values of @dst would be, for
881  *  various @orig's.  I list the zero-based positions of each set bit.
882  *  The tmp column shows the intermediate result, as computed by
883  *  using bitmap_fold() to fold the @orig bitmap modulo ten
884  *  (the weight of @relmap):
885  *
886  *      =============== ============== =================
887  *      @orig           tmp            @dst
888  *      0                0             40
889  *      1                1             41
890  *      9                9             95
891  *      10               0             40 [#f1]_
892  *      1 3 5 7          1 3 5 7       41 43 48 61
893  *      0 1 2 3 4        0 1 2 3 4     40 41 42 43 45
894  *      0 9 18 27        0 9 8 7       40 61 74 95
895  *      0 10 20 30       0             40
896  *      0 11 22 33       0 1 2 3       40 41 42 43
897  *      0 12 24 36       0 2 4 6       40 42 45 53
898  *      78 102 211       1 2 8         41 42 74 [#f1]_
899  *      =============== ============== =================
900  *
901  * .. [#f1]
902  *
903  *     For these marked lines, if we hadn't first done bitmap_fold()
904  *     into tmp, then the @dst result would have been empty.
905  *
906  * If either of @orig or @relmap is empty (no set bits), then @dst
907  * will be returned empty.
908  *
909  * If (as explained above) the only set bits in @orig are in positions
910  * m where m >= W, (where W is the weight of @relmap) then @dst will
911  * once again be returned empty.
912  *
913  * All bits in @dst not set by the above rule are cleared.
914  */
915 void bitmap_onto(unsigned long *dst, const unsigned long *orig,
916                         const unsigned long *relmap, unsigned int bits)
917 {
918         unsigned int n, m;      /* same meaning as in above comment */
919
920         if (dst == orig)        /* following doesn't handle inplace mappings */
921                 return;
922         bitmap_zero(dst, bits);
923
924         /*
925          * The following code is a more efficient, but less
926          * obvious, equivalent to the loop:
927          *      for (m = 0; m < bitmap_weight(relmap, bits); m++) {
928          *              n = bitmap_ord_to_pos(orig, m, bits);
929          *              if (test_bit(m, orig))
930          *                      set_bit(n, dst);
931          *      }
932          */
933
934         m = 0;
935         for_each_set_bit(n, relmap, bits) {
936                 /* m == bitmap_pos_to_ord(relmap, n, bits) */
937                 if (test_bit(m, orig))
938                         set_bit(n, dst);
939                 m++;
940         }
941 }
942 EXPORT_SYMBOL(bitmap_onto);
943
944 /**
945  * bitmap_fold - fold larger bitmap into smaller, modulo specified size
946  *      @dst: resulting smaller bitmap
947  *      @orig: original larger bitmap
948  *      @sz: specified size
949  *      @nbits: number of bits in each of these bitmaps
950  *
951  * For each bit oldbit in @orig, set bit oldbit mod @sz in @dst.
952  * Clear all other bits in @dst.  See further the comment and
953  * Example [2] for bitmap_onto() for why and how to use this.
954  */
955 void bitmap_fold(unsigned long *dst, const unsigned long *orig,
956                         unsigned int sz, unsigned int nbits)
957 {
958         unsigned int oldbit;
959
960         if (dst == orig)        /* following doesn't handle inplace mappings */
961                 return;
962         bitmap_zero(dst, nbits);
963
964         for_each_set_bit(oldbit, orig, nbits)
965                 set_bit(oldbit % sz, dst);
966 }
967 EXPORT_SYMBOL(bitmap_fold);
968
969 /*
970  * Common code for bitmap_*_region() routines.
971  *      bitmap: array of unsigned longs corresponding to the bitmap
972  *      pos: the beginning of the region
973  *      order: region size (log base 2 of number of bits)
974  *      reg_op: operation(s) to perform on that region of bitmap
975  *
976  * Can set, verify and/or release a region of bits in a bitmap,
977  * depending on which combination of REG_OP_* flag bits is set.
978  *
979  * A region of a bitmap is a sequence of bits in the bitmap, of
980  * some size '1 << order' (a power of two), aligned to that same
981  * '1 << order' power of two.
982  *
983  * Returns 1 if REG_OP_ISFREE succeeds (region is all zero bits).
984  * Returns 0 in all other cases and reg_ops.
985  */
986
987 enum {
988         REG_OP_ISFREE,          /* true if region is all zero bits */
989         REG_OP_ALLOC,           /* set all bits in region */
990         REG_OP_RELEASE,         /* clear all bits in region */
991 };
992
993 static int __reg_op(unsigned long *bitmap, unsigned int pos, int order, int reg_op)
994 {
995         int nbits_reg;          /* number of bits in region */
996         int index;              /* index first long of region in bitmap */
997         int offset;             /* bit offset region in bitmap[index] */
998         int nlongs_reg;         /* num longs spanned by region in bitmap */
999         int nbitsinlong;        /* num bits of region in each spanned long */
1000         unsigned long mask;     /* bitmask for one long of region */
1001         int i;                  /* scans bitmap by longs */
1002         int ret = 0;            /* return value */
1003
1004         /*
1005          * Either nlongs_reg == 1 (for small orders that fit in one long)
1006          * or (offset == 0 && mask == ~0UL) (for larger multiword orders.)
1007          */
1008         nbits_reg = 1 << order;
1009         index = pos / BITS_PER_LONG;
1010         offset = pos - (index * BITS_PER_LONG);
1011         nlongs_reg = BITS_TO_LONGS(nbits_reg);
1012         nbitsinlong = min(nbits_reg,  BITS_PER_LONG);
1013
1014         /*
1015          * Can't do "mask = (1UL << nbitsinlong) - 1", as that
1016          * overflows if nbitsinlong == BITS_PER_LONG.
1017          */
1018         mask = (1UL << (nbitsinlong - 1));
1019         mask += mask - 1;
1020         mask <<= offset;
1021
1022         switch (reg_op) {
1023         case REG_OP_ISFREE:
1024                 for (i = 0; i < nlongs_reg; i++) {
1025                         if (bitmap[index + i] & mask)
1026                                 goto done;
1027                 }
1028                 ret = 1;        /* all bits in region free (zero) */
1029                 break;
1030
1031         case REG_OP_ALLOC:
1032                 for (i = 0; i < nlongs_reg; i++)
1033                         bitmap[index + i] |= mask;
1034                 break;
1035
1036         case REG_OP_RELEASE:
1037                 for (i = 0; i < nlongs_reg; i++)
1038                         bitmap[index + i] &= ~mask;
1039                 break;
1040         }
1041 done:
1042         return ret;
1043 }
1044
1045 /**
1046  * bitmap_find_free_region - find a contiguous aligned mem region
1047  *      @bitmap: array of unsigned longs corresponding to the bitmap
1048  *      @bits: number of bits in the bitmap
1049  *      @order: region size (log base 2 of number of bits) to find
1050  *
1051  * Find a region of free (zero) bits in a @bitmap of @bits bits and
1052  * allocate them (set them to one).  Only consider regions of length
1053  * a power (@order) of two, aligned to that power of two, which
1054  * makes the search algorithm much faster.
1055  *
1056  * Return the bit offset in bitmap of the allocated region,
1057  * or -errno on failure.
1058  */
1059 int bitmap_find_free_region(unsigned long *bitmap, unsigned int bits, int order)
1060 {
1061         unsigned int pos, end;          /* scans bitmap by regions of size order */
1062
1063         for (pos = 0 ; (end = pos + (1U << order)) <= bits; pos = end) {
1064                 if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE))
1065                         continue;
1066                 __reg_op(bitmap, pos, order, REG_OP_ALLOC);
1067                 return pos;
1068         }
1069         return -ENOMEM;
1070 }
1071 EXPORT_SYMBOL(bitmap_find_free_region);
1072
1073 /**
1074  * bitmap_release_region - release allocated bitmap region
1075  *      @bitmap: array of unsigned longs corresponding to the bitmap
1076  *      @pos: beginning of bit region to release
1077  *      @order: region size (log base 2 of number of bits) to release
1078  *
1079  * This is the complement to __bitmap_find_free_region() and releases
1080  * the found region (by clearing it in the bitmap).
1081  *
1082  * No return value.
1083  */
1084 void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int order)
1085 {
1086         __reg_op(bitmap, pos, order, REG_OP_RELEASE);
1087 }
1088 EXPORT_SYMBOL(bitmap_release_region);
1089
1090 /**
1091  * bitmap_allocate_region - allocate bitmap region
1092  *      @bitmap: array of unsigned longs corresponding to the bitmap
1093  *      @pos: beginning of bit region to allocate
1094  *      @order: region size (log base 2 of number of bits) to allocate
1095  *
1096  * Allocate (set bits in) a specified region of a bitmap.
1097  *
1098  * Return 0 on success, or %-EBUSY if specified region wasn't
1099  * free (not all bits were zero).
1100  */
1101 int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order)
1102 {
1103         if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE))
1104                 return -EBUSY;
1105         return __reg_op(bitmap, pos, order, REG_OP_ALLOC);
1106 }
1107 EXPORT_SYMBOL(bitmap_allocate_region);
1108
1109 /**
1110  * bitmap_copy_le - copy a bitmap, putting the bits into little-endian order.
1111  * @dst:   destination buffer
1112  * @src:   bitmap to copy
1113  * @nbits: number of bits in the bitmap
1114  *
1115  * Require nbits % BITS_PER_LONG == 0.
1116  */
1117 #ifdef __BIG_ENDIAN
1118 void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int nbits)
1119 {
1120         unsigned int i;
1121
1122         for (i = 0; i < nbits/BITS_PER_LONG; i++) {
1123                 if (BITS_PER_LONG == 64)
1124                         dst[i] = cpu_to_le64(src[i]);
1125                 else
1126                         dst[i] = cpu_to_le32(src[i]);
1127         }
1128 }
1129 EXPORT_SYMBOL(bitmap_copy_le);
1130 #endif
1131
1132 unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags)
1133 {
1134         return kmalloc_array(BITS_TO_LONGS(nbits), sizeof(unsigned long),
1135                              flags);
1136 }
1137 EXPORT_SYMBOL(bitmap_alloc);
1138
1139 unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags)
1140 {
1141         return bitmap_alloc(nbits, flags | __GFP_ZERO);
1142 }
1143 EXPORT_SYMBOL(bitmap_zalloc);
1144
1145 void bitmap_free(const unsigned long *bitmap)
1146 {
1147         kfree(bitmap);
1148 }
1149 EXPORT_SYMBOL(bitmap_free);
1150
1151 #if BITS_PER_LONG == 64
1152 /**
1153  * bitmap_from_arr32 - copy the contents of u32 array of bits to bitmap
1154  *      @bitmap: array of unsigned longs, the destination bitmap
1155  *      @buf: array of u32 (in host byte order), the source bitmap
1156  *      @nbits: number of bits in @bitmap
1157  */
1158 void bitmap_from_arr32(unsigned long *bitmap, const u32 *buf,
1159                                                 unsigned int nbits)
1160 {
1161         unsigned int i, halfwords;
1162
1163         if (!nbits)
1164                 return;
1165
1166         halfwords = DIV_ROUND_UP(nbits, 32);
1167         for (i = 0; i < halfwords; i++) {
1168                 bitmap[i/2] = (unsigned long) buf[i];
1169                 if (++i < halfwords)
1170                         bitmap[i/2] |= ((unsigned long) buf[i]) << 32;
1171         }
1172
1173         /* Clear tail bits in last word beyond nbits. */
1174         if (nbits % BITS_PER_LONG)
1175                 bitmap[(halfwords - 1) / 2] &= BITMAP_LAST_WORD_MASK(nbits);
1176 }
1177 EXPORT_SYMBOL(bitmap_from_arr32);
1178
1179 /**
1180  * bitmap_to_arr32 - copy the contents of bitmap to a u32 array of bits
1181  *      @buf: array of u32 (in host byte order), the dest bitmap
1182  *      @bitmap: array of unsigned longs, the source bitmap
1183  *      @nbits: number of bits in @bitmap
1184  */
1185 void bitmap_to_arr32(u32 *buf, const unsigned long *bitmap, unsigned int nbits)
1186 {
1187         unsigned int i, halfwords;
1188
1189         if (!nbits)
1190                 return;
1191
1192         halfwords = DIV_ROUND_UP(nbits, 32);
1193         for (i = 0; i < halfwords; i++) {
1194                 buf[i] = (u32) (bitmap[i/2] & UINT_MAX);
1195                 if (++i < halfwords)
1196                         buf[i] = (u32) (bitmap[i/2] >> 32);
1197         }
1198
1199         /* Clear tail bits in last element of array beyond nbits. */
1200         if (nbits % BITS_PER_LONG)
1201                 buf[halfwords - 1] &= (u32) (UINT_MAX >> ((-nbits) & 31));
1202 }
1203 EXPORT_SYMBOL(bitmap_to_arr32);
1204
1205 #endif