xref: /dpdk/app/test/test_bitmap.c (revision 14ad4f01845331a0ae98c681efa3086eeed3343a)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Cavium, Inc
3  */
4 
5 #include <stdio.h>
6 #include <inttypes.h>
7 
8 #include <rte_common.h>
9 #include <rte_bitmap.h>
10 #include <rte_malloc.h>
11 
12 #include "test.h"
13 
14 #define MAX_BITS 1000
15 
16 static int
17 test_bitmap_scan_operations(struct rte_bitmap *bmp)
18 {
19 	uint32_t pos = 0;
20 	uint64_t slab1_magic = 0xBADC0FFEEBADF00D;
21 	uint64_t slab2_magic = 0xFEEDDEADDEADF00D;
22 	uint64_t out_slab = 0;
23 
24 	rte_bitmap_reset(bmp);
25 
26 	rte_bitmap_set_slab(bmp, pos, slab1_magic);
27 	rte_bitmap_set_slab(bmp, pos + RTE_BITMAP_SLAB_BIT_SIZE, slab2_magic);
28 
29 	if (!rte_bitmap_scan(bmp, &pos, &out_slab)) {
30 		printf("Failed to get slab from bitmap.\n");
31 		return TEST_FAILED;
32 	}
33 
34 	if (slab1_magic != out_slab) {
35 		printf("Scan operation sanity failed.\n");
36 		return TEST_FAILED;
37 	}
38 
39 	if (!rte_bitmap_scan(bmp, &pos, &out_slab)) {
40 		printf("Failed to get slab from bitmap.\n");
41 		return TEST_FAILED;
42 	}
43 
44 	if (slab2_magic != out_slab) {
45 		printf("Scan operation sanity failed.\n");
46 		return TEST_FAILED;
47 	}
48 
49 	/* Wrap around */
50 	if (!rte_bitmap_scan(bmp, &pos, &out_slab)) {
51 		printf("Failed to get slab from bitmap.\n");
52 		return TEST_FAILED;
53 	}
54 
55 	if (slab1_magic != out_slab) {
56 		printf("Scan operation wrap around failed.\n");
57 		return TEST_FAILED;
58 	}
59 
60 	/* Scan reset check. */
61 	__rte_bitmap_scan_init(bmp);
62 
63 	if (!rte_bitmap_scan(bmp, &pos, &out_slab)) {
64 		printf("Failed to get slab from bitmap.\n");
65 		return TEST_FAILED;
66 	}
67 
68 	if (slab1_magic != out_slab) {
69 		printf("Scan reset operation failed.\n");
70 		return TEST_FAILED;
71 	}
72 
73 	return TEST_SUCCESS;
74 }
75 
76 static int
77 test_bitmap_slab_set_get(struct rte_bitmap *bmp)
78 {
79 	uint32_t pos = 0;
80 	uint64_t slab_magic = 0xBADC0FFEEBADF00D;
81 	uint64_t out_slab = 0;
82 
83 	rte_bitmap_reset(bmp);
84 	rte_bitmap_set_slab(bmp, pos, slab_magic);
85 
86 	if (!rte_bitmap_scan(bmp, &pos, &out_slab)) {
87 		printf("Failed to get slab from bitmap.\n");
88 		return TEST_FAILED;
89 	}
90 
91 
92 	if (slab_magic != out_slab) {
93 		printf("Invalid slab in bitmap.\n");
94 		return TEST_FAILED;
95 	}
96 
97 
98 	return TEST_SUCCESS;
99 }
100 
101 static int
102 test_bitmap_set_get_clear(struct rte_bitmap *bmp)
103 {
104 	uint64_t val;
105 	int i;
106 
107 	rte_bitmap_reset(bmp);
108 	for (i = 0; i < MAX_BITS; i++)
109 		rte_bitmap_set(bmp, i);
110 
111 	for (i = 0; i < MAX_BITS; i++) {
112 		if (!rte_bitmap_get(bmp, i)) {
113 			printf("Failed to get set bit.\n");
114 			return TEST_FAILED;
115 		}
116 	}
117 
118 	for (i = 0; i < MAX_BITS; i++)
119 		rte_bitmap_clear(bmp, i);
120 
121 	for (i = 0; i < MAX_BITS; i++) {
122 		if (rte_bitmap_get(bmp, i)) {
123 			printf("Failed to clear set bit.\n");
124 			return TEST_FAILED;
125 		}
126 	}
127 
128 	rte_bitmap_reset(bmp);
129 
130 	/* Alternate slab set test */
131 	for (i = 0; i < MAX_BITS; i++) {
132 		if (i % RTE_BITMAP_SLAB_BIT_SIZE)
133 			rte_bitmap_set(bmp, i);
134 	}
135 
136 	for (i = 0; i < MAX_BITS; i++) {
137 		val = rte_bitmap_get(bmp, i);
138 		if (((i % RTE_BITMAP_SLAB_BIT_SIZE) && !val) ||
139 		    (!(i % RTE_BITMAP_SLAB_BIT_SIZE) && val)) {
140 			printf("Failed to get set bit.\n");
141 			return TEST_FAILED;
142 		}
143 	}
144 
145 	return TEST_SUCCESS;
146 }
147 
148 static int
149 test_bitmap(void)
150 {
151 	void *mem;
152 	uint32_t bmp_size;
153 	struct rte_bitmap *bmp;
154 
155 	bmp_size =
156 		rte_bitmap_get_memory_footprint(MAX_BITS);
157 
158 	mem = rte_zmalloc("test_bmap", bmp_size, RTE_CACHE_LINE_SIZE);
159 	if (mem == NULL) {
160 		printf("Failed to allocate memory for bitmap\n");
161 		return TEST_FAILED;
162 	}
163 
164 	bmp = rte_bitmap_init(MAX_BITS, mem, bmp_size);
165 	if (bmp == NULL) {
166 		printf("Failed to init bitmap\n");
167 		return TEST_FAILED;
168 	}
169 
170 	if (test_bitmap_set_get_clear(bmp) < 0)
171 		return TEST_FAILED;
172 
173 	if (test_bitmap_slab_set_get(bmp) < 0)
174 		return TEST_FAILED;
175 
176 	if (test_bitmap_scan_operations(bmp) < 0)
177 		return TEST_FAILED;
178 
179 	rte_bitmap_free(bmp);
180 	rte_free(mem);
181 
182 	return TEST_SUCCESS;
183 }
184 
185 REGISTER_TEST_COMMAND(bitmap_test, test_bitmap);
186