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

TOMOYO Linux Cross Reference
Linux/lib/test_bitmap.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ 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 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-only
  2 /*
  3  * Test cases for bitmap API.
  4  */
  5 
  6 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  7 
  8 #include <linux/bitmap.h>
  9 #include <linux/init.h>
 10 #include <linux/kernel.h>
 11 #include <linux/module.h>
 12 #include <linux/printk.h>
 13 #include <linux/slab.h>
 14 #include <linux/string.h>
 15 #include <linux/uaccess.h>
 16 
 17 #include "../tools/testing/selftests/kselftest_module.h"
 18 
 19 #define EXP1_IN_BITS    (sizeof(exp1) * 8)
 20 
 21 KSTM_MODULE_GLOBALS();
 22 
 23 static char pbl_buffer[PAGE_SIZE] __initdata;
 24 static char print_buf[PAGE_SIZE * 2] __initdata;
 25 
 26 static const unsigned long exp1[] __initconst = {
 27         BITMAP_FROM_U64(1),
 28         BITMAP_FROM_U64(2),
 29         BITMAP_FROM_U64(0x0000ffff),
 30         BITMAP_FROM_U64(0xffff0000),
 31         BITMAP_FROM_U64(0x55555555),
 32         BITMAP_FROM_U64(0xaaaaaaaa),
 33         BITMAP_FROM_U64(0x11111111),
 34         BITMAP_FROM_U64(0x22222222),
 35         BITMAP_FROM_U64(0xffffffff),
 36         BITMAP_FROM_U64(0xfffffffe),
 37         BITMAP_FROM_U64(0x3333333311111111ULL),
 38         BITMAP_FROM_U64(0xffffffff77777777ULL),
 39         BITMAP_FROM_U64(0),
 40         BITMAP_FROM_U64(0x00008000),
 41         BITMAP_FROM_U64(0x80000000),
 42 };
 43 
 44 static const unsigned long exp2[] __initconst = {
 45         BITMAP_FROM_U64(0x3333333311111111ULL),
 46         BITMAP_FROM_U64(0xffffffff77777777ULL),
 47 };
 48 
 49 /* Fibonacci sequence */
 50 static const unsigned long exp2_to_exp3_mask[] __initconst = {
 51         BITMAP_FROM_U64(0x008000020020212eULL),
 52 };
 53 /* exp3_0_1 = (exp2[0] & ~exp2_to_exp3_mask) | (exp2[1] & exp2_to_exp3_mask) */
 54 static const unsigned long exp3_0_1[] __initconst = {
 55         BITMAP_FROM_U64(0x33b3333311313137ULL),
 56 };
 57 /* exp3_1_0 = (exp2[1] & ~exp2_to_exp3_mask) | (exp2[0] & exp2_to_exp3_mask) */
 58 static const unsigned long exp3_1_0[] __initconst = {
 59         BITMAP_FROM_U64(0xff7fffff77575751ULL),
 60 };
 61 
 62 static bool __init
 63 __check_eq_ulong(const char *srcfile, unsigned int line,
 64                  const unsigned long exp_ulong, unsigned long x)
 65 {
 66         if (exp_ulong != x) {
 67                 pr_err("[%s:%u] expected %lu, got %lu\n",
 68                         srcfile, line, exp_ulong, x);
 69                 return false;
 70         }
 71         return true;
 72 }
 73 
 74 static bool __init
 75 __check_eq_bitmap(const char *srcfile, unsigned int line,
 76                   const unsigned long *exp_bmap, const unsigned long *bmap,
 77                   unsigned int nbits)
 78 {
 79         if (!bitmap_equal(exp_bmap, bmap, nbits)) {
 80                 pr_warn("[%s:%u] bitmaps contents differ: expected \"%*pbl\", got \"%*pbl\"\n",
 81                         srcfile, line,
 82                         nbits, exp_bmap, nbits, bmap);
 83                 return false;
 84         }
 85         return true;
 86 }
 87 
 88 static bool __init
 89 __check_eq_pbl(const char *srcfile, unsigned int line,
 90                const char *expected_pbl,
 91                const unsigned long *bitmap, unsigned int nbits)
 92 {
 93         snprintf(pbl_buffer, sizeof(pbl_buffer), "%*pbl", nbits, bitmap);
 94         if (strcmp(expected_pbl, pbl_buffer)) {
 95                 pr_warn("[%s:%u] expected \"%s\", got \"%s\"\n",
 96                         srcfile, line,
 97                         expected_pbl, pbl_buffer);
 98                 return false;
 99         }
100         return true;
101 }
102 
103 static bool __init
104 __check_eq_u32_array(const char *srcfile, unsigned int line,
105                      const u32 *exp_arr, unsigned int exp_len,
106                      const u32 *arr, unsigned int len) __used;
107 static bool __init
108 __check_eq_u32_array(const char *srcfile, unsigned int line,
109                      const u32 *exp_arr, unsigned int exp_len,
110                      const u32 *arr, unsigned int len)
111 {
112         if (exp_len != len) {
113                 pr_warn("[%s:%u] array length differ: expected %u, got %u\n",
114                         srcfile, line,
115                         exp_len, len);
116                 return false;
117         }
118 
119         if (memcmp(exp_arr, arr, len*sizeof(*arr))) {
120                 pr_warn("[%s:%u] array contents differ\n", srcfile, line);
121                 print_hex_dump(KERN_WARNING, "  exp:  ", DUMP_PREFIX_OFFSET,
122                                32, 4, exp_arr, exp_len*sizeof(*exp_arr), false);
123                 print_hex_dump(KERN_WARNING, "  got:  ", DUMP_PREFIX_OFFSET,
124                                32, 4, arr, len*sizeof(*arr), false);
125                 return false;
126         }
127 
128         return true;
129 }
130 
131 static bool __init __check_eq_clump8(const char *srcfile, unsigned int line,
132                                     const unsigned int offset,
133                                     const unsigned int size,
134                                     const unsigned char *const clump_exp,
135                                     const unsigned long *const clump)
136 {
137         unsigned long exp;
138 
139         if (offset >= size) {
140                 pr_warn("[%s:%u] bit offset for clump out-of-bounds: expected less than %u, got %u\n",
141                         srcfile, line, size, offset);
142                 return false;
143         }
144 
145         exp = clump_exp[offset / 8];
146         if (!exp) {
147                 pr_warn("[%s:%u] bit offset for zero clump: expected nonzero clump, got bit offset %u with clump value 0",
148                         srcfile, line, offset);
149                 return false;
150         }
151 
152         if (*clump != exp) {
153                 pr_warn("[%s:%u] expected clump value of 0x%lX, got clump value of 0x%lX",
154                         srcfile, line, exp, *clump);
155                 return false;
156         }
157 
158         return true;
159 }
160 
161 static bool __init
162 __check_eq_str(const char *srcfile, unsigned int line,
163                 const char *exp_str, const char *str,
164                 unsigned int len)
165 {
166         bool eq;
167 
168         eq = strncmp(exp_str, str, len) == 0;
169         if (!eq)
170                 pr_err("[%s:%u] expected %s, got %s\n", srcfile, line, exp_str, str);
171 
172         return eq;
173 }
174 
175 #define __expect_eq(suffix, ...)                                        \
176         ({                                                              \
177                 int result = 0;                                         \
178                 total_tests++;                                          \
179                 if (!__check_eq_ ## suffix(__FILE__, __LINE__,          \
180                                            ##__VA_ARGS__)) {            \
181                         failed_tests++;                                 \
182                         result = 1;                                     \
183                 }                                                       \
184                 result;                                                 \
185         })
186 
187 #define expect_eq_ulong(...)            __expect_eq(ulong, ##__VA_ARGS__)
188 #define expect_eq_uint(x, y)            expect_eq_ulong((unsigned int)(x), (unsigned int)(y))
189 #define expect_eq_bitmap(...)           __expect_eq(bitmap, ##__VA_ARGS__)
190 #define expect_eq_pbl(...)              __expect_eq(pbl, ##__VA_ARGS__)
191 #define expect_eq_u32_array(...)        __expect_eq(u32_array, ##__VA_ARGS__)
192 #define expect_eq_clump8(...)           __expect_eq(clump8, ##__VA_ARGS__)
193 #define expect_eq_str(...)              __expect_eq(str, ##__VA_ARGS__)
194 
195 static void __init test_zero_clear(void)
196 {
197         DECLARE_BITMAP(bmap, 1024);
198 
199         /* Known way to set all bits */
200         memset(bmap, 0xff, 128);
201 
202         expect_eq_pbl("0-22", bmap, 23);
203         expect_eq_pbl("0-1023", bmap, 1024);
204 
205         /* single-word bitmaps */
206         bitmap_clear(bmap, 0, 9);
207         expect_eq_pbl("9-1023", bmap, 1024);
208 
209         bitmap_zero(bmap, 35);
210         expect_eq_pbl("64-1023", bmap, 1024);
211 
212         /* cross boundaries operations */
213         bitmap_clear(bmap, 79, 19);
214         expect_eq_pbl("64-78,98-1023", bmap, 1024);
215 
216         bitmap_zero(bmap, 115);
217         expect_eq_pbl("128-1023", bmap, 1024);
218 
219         /* Zeroing entire area */
220         bitmap_zero(bmap, 1024);
221         expect_eq_pbl("", bmap, 1024);
222 }
223 
224 static void __init test_find_nth_bit(void)
225 {
226         unsigned long b, bit, cnt = 0;
227         DECLARE_BITMAP(bmap, 64 * 3);
228 
229         bitmap_zero(bmap, 64 * 3);
230         __set_bit(10, bmap);
231         __set_bit(20, bmap);
232         __set_bit(30, bmap);
233         __set_bit(40, bmap);
234         __set_bit(50, bmap);
235         __set_bit(60, bmap);
236         __set_bit(80, bmap);
237         __set_bit(123, bmap);
238 
239         expect_eq_uint(10,  find_nth_bit(bmap, 64 * 3, 0));
240         expect_eq_uint(20,  find_nth_bit(bmap, 64 * 3, 1));
241         expect_eq_uint(30,  find_nth_bit(bmap, 64 * 3, 2));
242         expect_eq_uint(40,  find_nth_bit(bmap, 64 * 3, 3));
243         expect_eq_uint(50,  find_nth_bit(bmap, 64 * 3, 4));
244         expect_eq_uint(60,  find_nth_bit(bmap, 64 * 3, 5));
245         expect_eq_uint(80,  find_nth_bit(bmap, 64 * 3, 6));
246         expect_eq_uint(123, find_nth_bit(bmap, 64 * 3, 7));
247         expect_eq_uint(0,   !!(find_nth_bit(bmap, 64 * 3, 8) < 64 * 3));
248 
249         expect_eq_uint(10,  find_nth_bit(bmap, 64 * 3 - 1, 0));
250         expect_eq_uint(20,  find_nth_bit(bmap, 64 * 3 - 1, 1));
251         expect_eq_uint(30,  find_nth_bit(bmap, 64 * 3 - 1, 2));
252         expect_eq_uint(40,  find_nth_bit(bmap, 64 * 3 - 1, 3));
253         expect_eq_uint(50,  find_nth_bit(bmap, 64 * 3 - 1, 4));
254         expect_eq_uint(60,  find_nth_bit(bmap, 64 * 3 - 1, 5));
255         expect_eq_uint(80,  find_nth_bit(bmap, 64 * 3 - 1, 6));
256         expect_eq_uint(123, find_nth_bit(bmap, 64 * 3 - 1, 7));
257         expect_eq_uint(0,   !!(find_nth_bit(bmap, 64 * 3 - 1, 8) < 64 * 3 - 1));
258 
259         for_each_set_bit(bit, exp1, EXP1_IN_BITS) {
260                 b = find_nth_bit(exp1, EXP1_IN_BITS, cnt++);
261                 expect_eq_uint(b, bit);
262         }
263 }
264 
265 static void __init test_fill_set(void)
266 {
267         DECLARE_BITMAP(bmap, 1024);
268 
269         /* Known way to clear all bits */
270         memset(bmap, 0x00, 128);
271 
272         expect_eq_pbl("", bmap, 23);
273         expect_eq_pbl("", bmap, 1024);
274 
275         /* single-word bitmaps */
276         bitmap_set(bmap, 0, 9);
277         expect_eq_pbl("0-8", bmap, 1024);
278 
279         bitmap_fill(bmap, 35);
280         expect_eq_pbl("0-63", bmap, 1024);
281 
282         /* cross boundaries operations */
283         bitmap_set(bmap, 79, 19);
284         expect_eq_pbl("0-63,79-97", bmap, 1024);
285 
286         bitmap_fill(bmap, 115);
287         expect_eq_pbl("0-127", bmap, 1024);
288 
289         /* Zeroing entire area */
290         bitmap_fill(bmap, 1024);
291         expect_eq_pbl("0-1023", bmap, 1024);
292 }
293 
294 static void __init test_copy(void)
295 {
296         DECLARE_BITMAP(bmap1, 1024);
297         DECLARE_BITMAP(bmap2, 1024);
298 
299         bitmap_zero(bmap1, 1024);
300         bitmap_zero(bmap2, 1024);
301 
302         /* single-word bitmaps */
303         bitmap_set(bmap1, 0, 19);
304         bitmap_copy(bmap2, bmap1, 23);
305         expect_eq_pbl("0-18", bmap2, 1024);
306 
307         bitmap_set(bmap2, 0, 23);
308         bitmap_copy(bmap2, bmap1, 23);
309         expect_eq_pbl("0-18", bmap2, 1024);
310 
311         /* multi-word bitmaps */
312         bitmap_set(bmap1, 0, 109);
313         bitmap_copy(bmap2, bmap1, 1024);
314         expect_eq_pbl("0-108", bmap2, 1024);
315 
316         bitmap_fill(bmap2, 1024);
317         bitmap_copy(bmap2, bmap1, 1024);
318         expect_eq_pbl("0-108", bmap2, 1024);
319 
320         /* the following tests assume a 32- or 64-bit arch (even 128b
321          * if we care)
322          */
323 
324         bitmap_fill(bmap2, 1024);
325         bitmap_copy(bmap2, bmap1, 109);  /* ... but 0-padded til word length */
326         expect_eq_pbl("0-108,128-1023", bmap2, 1024);
327 
328         bitmap_fill(bmap2, 1024);
329         bitmap_copy(bmap2, bmap1, 97);  /* ... but aligned on word length */
330         expect_eq_pbl("0-108,128-1023", bmap2, 1024);
331 }
332 
333 static void __init test_bitmap_region(void)
334 {
335         int pos, order;
336 
337         DECLARE_BITMAP(bmap, 1000);
338 
339         bitmap_zero(bmap, 1000);
340 
341         for (order = 0; order < 10; order++) {
342                 pos = bitmap_find_free_region(bmap, 1000, order);
343                 if (order == 0)
344                         expect_eq_uint(pos, 0);
345                 else
346                         expect_eq_uint(pos, order < 9 ? BIT(order) : -ENOMEM);
347         }
348 
349         bitmap_release_region(bmap, 0, 0);
350         for (order = 1; order < 9; order++)
351                 bitmap_release_region(bmap, BIT(order), order);
352 
353         expect_eq_uint(bitmap_weight(bmap, 1000), 0);
354 }
355 
356 #define EXP2_IN_BITS    (sizeof(exp2) * 8)
357 
358 static void __init test_replace(void)
359 {
360         unsigned int nbits = 64;
361         unsigned int nlongs = DIV_ROUND_UP(nbits, BITS_PER_LONG);
362         DECLARE_BITMAP(bmap, 1024);
363 
364         BUILD_BUG_ON(EXP2_IN_BITS < nbits * 2);
365 
366         bitmap_zero(bmap, 1024);
367         bitmap_replace(bmap, &exp2[0 * nlongs], &exp2[1 * nlongs], exp2_to_exp3_mask, nbits);
368         expect_eq_bitmap(bmap, exp3_0_1, nbits);
369 
370         bitmap_zero(bmap, 1024);
371         bitmap_replace(bmap, &exp2[1 * nlongs], &exp2[0 * nlongs], exp2_to_exp3_mask, nbits);
372         expect_eq_bitmap(bmap, exp3_1_0, nbits);
373 
374         bitmap_fill(bmap, 1024);
375         bitmap_replace(bmap, &exp2[0 * nlongs], &exp2[1 * nlongs], exp2_to_exp3_mask, nbits);
376         expect_eq_bitmap(bmap, exp3_0_1, nbits);
377 
378         bitmap_fill(bmap, 1024);
379         bitmap_replace(bmap, &exp2[1 * nlongs], &exp2[0 * nlongs], exp2_to_exp3_mask, nbits);
380         expect_eq_bitmap(bmap, exp3_1_0, nbits);
381 }
382 
383 static const unsigned long sg_mask[] __initconst = {
384         BITMAP_FROM_U64(0x000000000000035aULL),
385 };
386 
387 static const unsigned long sg_src[] __initconst = {
388         BITMAP_FROM_U64(0x0000000000000667ULL),
389 };
390 
391 static const unsigned long sg_gather_exp[] __initconst = {
392         BITMAP_FROM_U64(0x0000000000000029ULL),
393 };
394 
395 static const unsigned long sg_scatter_exp[] __initconst = {
396         BITMAP_FROM_U64(0x000000000000021aULL),
397 };
398 
399 static void __init test_bitmap_sg(void)
400 {
401         unsigned int nbits = 64;
402         DECLARE_BITMAP(bmap_gather, 100);
403         DECLARE_BITMAP(bmap_scatter, 100);
404         DECLARE_BITMAP(bmap_tmp, 100);
405         DECLARE_BITMAP(bmap_res, 100);
406 
407         /* Simple gather call */
408         bitmap_zero(bmap_gather, 100);
409         bitmap_gather(bmap_gather, sg_src, sg_mask, nbits);
410         expect_eq_bitmap(sg_gather_exp, bmap_gather, nbits);
411 
412         /* Simple scatter call */
413         bitmap_zero(bmap_scatter, 100);
414         bitmap_scatter(bmap_scatter, sg_src, sg_mask, nbits);
415         expect_eq_bitmap(sg_scatter_exp, bmap_scatter, nbits);
416 
417         /* Scatter/gather relationship */
418         bitmap_zero(bmap_tmp, 100);
419         bitmap_gather(bmap_tmp, bmap_scatter, sg_mask, nbits);
420         bitmap_scatter(bmap_res, bmap_tmp, sg_mask, nbits);
421         expect_eq_bitmap(bmap_scatter, bmap_res, nbits);
422 }
423 
424 #define PARSE_TIME      0x1
425 #define NO_LEN          0x2
426 
427 struct test_bitmap_parselist{
428         const int errno;
429         const char *in;
430         const unsigned long *expected;
431         const int nbits;
432         const int flags;
433 };
434 
435 static const struct test_bitmap_parselist parselist_tests[] __initconst = {
436 #define step (sizeof(u64) / sizeof(unsigned long))
437 
438         {0, "",                        &exp1[0], 8, 0},
439         {0, "1",                        &exp1[1 * step], 8, 0},
440         {0, "0-15",                     &exp1[2 * step], 32, 0},
441         {0, "16-31",                    &exp1[3 * step], 32, 0},
442         {0, "0-31:1/2",                 &exp1[4 * step], 32, 0},
443         {0, "1-31:1/2",                 &exp1[5 * step], 32, 0},
444         {0, "0-31:1/4",                 &exp1[6 * step], 32, 0},
445         {0, "1-31:1/4",                 &exp1[7 * step], 32, 0},
446         {0, "0-31:4/4",                 &exp1[8 * step], 32, 0},
447         {0, "1-31:4/4",                 &exp1[9 * step], 32, 0},
448         {0, "0-31:1/4,32-63:2/4",       &exp1[10 * step], 64, 0},
449         {0, "0-31:3/4,32-63:4/4",       &exp1[11 * step], 64, 0},
450         {0, "  ,,  0-31:3/4  ,, 32-63:4/4  ,,  ",       &exp1[11 * step], 64, 0},
451 
452         {0, "0-31:1/4,32-63:2/4,64-95:3/4,96-127:4/4",  exp2, 128, 0},
453 
454         {0, "0-2047:128/256", NULL, 2048, PARSE_TIME},
455 
456         {0, "",                         &exp1[12 * step], 8, 0},
457         {0, "\n",                       &exp1[12 * step], 8, 0},
458         {0, ",,  ,,  , ,  ,",           &exp1[12 * step], 8, 0},
459         {0, " ,  ,,  , ,   ",           &exp1[12 * step], 8, 0},
460         {0, " ,  ,,  , ,   \n",         &exp1[12 * step], 8, 0},
461 
462         {0, "0-0",                      &exp1[0], 32, 0},
463         {0, "1-1",                      &exp1[1 * step], 32, 0},
464         {0, "15-15",                    &exp1[13 * step], 32, 0},
465         {0, "31-31",                    &exp1[14 * step], 32, 0},
466 
467         {0, "0-0:0/1",                  &exp1[12 * step], 32, 0},
468         {0, "0-0:1/1",                  &exp1[0], 32, 0},
469         {0, "0-0:1/31",                 &exp1[0], 32, 0},
470         {0, "0-0:31/31",                &exp1[0], 32, 0},
471         {0, "1-1:1/1",                  &exp1[1 * step], 32, 0},
472         {0, "0-15:16/31",               &exp1[2 * step], 32, 0},
473         {0, "15-15:1/2",                &exp1[13 * step], 32, 0},
474         {0, "15-15:31/31",              &exp1[13 * step], 32, 0},
475         {0, "15-31:1/31",               &exp1[13 * step], 32, 0},
476         {0, "16-31:16/31",              &exp1[3 * step], 32, 0},
477         {0, "31-31:31/31",              &exp1[14 * step], 32, 0},
478 
479         {0, "N-N",                      &exp1[14 * step], 32, 0},
480         {0, "0-0:1/N",                  &exp1[0], 32, 0},
481         {0, "0-0:N/N",                  &exp1[0], 32, 0},
482         {0, "0-15:16/N",                &exp1[2 * step], 32, 0},
483         {0, "15-15:N/N",                &exp1[13 * step], 32, 0},
484         {0, "15-N:1/N",                 &exp1[13 * step], 32, 0},
485         {0, "16-N:16/N",                &exp1[3 * step], 32, 0},
486         {0, "N-N:N/N",                  &exp1[14 * step], 32, 0},
487 
488         {0, "0-N:1/3,1-N:1/3,2-N:1/3",          &exp1[8 * step], 32, 0},
489         {0, "0-31:1/3,1-31:1/3,2-31:1/3",       &exp1[8 * step], 32, 0},
490         {0, "1-10:8/12,8-31:24/29,0-31:0/3",    &exp1[9 * step], 32, 0},
491 
492         {0,       "all",                &exp1[8 * step], 32, 0},
493         {0,       "0, 1, all,  ",       &exp1[8 * step], 32, 0},
494         {0,       "all:1/2",            &exp1[4 * step], 32, 0},
495         {0,       "ALL:1/2",            &exp1[4 * step], 32, 0},
496         {-EINVAL, "al", NULL, 8, 0},
497         {-EINVAL, "alll", NULL, 8, 0},
498 
499         {-EINVAL, "-1", NULL, 8, 0},
500         {-EINVAL, "-0", NULL, 8, 0},
501         {-EINVAL, "10-1", NULL, 8, 0},
502         {-ERANGE, "8-8", NULL, 8, 0},
503         {-ERANGE, "0-31", NULL, 8, 0},
504         {-EINVAL, "0-31:", NULL, 32, 0},
505         {-EINVAL, "0-31:0", NULL, 32, 0},
506         {-EINVAL, "0-31:0/", NULL, 32, 0},
507         {-EINVAL, "0-31:0/0", NULL, 32, 0},
508         {-EINVAL, "0-31:1/0", NULL, 32, 0},
509         {-EINVAL, "0-31:10/1", NULL, 32, 0},
510         {-EOVERFLOW, "0-98765432123456789:10/1", NULL, 8, 0},
511 
512         {-EINVAL, "a-31", NULL, 8, 0},
513         {-EINVAL, "0-a1", NULL, 8, 0},
514         {-EINVAL, "a-31:10/1", NULL, 8, 0},
515         {-EINVAL, "0-31:a/1", NULL, 8, 0},
516         {-EINVAL, "0-\n", NULL, 8, 0},
517 
518 };
519 
520 static void __init test_bitmap_parselist(void)
521 {
522         int i;
523         int err;
524         ktime_t time;
525         DECLARE_BITMAP(bmap, 2048);
526 
527         for (i = 0; i < ARRAY_SIZE(parselist_tests); i++) {
528 #define ptest parselist_tests[i]
529 
530                 time = ktime_get();
531                 err = bitmap_parselist(ptest.in, bmap, ptest.nbits);
532                 time = ktime_get() - time;
533 
534                 if (err != ptest.errno) {
535                         pr_err("parselist: %d: input is %s, errno is %d, expected %d\n",
536                                         i, ptest.in, err, ptest.errno);
537                         failed_tests++;
538                         continue;
539                 }
540 
541                 if (!err && ptest.expected
542                          && !__bitmap_equal(bmap, ptest.expected, ptest.nbits)) {
543                         pr_err("parselist: %d: input is %s, result is 0x%lx, expected 0x%lx\n",
544                                         i, ptest.in, bmap[0],
545                                         *ptest.expected);
546                         failed_tests++;
547                         continue;
548                 }
549 
550                 if (ptest.flags & PARSE_TIME)
551                         pr_info("parselist: %d: input is '%s' OK, Time: %llu\n",
552                                         i, ptest.in, time);
553 
554 #undef ptest
555         }
556 }
557 
558 static void __init test_bitmap_printlist(void)
559 {
560         unsigned long *bmap = kmalloc(PAGE_SIZE, GFP_KERNEL);
561         char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
562         char expected[256];
563         int ret, slen;
564         ktime_t time;
565 
566         if (!buf || !bmap)
567                 goto out;
568 
569         memset(bmap, -1, PAGE_SIZE);
570         slen = snprintf(expected, 256, "0-%ld", PAGE_SIZE * 8 - 1);
571         if (slen < 0)
572                 goto out;
573 
574         time = ktime_get();
575         ret = bitmap_print_to_pagebuf(true, buf, bmap, PAGE_SIZE * 8);
576         time = ktime_get() - time;
577 
578         if (ret != slen + 1) {
579                 pr_err("bitmap_print_to_pagebuf: result is %d, expected %d\n", ret, slen);
580                 failed_tests++;
581                 goto out;
582         }
583 
584         if (strncmp(buf, expected, slen)) {
585                 pr_err("bitmap_print_to_pagebuf: result is %s, expected %s\n", buf, expected);
586                 failed_tests++;
587                 goto out;
588         }
589 
590         pr_info("bitmap_print_to_pagebuf: input is '%s', Time: %llu\n", buf, time);
591 out:
592         kfree(buf);
593         kfree(bmap);
594 }
595 
596 static const unsigned long parse_test[] __initconst = {
597         BITMAP_FROM_U64(0),
598         BITMAP_FROM_U64(1),
599         BITMAP_FROM_U64(0xdeadbeef),
600         BITMAP_FROM_U64(0x100000000ULL),
601 };
602 
603 static const unsigned long parse_test2[] __initconst = {
604         BITMAP_FROM_U64(0x100000000ULL), BITMAP_FROM_U64(0xdeadbeef),
605         BITMAP_FROM_U64(0x100000000ULL), BITMAP_FROM_U64(0xbaadf00ddeadbeef),
606         BITMAP_FROM_U64(0x100000000ULL), BITMAP_FROM_U64(0x0badf00ddeadbeef),
607 };
608 
609 static const struct test_bitmap_parselist parse_tests[] __initconst = {
610         {0, "",                         &parse_test[0 * step], 32, 0},
611         {0, " ",                        &parse_test[0 * step], 32, 0},
612         {0, "",                        &parse_test[0 * step], 32, 0},
613         {0, "\n",                      &parse_test[0 * step], 32, 0},
614         {0, "1",                        &parse_test[1 * step], 32, 0},
615         {0, "deadbeef",                 &parse_test[2 * step], 32, 0},
616         {0, "1,0",                      &parse_test[3 * step], 33, 0},
617         {0, "deadbeef,\n,0,1",          &parse_test[2 * step], 96, 0},
618 
619         {0, "deadbeef,1,0",             &parse_test2[0 * 2 * step], 96, 0},
620         {0, "baadf00d,deadbeef,1,0",    &parse_test2[1 * 2 * step], 128, 0},
621         {0, "badf00d,deadbeef,1,0",     &parse_test2[2 * 2 * step], 124, 0},
622         {0, "badf00d,deadbeef,1,0",     &parse_test2[2 * 2 * step], 124, NO_LEN},
623         {0, "  badf00d,deadbeef,1,0  ", &parse_test2[2 * 2 * step], 124, 0},
624         {0, " , badf00d,deadbeef,1,0 , ",       &parse_test2[2 * 2 * step], 124, 0},
625         {0, " , badf00d, ,, ,,deadbeef,1,0 , ", &parse_test2[2 * 2 * step], 124, 0},
626 
627         {-EINVAL,    "goodfood,deadbeef,1,0",   NULL, 128, 0},
628         {-EOVERFLOW, "3,0",                     NULL, 33, 0},
629         {-EOVERFLOW, "123badf00d,deadbeef,1,0", NULL, 128, 0},
630         {-EOVERFLOW, "badf00d,deadbeef,1,0",    NULL, 90, 0},
631         {-EOVERFLOW, "fbadf00d,deadbeef,1,0",   NULL, 95, 0},
632         {-EOVERFLOW, "badf00d,deadbeef,1,0",    NULL, 100, 0},
633 #undef step
634 };
635 
636 static void __init test_bitmap_parse(void)
637 {
638         int i;
639         int err;
640         ktime_t time;
641         DECLARE_BITMAP(bmap, 2048);
642 
643         for (i = 0; i < ARRAY_SIZE(parse_tests); i++) {
644                 struct test_bitmap_parselist test = parse_tests[i];
645                 size_t len = test.flags & NO_LEN ? UINT_MAX : strlen(test.in);
646 
647                 time = ktime_get();
648                 err = bitmap_parse(test.in, len, bmap, test.nbits);
649                 time = ktime_get() - time;
650 
651                 if (err != test.errno) {
652                         pr_err("parse: %d: input is %s, errno is %d, expected %d\n",
653                                         i, test.in, err, test.errno);
654                         failed_tests++;
655                         continue;
656                 }
657 
658                 if (!err && test.expected
659                          && !__bitmap_equal(bmap, test.expected, test.nbits)) {
660                         pr_err("parse: %d: input is %s, result is 0x%lx, expected 0x%lx\n",
661                                         i, test.in, bmap[0],
662                                         *test.expected);
663                         failed_tests++;
664                         continue;
665                 }
666 
667                 if (test.flags & PARSE_TIME)
668                         pr_info("parse: %d: input is '%s' OK, Time: %llu\n",
669                                         i, test.in, time);
670         }
671 }
672 
673 static void __init test_bitmap_arr32(void)
674 {
675         unsigned int nbits, next_bit;
676         u32 arr[EXP1_IN_BITS / 32];
677         DECLARE_BITMAP(bmap2, EXP1_IN_BITS);
678 
679         memset(arr, 0xa5, sizeof(arr));
680 
681         for (nbits = 0; nbits < EXP1_IN_BITS; ++nbits) {
682                 bitmap_to_arr32(arr, exp1, nbits);
683                 bitmap_from_arr32(bmap2, arr, nbits);
684                 expect_eq_bitmap(bmap2, exp1, nbits);
685 
686                 next_bit = find_next_bit(bmap2,
687                                 round_up(nbits, BITS_PER_LONG), nbits);
688                 if (next_bit < round_up(nbits, BITS_PER_LONG)) {
689                         pr_err("bitmap_copy_arr32(nbits == %d:"
690                                 " tail is not safely cleared: %d\n",
691                                 nbits, next_bit);
692                         failed_tests++;
693                 }
694 
695                 if (nbits < EXP1_IN_BITS - 32)
696                         expect_eq_uint(arr[DIV_ROUND_UP(nbits, 32)],
697                                                                 0xa5a5a5a5);
698         }
699 }
700 
701 static void __init test_bitmap_arr64(void)
702 {
703         unsigned int nbits, next_bit;
704         u64 arr[EXP1_IN_BITS / 64];
705         DECLARE_BITMAP(bmap2, EXP1_IN_BITS);
706 
707         memset(arr, 0xa5, sizeof(arr));
708 
709         for (nbits = 0; nbits < EXP1_IN_BITS; ++nbits) {
710                 memset(bmap2, 0xff, sizeof(arr));
711                 bitmap_to_arr64(arr, exp1, nbits);
712                 bitmap_from_arr64(bmap2, arr, nbits);
713                 expect_eq_bitmap(bmap2, exp1, nbits);
714 
715                 next_bit = find_next_bit(bmap2, round_up(nbits, BITS_PER_LONG), nbits);
716                 if (next_bit < round_up(nbits, BITS_PER_LONG)) {
717                         pr_err("bitmap_copy_arr64(nbits == %d:"
718                                 " tail is not safely cleared: %d\n", nbits, next_bit);
719                         failed_tests++;
720                 }
721 
722                 if ((nbits % 64) &&
723                     (arr[(nbits - 1) / 64] & ~GENMASK_ULL((nbits - 1) % 64, 0))) {
724                         pr_err("bitmap_to_arr64(nbits == %d): tail is not safely cleared: 0x%016llx (must be 0x%016llx)\n",
725                                nbits, arr[(nbits - 1) / 64],
726                                GENMASK_ULL((nbits - 1) % 64, 0));
727                         failed_tests++;
728                 }
729 
730                 if (nbits < EXP1_IN_BITS - 64)
731                         expect_eq_uint(arr[DIV_ROUND_UP(nbits, 64)], 0xa5a5a5a5);
732         }
733 }
734 
735 static void noinline __init test_mem_optimisations(void)
736 {
737         DECLARE_BITMAP(bmap1, 1024);
738         DECLARE_BITMAP(bmap2, 1024);
739         unsigned int start, nbits;
740 
741         for (start = 0; start < 1024; start += 8) {
742                 for (nbits = 0; nbits < 1024 - start; nbits += 8) {
743                         memset(bmap1, 0x5a, sizeof(bmap1));
744                         memset(bmap2, 0x5a, sizeof(bmap2));
745 
746                         bitmap_set(bmap1, start, nbits);
747                         __bitmap_set(bmap2, start, nbits);
748                         if (!bitmap_equal(bmap1, bmap2, 1024)) {
749                                 printk("set not equal %d %d\n", start, nbits);
750                                 failed_tests++;
751                         }
752                         if (!__bitmap_equal(bmap1, bmap2, 1024)) {
753                                 printk("set not __equal %d %d\n", start, nbits);
754                                 failed_tests++;
755                         }
756 
757                         bitmap_clear(bmap1, start, nbits);
758                         __bitmap_clear(bmap2, start, nbits);
759                         if (!bitmap_equal(bmap1, bmap2, 1024)) {
760                                 printk("clear not equal %d %d\n", start, nbits);
761                                 failed_tests++;
762                         }
763                         if (!__bitmap_equal(bmap1, bmap2, 1024)) {
764                                 printk("clear not __equal %d %d\n", start,
765                                                                         nbits);
766                                 failed_tests++;
767                         }
768                 }
769         }
770 }
771 
772 static const unsigned char clump_exp[] __initconst = {
773         0x01,   /* 1 bit set */
774         0x02,   /* non-edge 1 bit set */
775         0x00,   /* zero bits set */
776         0x38,   /* 3 bits set across 4-bit boundary */
777         0x38,   /* Repeated clump */
778         0x0F,   /* 4 bits set */
779         0xFF,   /* all bits set */
780         0x05,   /* non-adjacent 2 bits set */
781 };
782 
783 static void __init test_for_each_set_clump8(void)
784 {
785 #define CLUMP_EXP_NUMBITS 64
786         DECLARE_BITMAP(bits, CLUMP_EXP_NUMBITS);
787         unsigned int start;
788         unsigned long clump;
789 
790         /* set bitmap to test case */
791         bitmap_zero(bits, CLUMP_EXP_NUMBITS);
792         bitmap_set(bits, 0, 1);         /* 0x01 */
793         bitmap_set(bits, 9, 1);         /* 0x02 */
794         bitmap_set(bits, 27, 3);        /* 0x28 */
795         bitmap_set(bits, 35, 3);        /* 0x28 */
796         bitmap_set(bits, 40, 4);        /* 0x0F */
797         bitmap_set(bits, 48, 8);        /* 0xFF */
798         bitmap_set(bits, 56, 1);        /* 0x05 - part 1 */
799         bitmap_set(bits, 58, 1);        /* 0x05 - part 2 */
800 
801         for_each_set_clump8(start, clump, bits, CLUMP_EXP_NUMBITS)
802                 expect_eq_clump8(start, CLUMP_EXP_NUMBITS, clump_exp, &clump);
803 }
804 
805 static void __init test_for_each_set_bit_wrap(void)
806 {
807         DECLARE_BITMAP(orig, 500);
808         DECLARE_BITMAP(copy, 500);
809         unsigned int wr, bit;
810 
811         bitmap_zero(orig, 500);
812 
813         /* Set individual bits */
814         for (bit = 0; bit < 500; bit += 10)
815                 bitmap_set(orig, bit, 1);
816 
817         /* Set range of bits */
818         bitmap_set(orig, 100, 50);
819 
820         for (wr = 0; wr < 500; wr++) {
821                 bitmap_zero(copy, 500);
822 
823                 for_each_set_bit_wrap(bit, orig, 500, wr)
824                         bitmap_set(copy, bit, 1);
825 
826                 expect_eq_bitmap(orig, copy, 500);
827         }
828 }
829 
830 static void __init test_for_each_set_bit(void)
831 {
832         DECLARE_BITMAP(orig, 500);
833         DECLARE_BITMAP(copy, 500);
834         unsigned int bit;
835 
836         bitmap_zero(orig, 500);
837         bitmap_zero(copy, 500);
838 
839         /* Set individual bits */
840         for (bit = 0; bit < 500; bit += 10)
841                 bitmap_set(orig, bit, 1);
842 
843         /* Set range of bits */
844         bitmap_set(orig, 100, 50);
845 
846         for_each_set_bit(bit, orig, 500)
847                 bitmap_set(copy, bit, 1);
848 
849         expect_eq_bitmap(orig, copy, 500);
850 }
851 
852 static void __init test_for_each_set_bit_from(void)
853 {
854         DECLARE_BITMAP(orig, 500);
855         DECLARE_BITMAP(copy, 500);
856         unsigned int wr, bit;
857 
858         bitmap_zero(orig, 500);
859 
860         /* Set individual bits */
861         for (bit = 0; bit < 500; bit += 10)
862                 bitmap_set(orig, bit, 1);
863 
864         /* Set range of bits */
865         bitmap_set(orig, 100, 50);
866 
867         for (wr = 0; wr < 500; wr++) {
868                 DECLARE_BITMAP(tmp, 500);
869 
870                 bitmap_zero(copy, 500);
871                 bit = wr;
872 
873                 for_each_set_bit_from(bit, orig, 500)
874                         bitmap_set(copy, bit, 1);
875 
876                 bitmap_copy(tmp, orig, 500);
877                 bitmap_clear(tmp, 0, wr);
878                 expect_eq_bitmap(tmp, copy, 500);
879         }
880 }
881 
882 static void __init test_for_each_clear_bit(void)
883 {
884         DECLARE_BITMAP(orig, 500);
885         DECLARE_BITMAP(copy, 500);
886         unsigned int bit;
887 
888         bitmap_fill(orig, 500);
889         bitmap_fill(copy, 500);
890 
891         /* Set individual bits */
892         for (bit = 0; bit < 500; bit += 10)
893                 bitmap_clear(orig, bit, 1);
894 
895         /* Set range of bits */
896         bitmap_clear(orig, 100, 50);
897 
898         for_each_clear_bit(bit, orig, 500)
899                 bitmap_clear(copy, bit, 1);
900 
901         expect_eq_bitmap(orig, copy, 500);
902 }
903 
904 static void __init test_for_each_clear_bit_from(void)
905 {
906         DECLARE_BITMAP(orig, 500);
907         DECLARE_BITMAP(copy, 500);
908         unsigned int wr, bit;
909 
910         bitmap_fill(orig, 500);
911 
912         /* Set individual bits */
913         for (bit = 0; bit < 500; bit += 10)
914                 bitmap_clear(orig, bit, 1);
915 
916         /* Set range of bits */
917         bitmap_clear(orig, 100, 50);
918 
919         for (wr = 0; wr < 500; wr++) {
920                 DECLARE_BITMAP(tmp, 500);
921 
922                 bitmap_fill(copy, 500);
923                 bit = wr;
924 
925                 for_each_clear_bit_from(bit, orig, 500)
926                         bitmap_clear(copy, bit, 1);
927 
928                 bitmap_copy(tmp, orig, 500);
929                 bitmap_set(tmp, 0, wr);
930                 expect_eq_bitmap(tmp, copy, 500);
931         }
932 }
933 
934 static void __init test_for_each_set_bitrange(void)
935 {
936         DECLARE_BITMAP(orig, 500);
937         DECLARE_BITMAP(copy, 500);
938         unsigned int s, e;
939 
940         bitmap_zero(orig, 500);
941         bitmap_zero(copy, 500);
942 
943         /* Set individual bits */
944         for (s = 0; s < 500; s += 10)
945                 bitmap_set(orig, s, 1);
946 
947         /* Set range of bits */
948         bitmap_set(orig, 100, 50);
949 
950         for_each_set_bitrange(s, e, orig, 500)
951                 bitmap_set(copy, s, e-s);
952 
953         expect_eq_bitmap(orig, copy, 500);
954 }
955 
956 static void __init test_for_each_clear_bitrange(void)
957 {
958         DECLARE_BITMAP(orig, 500);
959         DECLARE_BITMAP(copy, 500);
960         unsigned int s, e;
961 
962         bitmap_fill(orig, 500);
963         bitmap_fill(copy, 500);
964 
965         /* Set individual bits */
966         for (s = 0; s < 500; s += 10)
967                 bitmap_clear(orig, s, 1);
968 
969         /* Set range of bits */
970         bitmap_clear(orig, 100, 50);
971 
972         for_each_clear_bitrange(s, e, orig, 500)
973                 bitmap_clear(copy, s, e-s);
974 
975         expect_eq_bitmap(orig, copy, 500);
976 }
977 
978 static void __init test_for_each_set_bitrange_from(void)
979 {
980         DECLARE_BITMAP(orig, 500);
981         DECLARE_BITMAP(copy, 500);
982         unsigned int wr, s, e;
983 
984         bitmap_zero(orig, 500);
985 
986         /* Set individual bits */
987         for (s = 0; s < 500; s += 10)
988                 bitmap_set(orig, s, 1);
989 
990         /* Set range of bits */
991         bitmap_set(orig, 100, 50);
992 
993         for (wr = 0; wr < 500; wr++) {
994                 DECLARE_BITMAP(tmp, 500);
995 
996                 bitmap_zero(copy, 500);
997                 s = wr;
998 
999                 for_each_set_bitrange_from(s, e, orig, 500)
1000                         bitmap_set(copy, s, e - s);
1001 
1002                 bitmap_copy(tmp, orig, 500);
1003                 bitmap_clear(tmp, 0, wr);
1004                 expect_eq_bitmap(tmp, copy, 500);
1005         }
1006 }
1007 
1008 static void __init test_for_each_clear_bitrange_from(void)
1009 {
1010         DECLARE_BITMAP(orig, 500);
1011         DECLARE_BITMAP(copy, 500);
1012         unsigned int wr, s, e;
1013 
1014         bitmap_fill(orig, 500);
1015 
1016         /* Set individual bits */
1017         for (s = 0; s < 500; s += 10)
1018                 bitmap_clear(orig, s, 1);
1019 
1020         /* Set range of bits */
1021         bitmap_set(orig, 100, 50);
1022 
1023         for (wr = 0; wr < 500; wr++) {
1024                 DECLARE_BITMAP(tmp, 500);
1025 
1026                 bitmap_fill(copy, 500);
1027                 s = wr;
1028 
1029                 for_each_clear_bitrange_from(s, e, orig, 500)
1030                         bitmap_clear(copy, s, e - s);
1031 
1032                 bitmap_copy(tmp, orig, 500);
1033                 bitmap_set(tmp, 0, wr);
1034                 expect_eq_bitmap(tmp, copy, 500);
1035         }
1036 }
1037 
1038 struct test_bitmap_cut {
1039         unsigned int first;
1040         unsigned int cut;
1041         unsigned int nbits;
1042         unsigned long in[4];
1043         unsigned long expected[4];
1044 };
1045 
1046 static struct test_bitmap_cut test_cut[] = {
1047         {  0,  0,  8, { 0x0000000aUL, }, { 0x0000000aUL, }, },
1048         {  0,  0, 32, { 0xdadadeadUL, }, { 0xdadadeadUL, }, },
1049         {  0,  3,  8, { 0x000000aaUL, }, { 0x00000015UL, }, },
1050         {  3,  3,  8, { 0x000000aaUL, }, { 0x00000012UL, }, },
1051         {  0,  1, 32, { 0xa5a5a5a5UL, }, { 0x52d2d2d2UL, }, },
1052         {  0,  8, 32, { 0xdeadc0deUL, }, { 0x00deadc0UL, }, },
1053         {  1,  1, 32, { 0x5a5a5a5aUL, }, { 0x2d2d2d2cUL, }, },
1054         {  0, 15, 32, { 0xa5a5a5a5UL, }, { 0x00014b4bUL, }, },
1055         {  0, 16, 32, { 0xa5a5a5a5UL, }, { 0x0000a5a5UL, }, },
1056         { 15, 15, 32, { 0xa5a5a5a5UL, }, { 0x000125a5UL, }, },
1057         { 15, 16, 32, { 0xa5a5a5a5UL, }, { 0x0000a5a5UL, }, },
1058         { 16, 15, 32, { 0xa5a5a5a5UL, }, { 0x0001a5a5UL, }, },
1059 
1060         { BITS_PER_LONG, BITS_PER_LONG, BITS_PER_LONG,
1061                 { 0xa5a5a5a5UL, 0xa5a5a5a5UL, },
1062                 { 0xa5a5a5a5UL, 0xa5a5a5a5UL, },
1063         },
1064         { 1, BITS_PER_LONG - 1, BITS_PER_LONG,
1065                 { 0xa5a5a5a5UL, 0xa5a5a5a5UL, },
1066                 { 0x00000001UL, 0x00000001UL, },
1067         },
1068 
1069         { 0, BITS_PER_LONG * 2, BITS_PER_LONG * 2 + 1,
1070                 { 0xa5a5a5a5UL, 0x00000001UL, 0x00000001UL, 0x00000001UL },
1071                 { 0x00000001UL, },
1072         },
1073         { 16, BITS_PER_LONG * 2 + 1, BITS_PER_LONG * 2 + 1 + 16,
1074                 { 0x0000ffffUL, 0x5a5a5a5aUL, 0x5a5a5a5aUL, 0x5a5a5a5aUL },
1075                 { 0x2d2dffffUL, },
1076         },
1077 };
1078 
1079 static void __init test_bitmap_cut(void)
1080 {
1081         unsigned long b[5], *in = &b[1], *out = &b[0];  /* Partial overlap */
1082         int i;
1083 
1084         for (i = 0; i < ARRAY_SIZE(test_cut); i++) {
1085                 struct test_bitmap_cut *t = &test_cut[i];
1086 
1087                 memcpy(in, t->in, sizeof(t->in));
1088 
1089                 bitmap_cut(out, in, t->first, t->cut, t->nbits);
1090 
1091                 expect_eq_bitmap(t->expected, out, t->nbits);
1092         }
1093 }
1094 
1095 struct test_bitmap_print {
1096         const unsigned long *bitmap;
1097         unsigned long nbits;
1098         const char *mask;
1099         const char *list;
1100 };
1101 
1102 static const unsigned long small_bitmap[] __initconst = {
1103         BITMAP_FROM_U64(0x3333333311111111ULL),
1104 };
1105 
1106 static const char small_mask[] __initconst = "33333333,11111111\n";
1107 static const char small_list[] __initconst = "0,4,8,12,16,20,24,28,32-33,36-37,40-41,44-45,48-49,52-53,56-57,60-61\n";
1108 
1109 static const unsigned long large_bitmap[] __initconst = {
1110         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1111         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1112         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1113         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1114         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1115         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1116         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1117         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1118         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1119         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1120         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1121         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1122         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1123         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1124         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1125         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1126         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1127         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1128         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1129         BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1130 };
1131 
1132 static const char large_mask[] __initconst = "33333333,11111111,33333333,11111111,"
1133                                         "33333333,11111111,33333333,11111111,"
1134                                         "33333333,11111111,33333333,11111111,"
1135                                         "33333333,11111111,33333333,11111111,"
1136                                         "33333333,11111111,33333333,11111111,"
1137                                         "33333333,11111111,33333333,11111111,"
1138                                         "33333333,11111111,33333333,11111111,"
1139                                         "33333333,11111111,33333333,11111111,"
1140                                         "33333333,11111111,33333333,11111111,"
1141                                         "33333333,11111111,33333333,11111111,"
1142                                         "33333333,11111111,33333333,11111111,"
1143                                         "33333333,11111111,33333333,11111111,"
1144                                         "33333333,11111111,33333333,11111111,"
1145                                         "33333333,11111111,33333333,11111111,"
1146                                         "33333333,11111111,33333333,11111111,"
1147                                         "33333333,11111111,33333333,11111111,"
1148                                         "33333333,11111111,33333333,11111111,"
1149                                         "33333333,11111111,33333333,11111111,"
1150                                         "33333333,11111111,33333333,11111111,"
1151                                         "33333333,11111111,33333333,11111111\n";
1152 
1153 static const char large_list[] __initconst = /* more than 4KB */
1154         "0,4,8,12,16,20,24,28,32-33,36-37,40-41,44-45,48-49,52-53,56-57,60-61,64,68,72,76,80,84,88,92,96-97,100-101,104-1"
1155         "05,108-109,112-113,116-117,120-121,124-125,128,132,136,140,144,148,152,156,160-161,164-165,168-169,172-173,176-1"
1156         "77,180-181,184-185,188-189,192,196,200,204,208,212,216,220,224-225,228-229,232-233,236-237,240-241,244-245,248-2"
1157         "49,252-253,256,260,264,268,272,276,280,284,288-289,292-293,296-297,300-301,304-305,308-309,312-313,316-317,320,3"
1158         "24,328,332,336,340,344,348,352-353,356-357,360-361,364-365,368-369,372-373,376-377,380-381,384,388,392,396,400,4"
1159         "04,408,412,416-417,420-421,424-425,428-429,432-433,436-437,440-441,444-445,448,452,456,460,464,468,472,476,480-4"
1160         "81,484-485,488-489,492-493,496-497,500-501,504-505,508-509,512,516,520,524,528,532,536,540,544-545,548-549,552-5"
1161         "53,556-557,560-561,564-565,568-569,572-573,576,580,584,588,592,596,600,604,608-609,612-613,616-617,620-621,624-6"
1162         "25,628-629,632-633,636-637,640,644,648,652,656,660,664,668,672-673,676-677,680-681,684-685,688-689,692-693,696-6"
1163         "97,700-701,704,708,712,716,720,724,728,732,736-737,740-741,744-745,748-749,752-753,756-757,760-761,764-765,768,7"
1164         "72,776,780,784,788,792,796,800-801,804-805,808-809,812-813,816-817,820-821,824-825,828-829,832,836,840,844,848,8"
1165         "52,856,860,864-865,868-869,872-873,876-877,880-881,884-885,888-889,892-893,896,900,904,908,912,916,920,924,928-9"
1166         "29,932-933,936-937,940-941,944-945,948-949,952-953,956-957,960,964,968,972,976,980,984,988,992-993,996-997,1000-"
1167         "1001,1004-1005,1008-1009,1012-1013,1016-1017,1020-1021,1024,1028,1032,1036,1040,1044,1048,1052,1056-1057,1060-10"
1168         "61,1064-1065,1068-1069,1072-1073,1076-1077,1080-1081,1084-1085,1088,1092,1096,1100,1104,1108,1112,1116,1120-1121"
1169         ",1124-1125,1128-1129,1132-1133,1136-1137,1140-1141,1144-1145,1148-1149,1152,1156,1160,1164,1168,1172,1176,1180,1"
1170         "184-1185,1188-1189,1192-1193,1196-1197,1200-1201,1204-1205,1208-1209,1212-1213,1216,1220,1224,1228,1232,1236,124"
1171         "0,1244,1248-1249,1252-1253,1256-1257,1260-1261,1264-1265,1268-1269,1272-1273,1276-1277,1280,1284,1288,1292,1296,"
1172         "1300,1304,1308,1312-1313,1316-1317,1320-1321,1324-1325,1328-1329,1332-1333,1336-1337,1340-1341,1344,1348,1352,13"
1173         "56,1360,1364,1368,1372,1376-1377,1380-1381,1384-1385,1388-1389,1392-1393,1396-1397,1400-1401,1404-1405,1408,1412"
1174         ",1416,1420,1424,1428,1432,1436,1440-1441,1444-1445,1448-1449,1452-1453,1456-1457,1460-1461,1464-1465,1468-1469,1"
1175         "472,1476,1480,1484,1488,1492,1496,1500,1504-1505,1508-1509,1512-1513,1516-1517,1520-1521,1524-1525,1528-1529,153"
1176         "2-1533,1536,1540,1544,1548,1552,1556,1560,1564,1568-1569,1572-1573,1576-1577,1580-1581,1584-1585,1588-1589,1592-"
1177         "1593,1596-1597,1600,1604,1608,1612,1616,1620,1624,1628,1632-1633,1636-1637,1640-1641,1644-1645,1648-1649,1652-16"
1178         "53,1656-1657,1660-1661,1664,1668,1672,1676,1680,1684,1688,1692,1696-1697,1700-1701,1704-1705,1708-1709,1712-1713"
1179         ",1716-1717,1720-1721,1724-1725,1728,1732,1736,1740,1744,1748,1752,1756,1760-1761,1764-1765,1768-1769,1772-1773,1"
1180         "776-1777,1780-1781,1784-1785,1788-1789,1792,1796,1800,1804,1808,1812,1816,1820,1824-1825,1828-1829,1832-1833,183"
1181         "6-1837,1840-1841,1844-1845,1848-1849,1852-1853,1856,1860,1864,1868,1872,1876,1880,1884,1888-1889,1892-1893,1896-"
1182         "1897,1900-1901,1904-1905,1908-1909,1912-1913,1916-1917,1920,1924,1928,1932,1936,1940,1944,1948,1952-1953,1956-19"
1183         "57,1960-1961,1964-1965,1968-1969,1972-1973,1976-1977,1980-1981,1984,1988,1992,1996,2000,2004,2008,2012,2016-2017"
1184         ",2020-2021,2024-2025,2028-2029,2032-2033,2036-2037,2040-2041,2044-2045,2048,2052,2056,2060,2064,2068,2072,2076,2"
1185         "080-2081,2084-2085,2088-2089,2092-2093,2096-2097,2100-2101,2104-2105,2108-2109,2112,2116,2120,2124,2128,2132,213"
1186         "6,2140,2144-2145,2148-2149,2152-2153,2156-2157,2160-2161,2164-2165,2168-2169,2172-2173,2176,2180,2184,2188,2192,"
1187         "2196,2200,2204,2208-2209,2212-2213,2216-2217,2220-2221,2224-2225,2228-2229,2232-2233,2236-2237,2240,2244,2248,22"
1188         "52,2256,2260,2264,2268,2272-2273,2276-2277,2280-2281,2284-2285,2288-2289,2292-2293,2296-2297,2300-2301,2304,2308"
1189         ",2312,2316,2320,2324,2328,2332,2336-2337,2340-2341,2344-2345,2348-2349,2352-2353,2356-2357,2360-2361,2364-2365,2"
1190         "368,2372,2376,2380,2384,2388,2392,2396,2400-2401,2404-2405,2408-2409,2412-2413,2416-2417,2420-2421,2424-2425,242"
1191         "8-2429,2432,2436,2440,2444,2448,2452,2456,2460,2464-2465,2468-2469,2472-2473,2476-2477,2480-2481,2484-2485,2488-"
1192         "2489,2492-2493,2496,2500,2504,2508,2512,2516,2520,2524,2528-2529,2532-2533,2536-2537,2540-2541,2544-2545,2548-25"
1193         "49,2552-2553,2556-2557\n";
1194 
1195 static const struct test_bitmap_print test_print[] __initconst = {
1196         { small_bitmap, sizeof(small_bitmap) * BITS_PER_BYTE, small_mask, small_list },
1197         { large_bitmap, sizeof(large_bitmap) * BITS_PER_BYTE, large_mask, large_list },
1198 };
1199 
1200 static void __init test_bitmap_print_buf(void)
1201 {
1202         int i;
1203 
1204         for (i = 0; i < ARRAY_SIZE(test_print); i++) {
1205                 const struct test_bitmap_print *t = &test_print[i];
1206                 int n;
1207 
1208                 n = bitmap_print_bitmask_to_buf(print_buf, t->bitmap, t->nbits,
1209                                                 0, 2 * PAGE_SIZE);
1210                 expect_eq_uint(strlen(t->mask) + 1, n);
1211                 expect_eq_str(t->mask, print_buf, n);
1212 
1213                 n = bitmap_print_list_to_buf(print_buf, t->bitmap, t->nbits,
1214                                              0, 2 * PAGE_SIZE);
1215                 expect_eq_uint(strlen(t->list) + 1, n);
1216                 expect_eq_str(t->list, print_buf, n);
1217 
1218                 /* test by non-zero offset */
1219                 if (strlen(t->list) > PAGE_SIZE) {
1220                         n = bitmap_print_list_to_buf(print_buf, t->bitmap, t->nbits,
1221                                                      PAGE_SIZE, PAGE_SIZE);
1222                         expect_eq_uint(strlen(t->list) + 1 - PAGE_SIZE, n);
1223                         expect_eq_str(t->list + PAGE_SIZE, print_buf, n);
1224                 }
1225         }
1226 }
1227 
1228 /*
1229  * FIXME: Clang breaks compile-time evaluations when KASAN and GCOV are enabled.
1230  * To workaround it, GCOV is force-disabled in Makefile for this configuration.
1231  */
1232 static void __init test_bitmap_const_eval(void)
1233 {
1234         DECLARE_BITMAP(bitmap, BITS_PER_LONG);
1235         unsigned long initvar = BIT(2);
1236         unsigned long bitopvar = 0;
1237         unsigned long var = 0;
1238         int res;
1239 
1240         /*
1241          * Compilers must be able to optimize all of those to compile-time
1242          * constants on any supported optimization level (-O2, -Os) and any
1243          * architecture. Otherwise, trigger a build bug.
1244          * The whole function gets optimized out then, there's nothing to do
1245          * in runtime.
1246          */
1247 
1248         /* Equals to `unsigned long bitmap[1] = { GENMASK(6, 5), }` */
1249         bitmap_clear(bitmap, 0, BITS_PER_LONG);
1250         if (!test_bit(7, bitmap))
1251                 bitmap_set(bitmap, 5, 2);
1252 
1253         /* Equals to `unsigned long bitopvar = BIT(20)` */
1254         __change_bit(31, &bitopvar);
1255         bitmap_shift_right(&bitopvar, &bitopvar, 11, BITS_PER_LONG);
1256 
1257         /* Equals to `unsigned long var = BIT(25)` */
1258         var |= BIT(25);
1259         if (var & BIT(0))
1260                 var ^= GENMASK(9, 6);
1261 
1262         /* __const_hweight<32|64>(GENMASK(6, 5)) == 2 */
1263         res = bitmap_weight(bitmap, 20);
1264         BUILD_BUG_ON(!__builtin_constant_p(res));
1265         BUILD_BUG_ON(res != 2);
1266 
1267         /* !(BIT(31) & BIT(18)) == 1 */
1268         res = !test_bit(18, &bitopvar);
1269         BUILD_BUG_ON(!__builtin_constant_p(res));
1270         BUILD_BUG_ON(!res);
1271 
1272         /* BIT(2) & GENMASK(14, 8) == 0 */
1273         res = initvar & GENMASK(14, 8);
1274         BUILD_BUG_ON(!__builtin_constant_p(res));
1275         BUILD_BUG_ON(res);
1276 
1277         /* ~BIT(25) */
1278         BUILD_BUG_ON(!__builtin_constant_p(~var));
1279         BUILD_BUG_ON(~var != ~BIT(25));
1280 
1281         /* ~BIT(25) | BIT(25) == ~0UL */
1282         bitmap_complement(&var, &var, BITS_PER_LONG);
1283         __assign_bit(25, &var, true);
1284 
1285         /* !(~(~0UL)) == 1 */
1286         res = bitmap_full(&var, BITS_PER_LONG);
1287         BUILD_BUG_ON(!__builtin_constant_p(res));
1288         BUILD_BUG_ON(!res);
1289 }
1290 
1291 /*
1292  * Test bitmap should be big enough to include the cases when start is not in
1293  * the first word, and start+nbits lands in the following word.
1294  */
1295 #define TEST_BIT_LEN (1000)
1296 
1297 /*
1298  * Helper function to test bitmap_write() overwriting the chosen byte pattern.
1299  */
1300 static void __init test_bitmap_write_helper(const char *pattern)
1301 {
1302         DECLARE_BITMAP(bitmap, TEST_BIT_LEN);
1303         DECLARE_BITMAP(exp_bitmap, TEST_BIT_LEN);
1304         DECLARE_BITMAP(pat_bitmap, TEST_BIT_LEN);
1305         unsigned long w, r, bit;
1306         int i, n, nbits;
1307 
1308         /*
1309          * Only parse the pattern once and store the result in the intermediate
1310          * bitmap.
1311          */
1312         bitmap_parselist(pattern, pat_bitmap, TEST_BIT_LEN);
1313 
1314         /*
1315          * Check that writing a single bit does not accidentally touch the
1316          * adjacent bits.
1317          */
1318         for (i = 0; i < TEST_BIT_LEN; i++) {
1319                 bitmap_copy(bitmap, pat_bitmap, TEST_BIT_LEN);
1320                 bitmap_copy(exp_bitmap, pat_bitmap, TEST_BIT_LEN);
1321                 for (bit = 0; bit <= 1; bit++) {
1322                         bitmap_write(bitmap, bit, i, 1);
1323                         __assign_bit(i, exp_bitmap, bit);
1324                         expect_eq_bitmap(exp_bitmap, bitmap,
1325                                          TEST_BIT_LEN);
1326                 }
1327         }
1328 
1329         /* Ensure writing 0 bits does not change anything. */
1330         bitmap_copy(bitmap, pat_bitmap, TEST_BIT_LEN);
1331         bitmap_copy(exp_bitmap, pat_bitmap, TEST_BIT_LEN);
1332         for (i = 0; i < TEST_BIT_LEN; i++) {
1333                 bitmap_write(bitmap, ~0UL, i, 0);
1334                 expect_eq_bitmap(exp_bitmap, bitmap, TEST_BIT_LEN);
1335         }
1336 
1337         for (nbits = BITS_PER_LONG; nbits >= 1; nbits--) {
1338                 w = IS_ENABLED(CONFIG_64BIT) ? 0xdeadbeefdeadbeefUL
1339                                              : 0xdeadbeefUL;
1340                 w >>= (BITS_PER_LONG - nbits);
1341                 for (i = 0; i <= TEST_BIT_LEN - nbits; i++) {
1342                         bitmap_copy(bitmap, pat_bitmap, TEST_BIT_LEN);
1343                         bitmap_copy(exp_bitmap, pat_bitmap, TEST_BIT_LEN);
1344                         for (n = 0; n < nbits; n++)
1345                                 __assign_bit(i + n, exp_bitmap, w & BIT(n));
1346                         bitmap_write(bitmap, w, i, nbits);
1347                         expect_eq_bitmap(exp_bitmap, bitmap, TEST_BIT_LEN);
1348                         r = bitmap_read(bitmap, i, nbits);
1349                         expect_eq_ulong(r, w);
1350                 }
1351         }
1352 }
1353 
1354 static void __init test_bitmap_read_write(void)
1355 {
1356         unsigned char *pattern[3] = {"", "all:1/2", "all"};
1357         DECLARE_BITMAP(bitmap, TEST_BIT_LEN);
1358         unsigned long zero_bits = 0, bits_per_long = BITS_PER_LONG;
1359         unsigned long val;
1360         int i, pi;
1361 
1362         /*
1363          * Reading/writing zero bits should not crash the kernel.
1364          * READ_ONCE() prevents constant folding.
1365          */
1366         bitmap_write(NULL, 0, 0, READ_ONCE(zero_bits));
1367         /* Return value of bitmap_read() is undefined here. */
1368         bitmap_read(NULL, 0, READ_ONCE(zero_bits));
1369 
1370         /*
1371          * Reading/writing more than BITS_PER_LONG bits should not crash the
1372          * kernel. READ_ONCE() prevents constant folding.
1373          */
1374         bitmap_write(NULL, 0, 0, READ_ONCE(bits_per_long) + 1);
1375         /* Return value of bitmap_read() is undefined here. */
1376         bitmap_read(NULL, 0, READ_ONCE(bits_per_long) + 1);
1377 
1378         /*
1379          * Ensure that bitmap_read() reads the same value that was previously
1380          * written, and two consequent values are correctly merged.
1381          * The resulting bit pattern is asymmetric to rule out possible issues
1382          * with bit numeration order.
1383          */
1384         for (i = 0; i < TEST_BIT_LEN - 7; i++) {
1385                 bitmap_zero(bitmap, TEST_BIT_LEN);
1386 
1387                 bitmap_write(bitmap, 0b10101UL, i, 5);
1388                 val = bitmap_read(bitmap, i, 5);
1389                 expect_eq_ulong(0b10101UL, val);
1390 
1391                 bitmap_write(bitmap, 0b101UL, i + 5, 3);
1392                 val = bitmap_read(bitmap, i + 5, 3);
1393                 expect_eq_ulong(0b101UL, val);
1394 
1395                 val = bitmap_read(bitmap, i, 8);
1396                 expect_eq_ulong(0b10110101UL, val);
1397         }
1398 
1399         for (pi = 0; pi < ARRAY_SIZE(pattern); pi++)
1400                 test_bitmap_write_helper(pattern[pi]);
1401 }
1402 
1403 static void __init test_bitmap_read_perf(void)
1404 {
1405         DECLARE_BITMAP(bitmap, TEST_BIT_LEN);
1406         unsigned int cnt, nbits, i;
1407         unsigned long val;
1408         ktime_t time;
1409 
1410         bitmap_fill(bitmap, TEST_BIT_LEN);
1411         time = ktime_get();
1412         for (cnt = 0; cnt < 5; cnt++) {
1413                 for (nbits = 1; nbits <= BITS_PER_LONG; nbits++) {
1414                         for (i = 0; i < TEST_BIT_LEN; i++) {
1415                                 if (i + nbits > TEST_BIT_LEN)
1416                                         break;
1417                                 /*
1418                                  * Prevent the compiler from optimizing away the
1419                                  * bitmap_read() by using its value.
1420                                  */
1421                                 WRITE_ONCE(val, bitmap_read(bitmap, i, nbits));
1422                         }
1423                 }
1424         }
1425         time = ktime_get() - time;
1426         pr_info("Time spent in %s:\t%llu\n", __func__, time);
1427 }
1428 
1429 static void __init test_bitmap_write_perf(void)
1430 {
1431         DECLARE_BITMAP(bitmap, TEST_BIT_LEN);
1432         unsigned int cnt, nbits, i;
1433         unsigned long val = 0xfeedface;
1434         ktime_t time;
1435 
1436         bitmap_zero(bitmap, TEST_BIT_LEN);
1437         time = ktime_get();
1438         for (cnt = 0; cnt < 5; cnt++) {
1439                 for (nbits = 1; nbits <= BITS_PER_LONG; nbits++) {
1440                         for (i = 0; i < TEST_BIT_LEN; i++) {
1441                                 if (i + nbits > TEST_BIT_LEN)
1442                                         break;
1443                                 bitmap_write(bitmap, val, i, nbits);
1444                         }
1445                 }
1446         }
1447         time = ktime_get() - time;
1448         pr_info("Time spent in %s:\t%llu\n", __func__, time);
1449 }
1450 
1451 #undef TEST_BIT_LEN
1452 
1453 static void __init selftest(void)
1454 {
1455         test_zero_clear();
1456         test_fill_set();
1457         test_copy();
1458         test_bitmap_region();
1459         test_replace();
1460         test_bitmap_sg();
1461         test_bitmap_arr32();
1462         test_bitmap_arr64();
1463         test_bitmap_parse();
1464         test_bitmap_parselist();
1465         test_bitmap_printlist();
1466         test_mem_optimisations();
1467         test_bitmap_cut();
1468         test_bitmap_print_buf();
1469         test_bitmap_const_eval();
1470         test_bitmap_read_write();
1471         test_bitmap_read_perf();
1472         test_bitmap_write_perf();
1473 
1474         test_find_nth_bit();
1475         test_for_each_set_bit();
1476         test_for_each_set_bit_from();
1477         test_for_each_clear_bit();
1478         test_for_each_clear_bit_from();
1479         test_for_each_set_bitrange();
1480         test_for_each_clear_bitrange();
1481         test_for_each_set_bitrange_from();
1482         test_for_each_clear_bitrange_from();
1483         test_for_each_set_clump8();
1484         test_for_each_set_bit_wrap();
1485 }
1486 
1487 KSTM_MODULE_LOADERS(test_bitmap);
1488 MODULE_AUTHOR("david decotigny <david.decotigny@googlers.com>");
1489 MODULE_DESCRIPTION("Test cases for bitmap API");
1490 MODULE_LICENSE("GPL");
1491 

~ [ 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