Skip to content
Navigation Menu
Toggle navigation
Sign in
In this repository
All GitHub Enterprise
↵
Jump to
↵
No suggested jump to results
In this repository
All GitHub Enterprise
↵
Jump to
↵
In this organization
All GitHub Enterprise
↵
Jump to
↵
In this repository
All GitHub Enterprise
↵
Jump to
↵
Sign in
Reseting focus
You signed in with another tab or window.
Reload
to refresh your session.
You signed out in another tab or window.
Reload
to refresh your session.
You switched accounts on another tab or window.
Reload
to refresh your session.
Dismiss alert
{{ message }}
git-mirror
/
linux
Public
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Issues
0
Pull requests
0
Actions
Projects
0
Security
Insights
Additional navigation options
Code
Issues
Pull requests
Actions
Projects
Security
Insights
Files
master
Documentation
arch
block
certs
crypto
drivers
firmware
fs
include
init
ipc
kernel
lib
842
fonts
lz4
lzo
mpi
raid6
reed_solomon
xz
zlib_deflate
zlib_inflate
.gitignore
Kconfig
Kconfig.debug
Kconfig.kasan
Kconfig.kgdb
Kconfig.kmemcheck
Kconfig.ubsan
Makefile
argv_split.c
asn1_decoder.c
assoc_array.c
atomic64.c
atomic64_test.c
audit.c
bcd.c
bch.c
bitmap.c
bitrev.c
bsearch.c
btree.c
bug.c
build_OID_registry
bust_spinlocks.c
check_signature.c
checksum.c
clz_ctz.c
clz_tab.c
cmdline.c
compat_audit.c
cordic.c
cpu-notifier-error-inject.c
cpu_rmap.c
cpumask.c
crc-ccitt.c
crc-itu-t.c
crc-t10dif.c
crc16.c
crc32.c
crc32defs.h
crc7.c
crc8.c
ctype.c
debug_info.c
debug_locks.c
debugobjects.c
dec_and_lock.c
decompress.c
decompress_bunzip2.c
decompress_inflate.c
decompress_unlz4.c
decompress_unlzma.c
decompress_unlzo.c
decompress_unxz.c
devres.c
digsig.c
div64.c
dma-debug.c
dma-noop.c
dump_stack.c
dynamic_debug.c
dynamic_queue_limits.c
earlycpio.c
extable.c
fault-inject.c
fdt.c
fdt_empty_tree.c
fdt_ro.c
fdt_rw.c
fdt_strerror.c
fdt_sw.c
fdt_wip.c
find_bit.c
flex_array.c
flex_proportions.c
gcd.c
gen_crc32table.c
genalloc.c
glob.c
halfmd4.c
hexdump.c
hweight.c
idr.c
inflate.c
int_sqrt.c
interval_tree.c
interval_tree_test.c
iomap.c
iomap_copy.c
iommu-common.c
iommu-helper.c
ioremap.c
iov_iter.c
irq_poll.c
irq_regs.c
is_single_threaded.c
jedec_ddr_data.c
kasprintf.c
kfifo.c
klist.c
kobject.c
kobject_uevent.c
kstrtox.c
kstrtox.h
lcm.c
libcrc32c.c
list_debug.c
list_sort.c
llist.c
locking-selftest-hardirq.h
locking-selftest-mutex.h
locking-selftest-rlock-hardirq.h
locking-selftest-rlock-softirq.h
locking-selftest-rlock.h
locking-selftest-rsem.h
locking-selftest-softirq.h
locking-selftest-spin-hardirq.h
locking-selftest-spin-softirq.h
locking-selftest-spin.h
locking-selftest-wlock-hardirq.h
locking-selftest-wlock-softirq.h
locking-selftest-wlock.h
locking-selftest-wsem.h
locking-selftest.c
lockref.c
lru_cache.c
md5.c
memory-notifier-error-inject.c
memweight.c
net_utils.c
netdev-notifier-error-inject.c
nlattr.c
nmi_backtrace.c
notifier-error-inject.c
notifier-error-inject.h
of-reconfig-notifier-error-inject.c
oid_registry.c
once.c
parser.c
pci_iomap.c
percpu-refcount.c
percpu_counter.c
percpu_ida.c
percpu_test.c
plist.c
pm-notifier-error-inject.c
proportions.c
radix-tree.c
random32.c
ratelimit.c
rational.c
rbtree.c
rbtree_test.c
reciprocal_div.c
rhashtable.c
scatterlist.c
seq_buf.c
sg_split.c
sha1.c
show_mem.c
smp_processor_id.c
sort.c
stackdepot.c
stmp_device.c
string.c
string_helpers.c
strncpy_from_user.c
strnlen_user.c
swiotlb.c
syscall.c
test-kstrtox.c
test-string_helpers.c
test_bitmap.c
test_bpf.c
test_firmware.c
test_hexdump.c
test_kasan.c
test_module.c
test_printf.c
test_rhashtable.c
test_static_key_base.c
test_static_keys.c
test_user_copy.c
textsearch.c
timerqueue.c
ts_bm.c
ts_fsm.c
ts_kmp.c
ubsan.c
ubsan.h
ucs2_string.c
usercopy.c
uuid.c
vsprintf.c
mm
net
samples
scripts
security
sound
tools
usr
virt
.get_maintainer.ignore
.gitignore
.mailmap
COPYING
CREDITS
Kbuild
Kconfig
MAINTAINERS
Makefile
README
REPORTING-BUGS
Breadcrumbs
linux
/
lib
/
test_bitmap.c
Blame
Blame
Latest commit
History
History
358 lines (291 loc) · 9.04 KB
Breadcrumbs
linux
/
lib
/
test_bitmap.c
Top
File metadata and controls
Code
Blame
358 lines (291 loc) · 9.04 KB
Raw
/* * Test cases for printf facility. */ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include <linux/bitmap.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/printk.h> #include <linux/slab.h> #include <linux/string.h> static unsigned total_tests __initdata; static unsigned failed_tests __initdata; static char pbl_buffer[PAGE_SIZE] __initdata; static bool __init __check_eq_uint(const char *srcfile, unsigned int line, const unsigned int exp_uint, unsigned int x) { if (exp_uint != x) { pr_warn("[%s:%u] expected %u, got %u\n", srcfile, line, exp_uint, x); return false; } return true; } static bool __init __check_eq_bitmap(const char *srcfile, unsigned int line, const unsigned long *exp_bmap, unsigned int exp_nbits, const unsigned long *bmap, unsigned int nbits) { if (exp_nbits != nbits) { pr_warn("[%s:%u] bitmap length mismatch: expected %u, got %u\n", srcfile, line, exp_nbits, nbits); return false; } if (!bitmap_equal(exp_bmap, bmap, nbits)) { pr_warn("[%s:%u] bitmaps contents differ: expected \"%*pbl\", got \"%*pbl\"\n", srcfile, line, exp_nbits, exp_bmap, nbits, bmap); return false; } return true; } static bool __init __check_eq_pbl(const char *srcfile, unsigned int line, const char *expected_pbl, const unsigned long *bitmap, unsigned int nbits) { snprintf(pbl_buffer, sizeof(pbl_buffer), "%*pbl", nbits, bitmap); if (strcmp(expected_pbl, pbl_buffer)) { pr_warn("[%s:%u] expected \"%s\", got \"%s\"\n", srcfile, line, expected_pbl, pbl_buffer); return false; } return true; } static bool __init __check_eq_u32_array(const char *srcfile, unsigned int line, const u32 *exp_arr, unsigned int exp_len, const u32 *arr, unsigned int len) { if (exp_len != len) { pr_warn("[%s:%u] array length differ: expected %u, got %u\n", srcfile, line, exp_len, len); return false; } if (memcmp(exp_arr, arr, len*sizeof(*arr))) { pr_warn("[%s:%u] array contents differ\n", srcfile, line); print_hex_dump(KERN_WARNING, " exp: ", DUMP_PREFIX_OFFSET, 32, 4, exp_arr, exp_len*sizeof(*exp_arr), false); print_hex_dump(KERN_WARNING, " got: ", DUMP_PREFIX_OFFSET, 32, 4, arr, len*sizeof(*arr), false); return false; } return true; } #define __expect_eq(suffix, ...) \ ({ \ int result = 0; \ total_tests++; \ if (!__check_eq_ ## suffix(__FILE__, __LINE__, \ ##__VA_ARGS__)) { \ failed_tests++; \ result = 1; \ } \ result; \ }) #define expect_eq_uint(...) __expect_eq(uint, ##__VA_ARGS__) #define expect_eq_bitmap(...) __expect_eq(bitmap, ##__VA_ARGS__) #define expect_eq_pbl(...) __expect_eq(pbl, ##__VA_ARGS__) #define expect_eq_u32_array(...) __expect_eq(u32_array, ##__VA_ARGS__) static void __init test_zero_fill_copy(void) { DECLARE_BITMAP(bmap1, 1024); DECLARE_BITMAP(bmap2, 1024); bitmap_zero(bmap1, 1024); bitmap_zero(bmap2, 1024); /* single-word bitmaps */ expect_eq_pbl("", bmap1, 23); bitmap_fill(bmap1, 19); expect_eq_pbl("0-18", bmap1, 1024); bitmap_copy(bmap2, bmap1, 23); expect_eq_pbl("0-18", bmap2, 1024); bitmap_fill(bmap2, 23); expect_eq_pbl("0-22", bmap2, 1024); bitmap_copy(bmap2, bmap1, 23); expect_eq_pbl("0-18", bmap2, 1024); bitmap_zero(bmap1, 23); expect_eq_pbl("", bmap1, 1024); /* multi-word bitmaps */ bitmap_zero(bmap1, 1024); expect_eq_pbl("", bmap1, 1024); bitmap_fill(bmap1, 109); expect_eq_pbl("0-108", bmap1, 1024); bitmap_copy(bmap2, bmap1, 1024); expect_eq_pbl("0-108", bmap2, 1024); bitmap_fill(bmap2, 1024); expect_eq_pbl("0-1023", bmap2, 1024); bitmap_copy(bmap2, bmap1, 1024); expect_eq_pbl("0-108", bmap2, 1024); /* the following tests assume a 32- or 64-bit arch (even 128b * if we care) */ bitmap_fill(bmap2, 1024); bitmap_copy(bmap2, bmap1, 109); /* ... but 0-padded til word length */ expect_eq_pbl("0-108,128-1023", bmap2, 1024); bitmap_fill(bmap2, 1024); bitmap_copy(bmap2, bmap1, 97); /* ... but aligned on word length */ expect_eq_pbl("0-108,128-1023", bmap2, 1024); bitmap_zero(bmap2, 97); /* ... but 0-padded til word length */ expect_eq_pbl("128-1023", bmap2, 1024); } static void __init test_bitmap_u32_array_conversions(void) { DECLARE_BITMAP(bmap1, 1024); DECLARE_BITMAP(bmap2, 1024); u32 exp_arr[32], arr[32]; unsigned nbits; for (nbits = 0 ; nbits < 257 ; ++nbits) { const unsigned int used_u32s = DIV_ROUND_UP(nbits, 32); unsigned int i, rv; bitmap_zero(bmap1, nbits); bitmap_set(bmap1, nbits, 1024 - nbits); /* garbage */ memset(arr, 0xff, sizeof(arr)); rv = bitmap_to_u32array(arr, used_u32s, bmap1, nbits); expect_eq_uint(nbits, rv); memset(exp_arr, 0xff, sizeof(exp_arr)); memset(exp_arr, 0, used_u32s*sizeof(*exp_arr)); expect_eq_u32_array(exp_arr, 32, arr, 32); bitmap_fill(bmap2, 1024); rv = bitmap_from_u32array(bmap2, nbits, arr, used_u32s); expect_eq_uint(nbits, rv); expect_eq_bitmap(bmap1, 1024, bmap2, 1024); for (i = 0 ; i < nbits ; ++i) { /* * test conversion bitmap -> u32[] */ bitmap_zero(bmap1, 1024); __set_bit(i, bmap1); bitmap_set(bmap1, nbits, 1024 - nbits); /* garbage */ memset(arr, 0xff, sizeof(arr)); rv = bitmap_to_u32array(arr, used_u32s, bmap1, nbits); expect_eq_uint(nbits, rv); /* 1st used u32 words contain expected bit set, the * remaining words are left unchanged (0xff) */ memset(exp_arr, 0xff, sizeof(exp_arr)); memset(exp_arr, 0, used_u32s*sizeof(*exp_arr)); exp_arr[i/32] = (1U<<(i%32)); expect_eq_u32_array(exp_arr, 32, arr, 32); /* same, with longer array to fill */ memset(arr, 0xff, sizeof(arr)); rv = bitmap_to_u32array(arr, 32, bmap1, nbits); expect_eq_uint(nbits, rv); /* 1st used u32 words contain expected bit set, the * remaining words are all 0s */ memset(exp_arr, 0, sizeof(exp_arr)); exp_arr[i/32] = (1U<<(i%32)); expect_eq_u32_array(exp_arr, 32, arr, 32); /* * test conversion u32[] -> bitmap */ /* the 1st nbits of bmap2 are identical to * bmap1, the remaining bits of bmap2 are left * unchanged (all 1s) */ bitmap_fill(bmap2, 1024); rv = bitmap_from_u32array(bmap2, nbits, exp_arr, used_u32s); expect_eq_uint(nbits, rv); expect_eq_bitmap(bmap1, 1024, bmap2, 1024); /* same, with more bits to fill */ memset(arr, 0xff, sizeof(arr)); /* garbage */ memset(arr, 0, used_u32s*sizeof(u32)); arr[i/32] = (1U<<(i%32)); bitmap_fill(bmap2, 1024); rv = bitmap_from_u32array(bmap2, 1024, arr, used_u32s); expect_eq_uint(used_u32s*32, rv); /* the 1st nbits of bmap2 are identical to * bmap1, the remaining bits of bmap2 are cleared */ bitmap_zero(bmap1, 1024); __set_bit(i, bmap1); expect_eq_bitmap(bmap1, 1024, bmap2, 1024); /* * test short conversion bitmap -> u32[] (1 * word too short) */ if (used_u32s > 1) { bitmap_zero(bmap1, 1024); __set_bit(i, bmap1); bitmap_set(bmap1, nbits, 1024 - nbits); /* garbage */ memset(arr, 0xff, sizeof(arr)); rv = bitmap_to_u32array(arr, used_u32s - 1, bmap1, nbits); expect_eq_uint((used_u32s - 1)*32, rv); /* 1st used u32 words contain expected * bit set, the remaining words are * left unchanged (0xff) */ memset(exp_arr, 0xff, sizeof(exp_arr)); memset(exp_arr, 0, (used_u32s-1)*sizeof(*exp_arr)); if ((i/32) < (used_u32s - 1)) exp_arr[i/32] = (1U<<(i%32)); expect_eq_u32_array(exp_arr, 32, arr, 32); } /* * test short conversion u32[] -> bitmap (3 * bits too short) */ if (nbits > 3) { memset(arr, 0xff, sizeof(arr)); /* garbage */ memset(arr, 0, used_u32s*sizeof(*arr)); arr[i/32] = (1U<<(i%32)); bitmap_zero(bmap1, 1024); rv = bitmap_from_u32array(bmap1, nbits - 3, arr, used_u32s); expect_eq_uint(nbits - 3, rv); /* we are expecting the bit < nbits - * 3 (none otherwise), and the rest of * bmap1 unchanged (0-filled) */ bitmap_zero(bmap2, 1024); if (i < nbits - 3) __set_bit(i, bmap2); expect_eq_bitmap(bmap2, 1024, bmap1, 1024); /* do the same with bmap1 initially * 1-filled */ bitmap_fill(bmap1, 1024); rv = bitmap_from_u32array(bmap1, nbits - 3, arr, used_u32s); expect_eq_uint(nbits - 3, rv); /* we are expecting the bit < nbits - * 3 (none otherwise), and the rest of * bmap1 unchanged (1-filled) */ bitmap_zero(bmap2, 1024); if (i < nbits - 3) __set_bit(i, bmap2); bitmap_set(bmap2, nbits-3, 1024 - nbits + 3); expect_eq_bitmap(bmap2, 1024, bmap1, 1024); } } } } static int __init test_bitmap_init(void) { test_zero_fill_copy(); test_bitmap_u32_array_conversions(); if (failed_tests == 0) pr_info("all %u tests passed\n", total_tests); else pr_warn("failed %u out of %u tests\n", failed_tests, total_tests); return failed_tests ? -EINVAL : 0; } static void __exit test_bitmap_cleanup(void) { } module_init(test_bitmap_init); module_exit(test_bitmap_cleanup); MODULE_AUTHOR("david decotigny <david.decotigny@googlers.com>"); MODULE_LICENSE("GPL");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
You can’t perform that action at this time.