~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/lib/bitmap.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /lib/bitmap.c (Version linux-6.11.5) and /lib/bitmap.c (Version linux-5.2.21)


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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php