1a9de470cSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2a9de470cSBruce Richardson * Copyright(c) 2010-2014 Intel Corporation
3a9de470cSBruce Richardson */
4a9de470cSBruce Richardson
5a9de470cSBruce Richardson #include <stdio.h>
6a9de470cSBruce Richardson #include <stdint.h>
7a9de470cSBruce Richardson #include <string.h>
8a9de470cSBruce Richardson #include <inttypes.h>
9a9de470cSBruce Richardson #include <sys/queue.h>
10a9de470cSBruce Richardson
11a9de470cSBruce Richardson #include <rte_random.h>
12a9de470cSBruce Richardson #include <rte_cycles.h>
13a9de470cSBruce Richardson #include <rte_memory.h>
14a9de470cSBruce Richardson #include <rte_memzone.h>
15a9de470cSBruce Richardson #include <rte_eal.h>
16ab35397eSDavid Marchand #include <rte_lcore.h>
17a9de470cSBruce Richardson #include <rte_common.h>
18a9de470cSBruce Richardson #include <rte_string_fns.h>
19a9de470cSBruce Richardson #include <rte_errno.h>
20a9de470cSBruce Richardson #include <rte_malloc.h>
2109e640e3SDavid Marchand
2209e640e3SDavid Marchand #include "malloc_elem.h"
23a9de470cSBruce Richardson
24a9de470cSBruce Richardson #include "test.h"
25a9de470cSBruce Richardson
26a9de470cSBruce Richardson /*
27a9de470cSBruce Richardson * Memzone
28a9de470cSBruce Richardson * =======
29a9de470cSBruce Richardson *
30a9de470cSBruce Richardson * - Search for three reserved zones or reserve them if they do not exist:
31a9de470cSBruce Richardson *
32a9de470cSBruce Richardson * - One is on any socket id.
33a9de470cSBruce Richardson * - The second is on socket 0.
34a9de470cSBruce Richardson * - The last one is on socket 1 (if socket 1 exists).
35a9de470cSBruce Richardson *
36a9de470cSBruce Richardson * - Check that the zones exist.
37a9de470cSBruce Richardson *
38a9de470cSBruce Richardson * - Check that the zones are cache-aligned.
39a9de470cSBruce Richardson *
40a9de470cSBruce Richardson * - Check that zones do not overlap.
41a9de470cSBruce Richardson *
42a9de470cSBruce Richardson * - Check that the zones are on the correct socket id.
43a9de470cSBruce Richardson *
44a9de470cSBruce Richardson * - Check that a lookup of the first zone returns the same pointer.
45a9de470cSBruce Richardson *
46a9de470cSBruce Richardson * - Check that it is not possible to create another zone with the
47a9de470cSBruce Richardson * same name as an existing zone.
48a9de470cSBruce Richardson *
49a9de470cSBruce Richardson * - Check flags for specific huge page size reservation
50a9de470cSBruce Richardson */
51a9de470cSBruce Richardson
52a9de470cSBruce Richardson #define TEST_MEMZONE_NAME(suffix) "MZ_TEST_" suffix
53a9de470cSBruce Richardson
54a9de470cSBruce Richardson /* Test if memory overlaps: return 1 if true, or 0 if false. */
55a9de470cSBruce Richardson static int
is_memory_overlap(rte_iova_t ptr1,size_t len1,rte_iova_t ptr2,size_t len2)56a9de470cSBruce Richardson is_memory_overlap(rte_iova_t ptr1, size_t len1, rte_iova_t ptr2, size_t len2)
57a9de470cSBruce Richardson {
58a9de470cSBruce Richardson if (ptr2 >= ptr1 && (ptr2 - ptr1) < len1)
59a9de470cSBruce Richardson return 1;
60a9de470cSBruce Richardson else if (ptr2 < ptr1 && (ptr1 - ptr2) < len2)
61a9de470cSBruce Richardson return 1;
62a9de470cSBruce Richardson return 0;
63a9de470cSBruce Richardson }
64a9de470cSBruce Richardson
65a9de470cSBruce Richardson static int
test_memzone_invalid_alignment(void)66a9de470cSBruce Richardson test_memzone_invalid_alignment(void)
67a9de470cSBruce Richardson {
68a9de470cSBruce Richardson const struct rte_memzone * mz;
69a9de470cSBruce Richardson
70a9de470cSBruce Richardson mz = rte_memzone_lookup(TEST_MEMZONE_NAME("invalid_alignment"));
71a9de470cSBruce Richardson if (mz != NULL) {
72a9de470cSBruce Richardson printf("Zone with invalid alignment has been reserved\n");
73a9de470cSBruce Richardson return -1;
74a9de470cSBruce Richardson }
75a9de470cSBruce Richardson
76a9de470cSBruce Richardson mz = rte_memzone_reserve_aligned(TEST_MEMZONE_NAME("invalid_alignment"),
77a9de470cSBruce Richardson 100, SOCKET_ID_ANY, 0, 100);
78a9de470cSBruce Richardson if (mz != NULL) {
79a9de470cSBruce Richardson printf("Zone with invalid alignment has been reserved\n");
80a9de470cSBruce Richardson return -1;
81a9de470cSBruce Richardson }
82a9de470cSBruce Richardson return 0;
83a9de470cSBruce Richardson }
84a9de470cSBruce Richardson
85a9de470cSBruce Richardson static int
test_memzone_invalid_flags(void)86bc1a35fbSDavid Marchand test_memzone_invalid_flags(void)
87bc1a35fbSDavid Marchand {
88bc1a35fbSDavid Marchand const struct rte_memzone *mz;
89bc1a35fbSDavid Marchand
90bc1a35fbSDavid Marchand mz = rte_memzone_lookup(TEST_MEMZONE_NAME("invalid_flags"));
91bc1a35fbSDavid Marchand if (mz != NULL) {
92bc1a35fbSDavid Marchand printf("Zone with invalid flags has been reserved\n");
93bc1a35fbSDavid Marchand return -1;
94bc1a35fbSDavid Marchand }
95bc1a35fbSDavid Marchand
96bc1a35fbSDavid Marchand mz = rte_memzone_reserve(TEST_MEMZONE_NAME("invalid_flags"),
97bc1a35fbSDavid Marchand 100, SOCKET_ID_ANY, RTE_MEMZONE_IOVA_CONTIG << 1);
98bc1a35fbSDavid Marchand if (mz != NULL) {
99bc1a35fbSDavid Marchand printf("Zone with invalid flags has been reserved\n");
100bc1a35fbSDavid Marchand return -1;
101bc1a35fbSDavid Marchand }
102bc1a35fbSDavid Marchand return 0;
103bc1a35fbSDavid Marchand }
104bc1a35fbSDavid Marchand
105bc1a35fbSDavid Marchand static int
test_memzone_reserving_zone_size_bigger_than_the_maximum(void)106a9de470cSBruce Richardson test_memzone_reserving_zone_size_bigger_than_the_maximum(void)
107a9de470cSBruce Richardson {
108a9de470cSBruce Richardson const struct rte_memzone * mz;
109a9de470cSBruce Richardson
110a9de470cSBruce Richardson mz = rte_memzone_lookup(
111a9de470cSBruce Richardson TEST_MEMZONE_NAME("zone_size_bigger_than_the_maximum"));
112a9de470cSBruce Richardson if (mz != NULL) {
113a9de470cSBruce Richardson printf("zone_size_bigger_than_the_maximum has been reserved\n");
114a9de470cSBruce Richardson return -1;
115a9de470cSBruce Richardson }
116a9de470cSBruce Richardson
117a9de470cSBruce Richardson mz = rte_memzone_reserve(
118a9de470cSBruce Richardson TEST_MEMZONE_NAME("zone_size_bigger_than_the_maximum"),
119a9de470cSBruce Richardson (size_t)-1, SOCKET_ID_ANY, 0);
120a9de470cSBruce Richardson if (mz != NULL) {
121a9de470cSBruce Richardson printf("It is impossible to reserve such big a memzone\n");
122a9de470cSBruce Richardson return -1;
123a9de470cSBruce Richardson }
124a9de470cSBruce Richardson
125a9de470cSBruce Richardson return 0;
126a9de470cSBruce Richardson }
127a9de470cSBruce Richardson
128a9de470cSBruce Richardson struct walk_arg {
129a9de470cSBruce Richardson int hugepage_2MB_avail;
130a9de470cSBruce Richardson int hugepage_1GB_avail;
131a9de470cSBruce Richardson int hugepage_16MB_avail;
132a9de470cSBruce Richardson int hugepage_16GB_avail;
133a9de470cSBruce Richardson };
134a9de470cSBruce Richardson static int
find_available_pagesz(const struct rte_memseg_list * msl,void * arg)135a9de470cSBruce Richardson find_available_pagesz(const struct rte_memseg_list *msl, void *arg)
136a9de470cSBruce Richardson {
137a9de470cSBruce Richardson struct walk_arg *wa = arg;
138a9de470cSBruce Richardson
139a9de470cSBruce Richardson if (msl->external)
140a9de470cSBruce Richardson return 0;
141a9de470cSBruce Richardson
142a9de470cSBruce Richardson if (msl->page_sz == RTE_PGSIZE_2M)
143a9de470cSBruce Richardson wa->hugepage_2MB_avail = 1;
144a9de470cSBruce Richardson if (msl->page_sz == RTE_PGSIZE_1G)
145a9de470cSBruce Richardson wa->hugepage_1GB_avail = 1;
146a9de470cSBruce Richardson if (msl->page_sz == RTE_PGSIZE_16M)
147a9de470cSBruce Richardson wa->hugepage_16MB_avail = 1;
148a9de470cSBruce Richardson if (msl->page_sz == RTE_PGSIZE_16G)
149a9de470cSBruce Richardson wa->hugepage_16GB_avail = 1;
150a9de470cSBruce Richardson
151a9de470cSBruce Richardson return 0;
152a9de470cSBruce Richardson }
153a9de470cSBruce Richardson
154a9de470cSBruce Richardson static int
test_memzone_reserve_flags(void)155a9de470cSBruce Richardson test_memzone_reserve_flags(void)
156a9de470cSBruce Richardson {
157a9de470cSBruce Richardson const struct rte_memzone *mz;
158a9de470cSBruce Richardson struct walk_arg wa;
159a9de470cSBruce Richardson int hugepage_2MB_avail, hugepage_1GB_avail;
160a9de470cSBruce Richardson int hugepage_16MB_avail, hugepage_16GB_avail;
161a9de470cSBruce Richardson const size_t size = 100;
162a9de470cSBruce Richardson
163a9de470cSBruce Richardson memset(&wa, 0, sizeof(wa));
164a9de470cSBruce Richardson
165a9de470cSBruce Richardson rte_memseg_list_walk(find_available_pagesz, &wa);
166a9de470cSBruce Richardson
167a9de470cSBruce Richardson hugepage_2MB_avail = wa.hugepage_2MB_avail;
168a9de470cSBruce Richardson hugepage_1GB_avail = wa.hugepage_1GB_avail;
169a9de470cSBruce Richardson hugepage_16MB_avail = wa.hugepage_16MB_avail;
170a9de470cSBruce Richardson hugepage_16GB_avail = wa.hugepage_16GB_avail;
171a9de470cSBruce Richardson
172a9de470cSBruce Richardson /* Display the availability of 2MB ,1GB, 16MB, 16GB pages */
173a9de470cSBruce Richardson if (hugepage_2MB_avail)
174a9de470cSBruce Richardson printf("2MB Huge pages available\n");
175a9de470cSBruce Richardson if (hugepage_1GB_avail)
176a9de470cSBruce Richardson printf("1GB Huge pages available\n");
177a9de470cSBruce Richardson if (hugepage_16MB_avail)
178a9de470cSBruce Richardson printf("16MB Huge pages available\n");
179a9de470cSBruce Richardson if (hugepage_16GB_avail)
180a9de470cSBruce Richardson printf("16GB Huge pages available\n");
181a9de470cSBruce Richardson /*
182a9de470cSBruce Richardson * If 2MB pages available, check that a small memzone is correctly
183a9de470cSBruce Richardson * reserved from 2MB huge pages when requested by the RTE_MEMZONE_2MB flag.
184a9de470cSBruce Richardson * Also check that RTE_MEMZONE_SIZE_HINT_ONLY flag only defaults to an
185a9de470cSBruce Richardson * available page size (i.e 1GB ) when 2MB pages are unavailable.
186a9de470cSBruce Richardson */
187a9de470cSBruce Richardson if (hugepage_2MB_avail) {
188a9de470cSBruce Richardson mz = rte_memzone_reserve(TEST_MEMZONE_NAME("flag_zone_2M"),
189a9de470cSBruce Richardson size, SOCKET_ID_ANY, RTE_MEMZONE_2MB);
190a9de470cSBruce Richardson if (mz == NULL) {
191a9de470cSBruce Richardson printf("MEMZONE FLAG 2MB\n");
192a9de470cSBruce Richardson return -1;
193a9de470cSBruce Richardson }
194a9de470cSBruce Richardson if (mz->hugepage_sz != RTE_PGSIZE_2M) {
195a9de470cSBruce Richardson printf("hugepage_sz not equal 2M\n");
196a9de470cSBruce Richardson return -1;
197a9de470cSBruce Richardson }
198a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
199a9de470cSBruce Richardson printf("Fail memzone free\n");
200a9de470cSBruce Richardson return -1;
201a9de470cSBruce Richardson }
202a9de470cSBruce Richardson
203a9de470cSBruce Richardson mz = rte_memzone_reserve(TEST_MEMZONE_NAME("flag_zone_2M_HINT"),
204a9de470cSBruce Richardson size, SOCKET_ID_ANY,
205a9de470cSBruce Richardson RTE_MEMZONE_2MB|RTE_MEMZONE_SIZE_HINT_ONLY);
206a9de470cSBruce Richardson if (mz == NULL) {
207a9de470cSBruce Richardson printf("MEMZONE FLAG 2MB\n");
208a9de470cSBruce Richardson return -1;
209a9de470cSBruce Richardson }
210a9de470cSBruce Richardson if (mz->hugepage_sz != RTE_PGSIZE_2M) {
211a9de470cSBruce Richardson printf("hugepage_sz not equal 2M\n");
212a9de470cSBruce Richardson return -1;
213a9de470cSBruce Richardson }
214a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
215a9de470cSBruce Richardson printf("Fail memzone free\n");
216a9de470cSBruce Richardson return -1;
217a9de470cSBruce Richardson }
218a9de470cSBruce Richardson
219a9de470cSBruce Richardson /* Check if 1GB huge pages are unavailable, that function fails unless
220a9de470cSBruce Richardson * HINT flag is indicated
221a9de470cSBruce Richardson */
222a9de470cSBruce Richardson if (!hugepage_1GB_avail) {
223a9de470cSBruce Richardson mz = rte_memzone_reserve(
224a9de470cSBruce Richardson TEST_MEMZONE_NAME("flag_zone_1G_HINT"),
225a9de470cSBruce Richardson size, SOCKET_ID_ANY,
226a9de470cSBruce Richardson RTE_MEMZONE_1GB|RTE_MEMZONE_SIZE_HINT_ONLY);
227a9de470cSBruce Richardson if (mz == NULL) {
228a9de470cSBruce Richardson printf("MEMZONE FLAG 1GB & HINT\n");
229a9de470cSBruce Richardson return -1;
230a9de470cSBruce Richardson }
231a9de470cSBruce Richardson if (mz->hugepage_sz != RTE_PGSIZE_2M) {
232a9de470cSBruce Richardson printf("hugepage_sz not equal 2M\n");
233a9de470cSBruce Richardson return -1;
234a9de470cSBruce Richardson }
235a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
236a9de470cSBruce Richardson printf("Fail memzone free\n");
237a9de470cSBruce Richardson return -1;
238a9de470cSBruce Richardson }
239a9de470cSBruce Richardson
240a9de470cSBruce Richardson mz = rte_memzone_reserve(
241a9de470cSBruce Richardson TEST_MEMZONE_NAME("flag_zone_1G"), size,
242a9de470cSBruce Richardson SOCKET_ID_ANY, RTE_MEMZONE_1GB);
243a9de470cSBruce Richardson if (mz != NULL) {
244a9de470cSBruce Richardson printf("MEMZONE FLAG 1GB\n");
245a9de470cSBruce Richardson return -1;
246a9de470cSBruce Richardson }
247a9de470cSBruce Richardson }
248a9de470cSBruce Richardson }
249a9de470cSBruce Richardson
250a9de470cSBruce Richardson /*As with 2MB tests above for 1GB huge page requests*/
251a9de470cSBruce Richardson if (hugepage_1GB_avail) {
252a9de470cSBruce Richardson mz = rte_memzone_reserve(TEST_MEMZONE_NAME("flag_zone_1G"),
253a9de470cSBruce Richardson size, SOCKET_ID_ANY, RTE_MEMZONE_1GB);
254a9de470cSBruce Richardson if (mz == NULL) {
255a9de470cSBruce Richardson printf("MEMZONE FLAG 1GB\n");
256a9de470cSBruce Richardson return -1;
257a9de470cSBruce Richardson }
258a9de470cSBruce Richardson if (mz->hugepage_sz != RTE_PGSIZE_1G) {
259a9de470cSBruce Richardson printf("hugepage_sz not equal 1G\n");
260a9de470cSBruce Richardson return -1;
261a9de470cSBruce Richardson }
262a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
263a9de470cSBruce Richardson printf("Fail memzone free\n");
264a9de470cSBruce Richardson return -1;
265a9de470cSBruce Richardson }
266a9de470cSBruce Richardson
267a9de470cSBruce Richardson mz = rte_memzone_reserve(TEST_MEMZONE_NAME("flag_zone_1G_HINT"),
268a9de470cSBruce Richardson size, SOCKET_ID_ANY,
269a9de470cSBruce Richardson RTE_MEMZONE_1GB|RTE_MEMZONE_SIZE_HINT_ONLY);
270a9de470cSBruce Richardson if (mz == NULL) {
271a9de470cSBruce Richardson printf("MEMZONE FLAG 1GB\n");
272a9de470cSBruce Richardson return -1;
273a9de470cSBruce Richardson }
274a9de470cSBruce Richardson if (mz->hugepage_sz != RTE_PGSIZE_1G) {
275a9de470cSBruce Richardson printf("hugepage_sz not equal 1G\n");
276a9de470cSBruce Richardson return -1;
277a9de470cSBruce Richardson }
278a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
279a9de470cSBruce Richardson printf("Fail memzone free\n");
280a9de470cSBruce Richardson return -1;
281a9de470cSBruce Richardson }
282a9de470cSBruce Richardson
283a9de470cSBruce Richardson /* Check if 1GB huge pages are unavailable, that function fails unless
284a9de470cSBruce Richardson * HINT flag is indicated
285a9de470cSBruce Richardson */
286a9de470cSBruce Richardson if (!hugepage_2MB_avail) {
287a9de470cSBruce Richardson mz = rte_memzone_reserve(
288a9de470cSBruce Richardson TEST_MEMZONE_NAME("flag_zone_2M_HINT"),
289a9de470cSBruce Richardson size, SOCKET_ID_ANY,
290a9de470cSBruce Richardson RTE_MEMZONE_2MB|RTE_MEMZONE_SIZE_HINT_ONLY);
291a9de470cSBruce Richardson if (mz == NULL){
292a9de470cSBruce Richardson printf("MEMZONE FLAG 2MB & HINT\n");
293a9de470cSBruce Richardson return -1;
294a9de470cSBruce Richardson }
295a9de470cSBruce Richardson if (mz->hugepage_sz != RTE_PGSIZE_1G) {
296a9de470cSBruce Richardson printf("hugepage_sz not equal 1G\n");
297a9de470cSBruce Richardson return -1;
298a9de470cSBruce Richardson }
299a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
300a9de470cSBruce Richardson printf("Fail memzone free\n");
301a9de470cSBruce Richardson return -1;
302a9de470cSBruce Richardson }
303a9de470cSBruce Richardson mz = rte_memzone_reserve(
304a9de470cSBruce Richardson TEST_MEMZONE_NAME("flag_zone_2M"), size,
305a9de470cSBruce Richardson SOCKET_ID_ANY, RTE_MEMZONE_2MB);
306a9de470cSBruce Richardson if (mz != NULL) {
307a9de470cSBruce Richardson printf("MEMZONE FLAG 2MB\n");
308a9de470cSBruce Richardson return -1;
309a9de470cSBruce Richardson }
310a9de470cSBruce Richardson }
311a9de470cSBruce Richardson
312a9de470cSBruce Richardson if (hugepage_2MB_avail && hugepage_1GB_avail) {
313a9de470cSBruce Richardson mz = rte_memzone_reserve(
314a9de470cSBruce Richardson TEST_MEMZONE_NAME("flag_zone_2M_HINT"),
315a9de470cSBruce Richardson size, SOCKET_ID_ANY,
316a9de470cSBruce Richardson RTE_MEMZONE_2MB|RTE_MEMZONE_1GB);
317a9de470cSBruce Richardson if (mz == NULL) {
318a9de470cSBruce Richardson printf("BOTH SIZES SET\n");
319a9de470cSBruce Richardson return -1;
320a9de470cSBruce Richardson }
321a9de470cSBruce Richardson if (mz->hugepage_sz != RTE_PGSIZE_1G &&
322a9de470cSBruce Richardson mz->hugepage_sz != RTE_PGSIZE_2M) {
323a9de470cSBruce Richardson printf("Wrong size when both sizes set\n");
324a9de470cSBruce Richardson return -1;
325a9de470cSBruce Richardson }
326a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
327a9de470cSBruce Richardson printf("Fail memzone free\n");
328a9de470cSBruce Richardson return -1;
329a9de470cSBruce Richardson }
330a9de470cSBruce Richardson }
331a9de470cSBruce Richardson }
332a9de470cSBruce Richardson /*
333a9de470cSBruce Richardson * This option is for IBM Power. If 16MB pages available, check
334a9de470cSBruce Richardson * that a small memzone is correctly reserved from 16MB huge pages
335a9de470cSBruce Richardson * when requested by the RTE_MEMZONE_16MB flag. Also check that
336a9de470cSBruce Richardson * RTE_MEMZONE_SIZE_HINT_ONLY flag only defaults to an available
337a9de470cSBruce Richardson * page size (i.e 16GB ) when 16MB pages are unavailable.
338a9de470cSBruce Richardson */
339a9de470cSBruce Richardson if (hugepage_16MB_avail) {
340a9de470cSBruce Richardson mz = rte_memzone_reserve(TEST_MEMZONE_NAME("flag_zone_16M"),
341a9de470cSBruce Richardson size, SOCKET_ID_ANY, RTE_MEMZONE_16MB);
342a9de470cSBruce Richardson if (mz == NULL) {
343a9de470cSBruce Richardson printf("MEMZONE FLAG 16MB\n");
344a9de470cSBruce Richardson return -1;
345a9de470cSBruce Richardson }
346a9de470cSBruce Richardson if (mz->hugepage_sz != RTE_PGSIZE_16M) {
347a9de470cSBruce Richardson printf("hugepage_sz not equal 16M\n");
348a9de470cSBruce Richardson return -1;
349a9de470cSBruce Richardson }
350a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
351a9de470cSBruce Richardson printf("Fail memzone free\n");
352a9de470cSBruce Richardson return -1;
353a9de470cSBruce Richardson }
354a9de470cSBruce Richardson
355a9de470cSBruce Richardson mz = rte_memzone_reserve(
356a9de470cSBruce Richardson TEST_MEMZONE_NAME("flag_zone_16M_HINT"), size,
357a9de470cSBruce Richardson SOCKET_ID_ANY,
358a9de470cSBruce Richardson RTE_MEMZONE_16MB|RTE_MEMZONE_SIZE_HINT_ONLY);
359a9de470cSBruce Richardson if (mz == NULL) {
360a9de470cSBruce Richardson printf("MEMZONE FLAG 16MB\n");
361a9de470cSBruce Richardson return -1;
362a9de470cSBruce Richardson }
363a9de470cSBruce Richardson if (mz->hugepage_sz != RTE_PGSIZE_16M) {
364a9de470cSBruce Richardson printf("hugepage_sz not equal 16M\n");
365a9de470cSBruce Richardson return -1;
366a9de470cSBruce Richardson }
367a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
368a9de470cSBruce Richardson printf("Fail memzone free\n");
369a9de470cSBruce Richardson return -1;
370a9de470cSBruce Richardson }
371a9de470cSBruce Richardson
372a9de470cSBruce Richardson /* Check if 1GB huge pages are unavailable, that function fails
373a9de470cSBruce Richardson * unless HINT flag is indicated
374a9de470cSBruce Richardson */
375a9de470cSBruce Richardson if (!hugepage_16GB_avail) {
376a9de470cSBruce Richardson mz = rte_memzone_reserve(
377a9de470cSBruce Richardson TEST_MEMZONE_NAME("flag_zone_16G_HINT"),
378a9de470cSBruce Richardson size, SOCKET_ID_ANY,
379a9de470cSBruce Richardson RTE_MEMZONE_16GB |
380a9de470cSBruce Richardson RTE_MEMZONE_SIZE_HINT_ONLY);
381a9de470cSBruce Richardson if (mz == NULL) {
382a9de470cSBruce Richardson printf("MEMZONE FLAG 16GB & HINT\n");
383a9de470cSBruce Richardson return -1;
384a9de470cSBruce Richardson }
385a9de470cSBruce Richardson if (mz->hugepage_sz != RTE_PGSIZE_16M) {
386a9de470cSBruce Richardson printf("hugepage_sz not equal 16M\n");
387a9de470cSBruce Richardson return -1;
388a9de470cSBruce Richardson }
389a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
390a9de470cSBruce Richardson printf("Fail memzone free\n");
391a9de470cSBruce Richardson return -1;
392a9de470cSBruce Richardson }
393a9de470cSBruce Richardson
394a9de470cSBruce Richardson mz = rte_memzone_reserve(
395a9de470cSBruce Richardson TEST_MEMZONE_NAME("flag_zone_16G"),
396a9de470cSBruce Richardson size,
397a9de470cSBruce Richardson SOCKET_ID_ANY, RTE_MEMZONE_16GB);
398a9de470cSBruce Richardson if (mz != NULL) {
399a9de470cSBruce Richardson printf("MEMZONE FLAG 16GB\n");
400a9de470cSBruce Richardson return -1;
401a9de470cSBruce Richardson }
402a9de470cSBruce Richardson }
403a9de470cSBruce Richardson }
404a9de470cSBruce Richardson /*As with 16MB tests above for 16GB huge page requests*/
405a9de470cSBruce Richardson if (hugepage_16GB_avail) {
406a9de470cSBruce Richardson mz = rte_memzone_reserve(TEST_MEMZONE_NAME("flag_zone_16G"),
407a9de470cSBruce Richardson size, SOCKET_ID_ANY, RTE_MEMZONE_16GB);
408a9de470cSBruce Richardson if (mz == NULL) {
409a9de470cSBruce Richardson printf("MEMZONE FLAG 16GB\n");
410a9de470cSBruce Richardson return -1;
411a9de470cSBruce Richardson }
412a9de470cSBruce Richardson if (mz->hugepage_sz != RTE_PGSIZE_16G) {
413a9de470cSBruce Richardson printf("hugepage_sz not equal 16G\n");
414a9de470cSBruce Richardson return -1;
415a9de470cSBruce Richardson }
416a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
417a9de470cSBruce Richardson printf("Fail memzone free\n");
418a9de470cSBruce Richardson return -1;
419a9de470cSBruce Richardson }
420a9de470cSBruce Richardson
421a9de470cSBruce Richardson mz = rte_memzone_reserve(
422a9de470cSBruce Richardson TEST_MEMZONE_NAME("flag_zone_16G_HINT"), size,
423a9de470cSBruce Richardson SOCKET_ID_ANY,
424a9de470cSBruce Richardson RTE_MEMZONE_16GB|RTE_MEMZONE_SIZE_HINT_ONLY);
425a9de470cSBruce Richardson if (mz == NULL) {
426a9de470cSBruce Richardson printf("MEMZONE FLAG 16GB\n");
427a9de470cSBruce Richardson return -1;
428a9de470cSBruce Richardson }
429a9de470cSBruce Richardson if (mz->hugepage_sz != RTE_PGSIZE_16G) {
430a9de470cSBruce Richardson printf("hugepage_sz not equal 16G\n");
431a9de470cSBruce Richardson return -1;
432a9de470cSBruce Richardson }
433a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
434a9de470cSBruce Richardson printf("Fail memzone free\n");
435a9de470cSBruce Richardson return -1;
436a9de470cSBruce Richardson }
437a9de470cSBruce Richardson
438a9de470cSBruce Richardson /* Check if 1GB huge pages are unavailable, that function fails
439a9de470cSBruce Richardson * unless HINT flag is indicated
440a9de470cSBruce Richardson */
441a9de470cSBruce Richardson if (!hugepage_16MB_avail) {
442a9de470cSBruce Richardson mz = rte_memzone_reserve(
443a9de470cSBruce Richardson TEST_MEMZONE_NAME("flag_zone_16M_HINT"),
444a9de470cSBruce Richardson size, SOCKET_ID_ANY,
445a9de470cSBruce Richardson RTE_MEMZONE_16MB |
446a9de470cSBruce Richardson RTE_MEMZONE_SIZE_HINT_ONLY);
447a9de470cSBruce Richardson if (mz == NULL) {
448a9de470cSBruce Richardson printf("MEMZONE FLAG 16MB & HINT\n");
449a9de470cSBruce Richardson return -1;
450a9de470cSBruce Richardson }
451a9de470cSBruce Richardson if (mz->hugepage_sz != RTE_PGSIZE_16G) {
452a9de470cSBruce Richardson printf("hugepage_sz not equal 16G\n");
453a9de470cSBruce Richardson return -1;
454a9de470cSBruce Richardson }
455a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
456a9de470cSBruce Richardson printf("Fail memzone free\n");
457a9de470cSBruce Richardson return -1;
458a9de470cSBruce Richardson }
459a9de470cSBruce Richardson mz = rte_memzone_reserve(
460a9de470cSBruce Richardson TEST_MEMZONE_NAME("flag_zone_16M"),
461a9de470cSBruce Richardson size, SOCKET_ID_ANY, RTE_MEMZONE_16MB);
462a9de470cSBruce Richardson if (mz != NULL) {
463a9de470cSBruce Richardson printf("MEMZONE FLAG 16MB\n");
464a9de470cSBruce Richardson return -1;
465a9de470cSBruce Richardson }
466a9de470cSBruce Richardson }
467a9de470cSBruce Richardson
468a9de470cSBruce Richardson if (hugepage_16MB_avail && hugepage_16GB_avail) {
469a9de470cSBruce Richardson mz = rte_memzone_reserve(
470a9de470cSBruce Richardson TEST_MEMZONE_NAME("flag_zone_16M_HINT"),
471a9de470cSBruce Richardson size, SOCKET_ID_ANY,
472a9de470cSBruce Richardson RTE_MEMZONE_16MB|RTE_MEMZONE_16GB);
473a9de470cSBruce Richardson if (mz == NULL) {
474a9de470cSBruce Richardson printf("BOTH SIZES SET\n");
475a9de470cSBruce Richardson return -1;
476a9de470cSBruce Richardson }
477a9de470cSBruce Richardson if (mz->hugepage_sz != RTE_PGSIZE_16G &&
478a9de470cSBruce Richardson mz->hugepage_sz != RTE_PGSIZE_16M) {
479a9de470cSBruce Richardson printf("Wrong size when both sizes set\n");
480a9de470cSBruce Richardson return -1;
481a9de470cSBruce Richardson }
482a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
483a9de470cSBruce Richardson printf("Fail memzone free\n");
484a9de470cSBruce Richardson return -1;
485a9de470cSBruce Richardson }
486a9de470cSBruce Richardson }
487a9de470cSBruce Richardson }
488a9de470cSBruce Richardson return 0;
489a9de470cSBruce Richardson }
490a9de470cSBruce Richardson
491a9de470cSBruce Richardson
492a9de470cSBruce Richardson /* Find the heap with the greatest free block size */
493a9de470cSBruce Richardson static size_t
find_max_block_free_size(unsigned int align,unsigned int socket_id)494a9de470cSBruce Richardson find_max_block_free_size(unsigned int align, unsigned int socket_id)
495a9de470cSBruce Richardson {
496a9de470cSBruce Richardson struct rte_malloc_socket_stats stats;
497a9de470cSBruce Richardson size_t len, overhead;
498a9de470cSBruce Richardson
4991d3bb890SAndrzej Ostruszka if (rte_malloc_get_socket_stats(socket_id, &stats) < 0)
5001d3bb890SAndrzej Ostruszka return 0;
501a9de470cSBruce Richardson
502a9de470cSBruce Richardson len = stats.greatest_free_size;
503a9de470cSBruce Richardson overhead = MALLOC_ELEM_OVERHEAD;
504a9de470cSBruce Richardson
505a9de470cSBruce Richardson if (len == 0)
506a9de470cSBruce Richardson return 0;
507a9de470cSBruce Richardson
508a9de470cSBruce Richardson align = RTE_CACHE_LINE_ROUNDUP(align);
509a9de470cSBruce Richardson overhead += align;
510a9de470cSBruce Richardson
511a9de470cSBruce Richardson if (len < overhead)
512a9de470cSBruce Richardson return 0;
513a9de470cSBruce Richardson
514a9de470cSBruce Richardson return len - overhead;
515a9de470cSBruce Richardson }
516a9de470cSBruce Richardson
517a9de470cSBruce Richardson static int
test_memzone_reserve_max(void)518a9de470cSBruce Richardson test_memzone_reserve_max(void)
519a9de470cSBruce Richardson {
520a9de470cSBruce Richardson unsigned int i;
521a9de470cSBruce Richardson
522a9de470cSBruce Richardson for (i = 0; i < rte_socket_count(); i++) {
523a9de470cSBruce Richardson const struct rte_memzone *mz;
524a9de470cSBruce Richardson size_t maxlen;
525a9de470cSBruce Richardson int socket;
526a9de470cSBruce Richardson
527a9de470cSBruce Richardson socket = rte_socket_id_by_idx(i);
528a9de470cSBruce Richardson maxlen = find_max_block_free_size(0, socket);
529a9de470cSBruce Richardson
530a9de470cSBruce Richardson if (maxlen == 0) {
531a9de470cSBruce Richardson printf("There is no space left!\n");
532a9de470cSBruce Richardson return 0;
533a9de470cSBruce Richardson }
534a9de470cSBruce Richardson
535a9de470cSBruce Richardson mz = rte_memzone_reserve(TEST_MEMZONE_NAME("max_zone"), 0,
536a9de470cSBruce Richardson socket, 0);
537a9de470cSBruce Richardson if (mz == NULL) {
538a9de470cSBruce Richardson printf("Failed to reserve a big chunk of memory - %s\n",
539a9de470cSBruce Richardson rte_strerror(rte_errno));
540a9de470cSBruce Richardson rte_dump_physmem_layout(stdout);
541a9de470cSBruce Richardson rte_memzone_dump(stdout);
542a9de470cSBruce Richardson return -1;
543a9de470cSBruce Richardson }
544a9de470cSBruce Richardson
545a9de470cSBruce Richardson if (mz->len != maxlen) {
5467be78d02SJosh Soref printf("Memzone reserve with 0 size did not return biggest block\n");
547a9de470cSBruce Richardson printf("Expected size = %zu, actual size = %zu\n",
548a9de470cSBruce Richardson maxlen, mz->len);
549a9de470cSBruce Richardson rte_dump_physmem_layout(stdout);
550a9de470cSBruce Richardson rte_memzone_dump(stdout);
551a9de470cSBruce Richardson return -1;
552a9de470cSBruce Richardson }
553a9de470cSBruce Richardson
554a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
555a9de470cSBruce Richardson printf("Fail memzone free\n");
556a9de470cSBruce Richardson return -1;
557a9de470cSBruce Richardson }
558a9de470cSBruce Richardson }
559a9de470cSBruce Richardson
560a9de470cSBruce Richardson return 0;
561a9de470cSBruce Richardson }
562a9de470cSBruce Richardson
563a9de470cSBruce Richardson static int
test_memzone_reserve_max_aligned(void)564a9de470cSBruce Richardson test_memzone_reserve_max_aligned(void)
565a9de470cSBruce Richardson {
566a9de470cSBruce Richardson unsigned int i;
567a9de470cSBruce Richardson
568a9de470cSBruce Richardson for (i = 0; i < rte_socket_count(); i++) {
569a9de470cSBruce Richardson const struct rte_memzone *mz;
570a9de470cSBruce Richardson size_t maxlen, minlen = 0;
571a9de470cSBruce Richardson int socket;
572a9de470cSBruce Richardson
573a9de470cSBruce Richardson socket = rte_socket_id_by_idx(i);
574a9de470cSBruce Richardson
575a9de470cSBruce Richardson /* random alignment */
576a9de470cSBruce Richardson const unsigned int align = 1 << ((rte_rand() % 8) + 5); /* from 128 up to 4k alignment */
577a9de470cSBruce Richardson
578a9de470cSBruce Richardson /* memzone size may be between size and size - align */
579a9de470cSBruce Richardson minlen = find_max_block_free_size(align, socket);
580a9de470cSBruce Richardson maxlen = find_max_block_free_size(0, socket);
581a9de470cSBruce Richardson
582a9de470cSBruce Richardson if (minlen == 0 || maxlen == 0) {
583a9de470cSBruce Richardson printf("There is no space left for biggest %u-aligned memzone!\n",
584a9de470cSBruce Richardson align);
585a9de470cSBruce Richardson return 0;
586a9de470cSBruce Richardson }
587a9de470cSBruce Richardson
588a9de470cSBruce Richardson mz = rte_memzone_reserve_aligned(
589a9de470cSBruce Richardson TEST_MEMZONE_NAME("max_zone_aligned"),
590a9de470cSBruce Richardson 0, socket, 0, align);
591a9de470cSBruce Richardson if (mz == NULL) {
592a9de470cSBruce Richardson printf("Failed to reserve a big chunk of memory - %s\n",
593a9de470cSBruce Richardson rte_strerror(rte_errno));
594a9de470cSBruce Richardson rte_dump_physmem_layout(stdout);
595a9de470cSBruce Richardson rte_memzone_dump(stdout);
596a9de470cSBruce Richardson return -1;
597a9de470cSBruce Richardson }
598a9de470cSBruce Richardson if (mz->addr != RTE_PTR_ALIGN(mz->addr, align)) {
599a9de470cSBruce Richardson printf("Memzone reserve with 0 size and alignment %u did not return aligned block\n",
600a9de470cSBruce Richardson align);
601a9de470cSBruce Richardson rte_dump_physmem_layout(stdout);
602a9de470cSBruce Richardson rte_memzone_dump(stdout);
603a9de470cSBruce Richardson return -1;
604a9de470cSBruce Richardson }
605a9de470cSBruce Richardson
606a9de470cSBruce Richardson if (mz->len < minlen || mz->len > maxlen) {
607a9de470cSBruce Richardson printf("Memzone reserve with 0 size and alignment %u did not return"
6087be78d02SJosh Soref " biggest block\n", align);
609a9de470cSBruce Richardson printf("Expected size = %zu-%zu, actual size = %zu\n",
610a9de470cSBruce Richardson minlen, maxlen, mz->len);
611a9de470cSBruce Richardson rte_dump_physmem_layout(stdout);
612a9de470cSBruce Richardson rte_memzone_dump(stdout);
613a9de470cSBruce Richardson return -1;
614a9de470cSBruce Richardson }
615a9de470cSBruce Richardson
616a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
617a9de470cSBruce Richardson printf("Fail memzone free\n");
618a9de470cSBruce Richardson return -1;
619a9de470cSBruce Richardson }
620a9de470cSBruce Richardson }
621a9de470cSBruce Richardson return 0;
622a9de470cSBruce Richardson }
623a9de470cSBruce Richardson
624a9de470cSBruce Richardson static int
test_memzone_aligned(void)625a9de470cSBruce Richardson test_memzone_aligned(void)
626a9de470cSBruce Richardson {
627a9de470cSBruce Richardson const struct rte_memzone *memzone_aligned_32;
628a9de470cSBruce Richardson const struct rte_memzone *memzone_aligned_128;
629a9de470cSBruce Richardson const struct rte_memzone *memzone_aligned_256;
630a9de470cSBruce Richardson const struct rte_memzone *memzone_aligned_512;
631a9de470cSBruce Richardson const struct rte_memzone *memzone_aligned_1024;
632a9de470cSBruce Richardson
633a9de470cSBruce Richardson /* memzone that should automatically be adjusted to align on 64 bytes */
634a9de470cSBruce Richardson memzone_aligned_32 = rte_memzone_reserve_aligned(
635a9de470cSBruce Richardson TEST_MEMZONE_NAME("aligned_32"), 100, SOCKET_ID_ANY, 0,
636a9de470cSBruce Richardson 32);
637a9de470cSBruce Richardson
638a9de470cSBruce Richardson /* memzone that is supposed to be aligned on a 128 byte boundary */
639a9de470cSBruce Richardson memzone_aligned_128 = rte_memzone_reserve_aligned(
640a9de470cSBruce Richardson TEST_MEMZONE_NAME("aligned_128"), 100, SOCKET_ID_ANY, 0,
641a9de470cSBruce Richardson 128);
642a9de470cSBruce Richardson
643a9de470cSBruce Richardson /* memzone that is supposed to be aligned on a 256 byte boundary */
644a9de470cSBruce Richardson memzone_aligned_256 = rte_memzone_reserve_aligned(
645a9de470cSBruce Richardson TEST_MEMZONE_NAME("aligned_256"), 100, SOCKET_ID_ANY, 0,
646a9de470cSBruce Richardson 256);
647a9de470cSBruce Richardson
648a9de470cSBruce Richardson /* memzone that is supposed to be aligned on a 512 byte boundary */
649a9de470cSBruce Richardson memzone_aligned_512 = rte_memzone_reserve_aligned(
650a9de470cSBruce Richardson TEST_MEMZONE_NAME("aligned_512"), 100, SOCKET_ID_ANY, 0,
651a9de470cSBruce Richardson 512);
652a9de470cSBruce Richardson
653a9de470cSBruce Richardson /* memzone that is supposed to be aligned on a 1024 byte boundary */
654a9de470cSBruce Richardson memzone_aligned_1024 = rte_memzone_reserve_aligned(
655a9de470cSBruce Richardson TEST_MEMZONE_NAME("aligned_1024"), 100, SOCKET_ID_ANY,
656a9de470cSBruce Richardson 0, 1024);
657a9de470cSBruce Richardson
658a9de470cSBruce Richardson printf("check alignments and lengths\n");
659a9de470cSBruce Richardson if (memzone_aligned_32 == NULL) {
660a9de470cSBruce Richardson printf("Unable to reserve 64-byte aligned memzone!\n");
661a9de470cSBruce Richardson return -1;
662a9de470cSBruce Richardson }
663a9de470cSBruce Richardson if ((memzone_aligned_32->iova & RTE_CACHE_LINE_MASK) != 0)
664a9de470cSBruce Richardson return -1;
665a9de470cSBruce Richardson if (((uintptr_t) memzone_aligned_32->addr & RTE_CACHE_LINE_MASK) != 0)
666a9de470cSBruce Richardson return -1;
667a9de470cSBruce Richardson if ((memzone_aligned_32->len & RTE_CACHE_LINE_MASK) != 0)
668a9de470cSBruce Richardson return -1;
669a9de470cSBruce Richardson
670a9de470cSBruce Richardson if (memzone_aligned_128 == NULL) {
671a9de470cSBruce Richardson printf("Unable to reserve 128-byte aligned memzone!\n");
672a9de470cSBruce Richardson return -1;
673a9de470cSBruce Richardson }
674a9de470cSBruce Richardson if ((memzone_aligned_128->iova & 127) != 0)
675a9de470cSBruce Richardson return -1;
676a9de470cSBruce Richardson if (((uintptr_t) memzone_aligned_128->addr & 127) != 0)
677a9de470cSBruce Richardson return -1;
678a9de470cSBruce Richardson if ((memzone_aligned_128->len & RTE_CACHE_LINE_MASK) != 0)
679a9de470cSBruce Richardson return -1;
680a9de470cSBruce Richardson
681a9de470cSBruce Richardson if (memzone_aligned_256 == NULL) {
682a9de470cSBruce Richardson printf("Unable to reserve 256-byte aligned memzone!\n");
683a9de470cSBruce Richardson return -1;
684a9de470cSBruce Richardson }
685a9de470cSBruce Richardson if ((memzone_aligned_256->iova & 255) != 0)
686a9de470cSBruce Richardson return -1;
687a9de470cSBruce Richardson if (((uintptr_t) memzone_aligned_256->addr & 255) != 0)
688a9de470cSBruce Richardson return -1;
689a9de470cSBruce Richardson if ((memzone_aligned_256->len & RTE_CACHE_LINE_MASK) != 0)
690a9de470cSBruce Richardson return -1;
691a9de470cSBruce Richardson
692a9de470cSBruce Richardson if (memzone_aligned_512 == NULL) {
693a9de470cSBruce Richardson printf("Unable to reserve 512-byte aligned memzone!\n");
694a9de470cSBruce Richardson return -1;
695a9de470cSBruce Richardson }
696a9de470cSBruce Richardson if ((memzone_aligned_512->iova & 511) != 0)
697a9de470cSBruce Richardson return -1;
698a9de470cSBruce Richardson if (((uintptr_t) memzone_aligned_512->addr & 511) != 0)
699a9de470cSBruce Richardson return -1;
700a9de470cSBruce Richardson if ((memzone_aligned_512->len & RTE_CACHE_LINE_MASK) != 0)
701a9de470cSBruce Richardson return -1;
702a9de470cSBruce Richardson
703a9de470cSBruce Richardson if (memzone_aligned_1024 == NULL) {
704a9de470cSBruce Richardson printf("Unable to reserve 1024-byte aligned memzone!\n");
705a9de470cSBruce Richardson return -1;
706a9de470cSBruce Richardson }
707a9de470cSBruce Richardson if ((memzone_aligned_1024->iova & 1023) != 0)
708a9de470cSBruce Richardson return -1;
709a9de470cSBruce Richardson if (((uintptr_t) memzone_aligned_1024->addr & 1023) != 0)
710a9de470cSBruce Richardson return -1;
711a9de470cSBruce Richardson if ((memzone_aligned_1024->len & RTE_CACHE_LINE_MASK) != 0)
712a9de470cSBruce Richardson return -1;
713a9de470cSBruce Richardson
714a9de470cSBruce Richardson /* check that zones don't overlap */
715a9de470cSBruce Richardson printf("check overlapping\n");
716a9de470cSBruce Richardson if (is_memory_overlap(memzone_aligned_32->iova, memzone_aligned_32->len,
717a9de470cSBruce Richardson memzone_aligned_128->iova, memzone_aligned_128->len))
718a9de470cSBruce Richardson return -1;
719a9de470cSBruce Richardson if (is_memory_overlap(memzone_aligned_32->iova, memzone_aligned_32->len,
720a9de470cSBruce Richardson memzone_aligned_256->iova, memzone_aligned_256->len))
721a9de470cSBruce Richardson return -1;
722a9de470cSBruce Richardson if (is_memory_overlap(memzone_aligned_32->iova, memzone_aligned_32->len,
723a9de470cSBruce Richardson memzone_aligned_512->iova, memzone_aligned_512->len))
724a9de470cSBruce Richardson return -1;
725a9de470cSBruce Richardson if (is_memory_overlap(memzone_aligned_32->iova, memzone_aligned_32->len,
726a9de470cSBruce Richardson memzone_aligned_1024->iova, memzone_aligned_1024->len))
727a9de470cSBruce Richardson return -1;
728a9de470cSBruce Richardson if (is_memory_overlap(memzone_aligned_128->iova, memzone_aligned_128->len,
729a9de470cSBruce Richardson memzone_aligned_256->iova, memzone_aligned_256->len))
730a9de470cSBruce Richardson return -1;
731a9de470cSBruce Richardson if (is_memory_overlap(memzone_aligned_128->iova, memzone_aligned_128->len,
732a9de470cSBruce Richardson memzone_aligned_512->iova, memzone_aligned_512->len))
733a9de470cSBruce Richardson return -1;
734a9de470cSBruce Richardson if (is_memory_overlap(memzone_aligned_128->iova, memzone_aligned_128->len,
735a9de470cSBruce Richardson memzone_aligned_1024->iova, memzone_aligned_1024->len))
736a9de470cSBruce Richardson return -1;
737a9de470cSBruce Richardson if (is_memory_overlap(memzone_aligned_256->iova, memzone_aligned_256->len,
738a9de470cSBruce Richardson memzone_aligned_512->iova, memzone_aligned_512->len))
739a9de470cSBruce Richardson return -1;
740a9de470cSBruce Richardson if (is_memory_overlap(memzone_aligned_256->iova, memzone_aligned_256->len,
741a9de470cSBruce Richardson memzone_aligned_1024->iova, memzone_aligned_1024->len))
742a9de470cSBruce Richardson return -1;
743a9de470cSBruce Richardson if (is_memory_overlap(memzone_aligned_512->iova, memzone_aligned_512->len,
744a9de470cSBruce Richardson memzone_aligned_1024->iova, memzone_aligned_1024->len))
745a9de470cSBruce Richardson return -1;
746a9de470cSBruce Richardson
747a9de470cSBruce Richardson /* free all used zones */
748a9de470cSBruce Richardson if (rte_memzone_free(memzone_aligned_32)) {
749a9de470cSBruce Richardson printf("Fail memzone free\n");
750a9de470cSBruce Richardson return -1;
751a9de470cSBruce Richardson }
752a9de470cSBruce Richardson if (rte_memzone_free(memzone_aligned_128)) {
753a9de470cSBruce Richardson printf("Fail memzone free\n");
754a9de470cSBruce Richardson return -1;
755a9de470cSBruce Richardson }
756a9de470cSBruce Richardson if (rte_memzone_free(memzone_aligned_256)) {
757a9de470cSBruce Richardson printf("Fail memzone free\n");
758a9de470cSBruce Richardson return -1;
759a9de470cSBruce Richardson }
760a9de470cSBruce Richardson if (rte_memzone_free(memzone_aligned_512)) {
761a9de470cSBruce Richardson printf("Fail memzone free\n");
762a9de470cSBruce Richardson return -1;
763a9de470cSBruce Richardson }
764a9de470cSBruce Richardson if (rte_memzone_free(memzone_aligned_1024)) {
765a9de470cSBruce Richardson printf("Fail memzone free\n");
766a9de470cSBruce Richardson return -1;
767a9de470cSBruce Richardson }
768a9de470cSBruce Richardson return 0;
769a9de470cSBruce Richardson }
770a9de470cSBruce Richardson
771a9de470cSBruce Richardson static int
check_memzone_bounded(const char * name,uint32_t len,uint32_t align,uint32_t bound)772a9de470cSBruce Richardson check_memzone_bounded(const char *name, uint32_t len, uint32_t align,
773a9de470cSBruce Richardson uint32_t bound)
774a9de470cSBruce Richardson {
775a9de470cSBruce Richardson const struct rte_memzone *mz;
776a9de470cSBruce Richardson rte_iova_t bmask;
777a9de470cSBruce Richardson
778a9de470cSBruce Richardson bmask = ~((rte_iova_t)bound - 1);
779a9de470cSBruce Richardson
780a9de470cSBruce Richardson if ((mz = rte_memzone_reserve_bounded(name, len, SOCKET_ID_ANY, 0,
781a9de470cSBruce Richardson align, bound)) == NULL) {
782a9de470cSBruce Richardson printf("%s(%s): memzone creation failed\n",
783a9de470cSBruce Richardson __func__, name);
784a9de470cSBruce Richardson return -1;
785a9de470cSBruce Richardson }
786a9de470cSBruce Richardson
787a9de470cSBruce Richardson if ((mz->iova & ((rte_iova_t)align - 1)) != 0) {
788a9de470cSBruce Richardson printf("%s(%s): invalid phys addr alignment\n",
789a9de470cSBruce Richardson __func__, mz->name);
790a9de470cSBruce Richardson return -1;
791a9de470cSBruce Richardson }
792a9de470cSBruce Richardson
793a9de470cSBruce Richardson if (((uintptr_t) mz->addr & ((uintptr_t)align - 1)) != 0) {
794a9de470cSBruce Richardson printf("%s(%s): invalid virtual addr alignment\n",
795a9de470cSBruce Richardson __func__, mz->name);
796a9de470cSBruce Richardson return -1;
797a9de470cSBruce Richardson }
798a9de470cSBruce Richardson
799a9de470cSBruce Richardson if ((mz->len & RTE_CACHE_LINE_MASK) != 0 || mz->len < len ||
800a9de470cSBruce Richardson mz->len < RTE_CACHE_LINE_SIZE) {
801a9de470cSBruce Richardson printf("%s(%s): invalid length\n",
802a9de470cSBruce Richardson __func__, mz->name);
803a9de470cSBruce Richardson return -1;
804a9de470cSBruce Richardson }
805a9de470cSBruce Richardson
806a9de470cSBruce Richardson if ((mz->iova & bmask) !=
807a9de470cSBruce Richardson ((mz->iova + mz->len - 1) & bmask)) {
808a9de470cSBruce Richardson printf("%s(%s): invalid memzone boundary %u crossed\n",
809a9de470cSBruce Richardson __func__, mz->name, bound);
810a9de470cSBruce Richardson return -1;
811a9de470cSBruce Richardson }
812a9de470cSBruce Richardson
813a9de470cSBruce Richardson if (rte_memzone_free(mz)) {
814a9de470cSBruce Richardson printf("Fail memzone free\n");
815a9de470cSBruce Richardson return -1;
816a9de470cSBruce Richardson }
817a9de470cSBruce Richardson
818a9de470cSBruce Richardson return 0;
819a9de470cSBruce Richardson }
820a9de470cSBruce Richardson
821a9de470cSBruce Richardson static int
test_memzone_bounded(void)822a9de470cSBruce Richardson test_memzone_bounded(void)
823a9de470cSBruce Richardson {
824a9de470cSBruce Richardson const struct rte_memzone *memzone_err;
825a9de470cSBruce Richardson int rc;
826a9de470cSBruce Richardson
827a9de470cSBruce Richardson /* should fail as boundary is not power of two */
828a9de470cSBruce Richardson memzone_err = rte_memzone_reserve_bounded(
829a9de470cSBruce Richardson TEST_MEMZONE_NAME("bounded_error_31"), 100,
830a9de470cSBruce Richardson SOCKET_ID_ANY, 0, 32, UINT32_MAX);
831a9de470cSBruce Richardson if (memzone_err != NULL) {
832a9de470cSBruce Richardson printf("%s(%s)created a memzone with invalid boundary "
833a9de470cSBruce Richardson "conditions\n", __func__, memzone_err->name);
834a9de470cSBruce Richardson return -1;
835a9de470cSBruce Richardson }
836a9de470cSBruce Richardson
837a9de470cSBruce Richardson /* should fail as len is greater then boundary */
838a9de470cSBruce Richardson memzone_err = rte_memzone_reserve_bounded(
839a9de470cSBruce Richardson TEST_MEMZONE_NAME("bounded_error_32"), 100,
840a9de470cSBruce Richardson SOCKET_ID_ANY, 0, 32, 32);
841a9de470cSBruce Richardson if (memzone_err != NULL) {
842a9de470cSBruce Richardson printf("%s(%s)created a memzone with invalid boundary "
843a9de470cSBruce Richardson "conditions\n", __func__, memzone_err->name);
844a9de470cSBruce Richardson return -1;
845a9de470cSBruce Richardson }
846a9de470cSBruce Richardson
847a9de470cSBruce Richardson rc = check_memzone_bounded(TEST_MEMZONE_NAME("bounded_128"), 100, 128,
848a9de470cSBruce Richardson 128);
849a9de470cSBruce Richardson if (rc != 0)
850a9de470cSBruce Richardson return rc;
851a9de470cSBruce Richardson
852a9de470cSBruce Richardson rc = check_memzone_bounded(TEST_MEMZONE_NAME("bounded_256"), 100, 256,
853a9de470cSBruce Richardson 128);
854a9de470cSBruce Richardson if (rc != 0)
855a9de470cSBruce Richardson return rc;
856a9de470cSBruce Richardson
857a9de470cSBruce Richardson rc = check_memzone_bounded(TEST_MEMZONE_NAME("bounded_1K"), 100, 64,
858a9de470cSBruce Richardson 1024);
859a9de470cSBruce Richardson if (rc != 0)
860a9de470cSBruce Richardson return rc;
861a9de470cSBruce Richardson
862a9de470cSBruce Richardson rc = check_memzone_bounded(TEST_MEMZONE_NAME("bounded_1K_MAX"), 0, 64,
863a9de470cSBruce Richardson 1024);
864a9de470cSBruce Richardson if (rc != 0)
865a9de470cSBruce Richardson return rc;
866a9de470cSBruce Richardson
867a9de470cSBruce Richardson return 0;
868a9de470cSBruce Richardson }
869a9de470cSBruce Richardson
870a9de470cSBruce Richardson static int
test_memzone_free(void)871a9de470cSBruce Richardson test_memzone_free(void)
872a9de470cSBruce Richardson {
87338689022SOphir Munk const struct rte_memzone **mz;
874a9de470cSBruce Richardson int i;
875a9de470cSBruce Richardson char name[20];
87638689022SOphir Munk int rc = -1;
87738689022SOphir Munk
87838689022SOphir Munk mz = rte_calloc("memzone_test", rte_memzone_max_get() + 1,
87938689022SOphir Munk sizeof(struct rte_memzone *), 0);
88038689022SOphir Munk if (!mz) {
88138689022SOphir Munk printf("Fail allocating memzone test array\n");
88238689022SOphir Munk return rc;
88338689022SOphir Munk }
884a9de470cSBruce Richardson
885a9de470cSBruce Richardson mz[0] = rte_memzone_reserve(TEST_MEMZONE_NAME("tempzone0"), 2000,
886a9de470cSBruce Richardson SOCKET_ID_ANY, 0);
887a9de470cSBruce Richardson mz[1] = rte_memzone_reserve(TEST_MEMZONE_NAME("tempzone1"), 4000,
888a9de470cSBruce Richardson SOCKET_ID_ANY, 0);
889a9de470cSBruce Richardson
890a9de470cSBruce Richardson if (mz[0] > mz[1])
89138689022SOphir Munk goto exit_test;
892a9de470cSBruce Richardson if (!rte_memzone_lookup(TEST_MEMZONE_NAME("tempzone0")))
89338689022SOphir Munk goto exit_test;
894a9de470cSBruce Richardson if (!rte_memzone_lookup(TEST_MEMZONE_NAME("tempzone1")))
89538689022SOphir Munk goto exit_test;
896a9de470cSBruce Richardson
897a9de470cSBruce Richardson if (rte_memzone_free(mz[0])) {
898a9de470cSBruce Richardson printf("Fail memzone free - tempzone0\n");
89938689022SOphir Munk goto exit_test;
900a9de470cSBruce Richardson }
901a9de470cSBruce Richardson if (rte_memzone_lookup(TEST_MEMZONE_NAME("tempzone0"))) {
902a9de470cSBruce Richardson printf("Found previously free memzone - tempzone0\n");
90338689022SOphir Munk goto exit_test;
904a9de470cSBruce Richardson }
905a9de470cSBruce Richardson mz[2] = rte_memzone_reserve(TEST_MEMZONE_NAME("tempzone2"), 2000,
906a9de470cSBruce Richardson SOCKET_ID_ANY, 0);
907a9de470cSBruce Richardson
908a9de470cSBruce Richardson if (mz[2] > mz[1]) {
909a9de470cSBruce Richardson printf("tempzone2 should have gotten the free entry from tempzone0\n");
91038689022SOphir Munk goto exit_test;
911a9de470cSBruce Richardson }
912a9de470cSBruce Richardson if (rte_memzone_free(mz[2])) {
913a9de470cSBruce Richardson printf("Fail memzone free - tempzone2\n");
91438689022SOphir Munk goto exit_test;
915a9de470cSBruce Richardson }
916a9de470cSBruce Richardson if (rte_memzone_lookup(TEST_MEMZONE_NAME("tempzone2"))) {
917a9de470cSBruce Richardson printf("Found previously free memzone - tempzone2\n");
91838689022SOphir Munk goto exit_test;
919a9de470cSBruce Richardson }
920a9de470cSBruce Richardson if (rte_memzone_free(mz[1])) {
921a9de470cSBruce Richardson printf("Fail memzone free - tempzone1\n");
92238689022SOphir Munk goto exit_test;
923a9de470cSBruce Richardson }
924a9de470cSBruce Richardson if (rte_memzone_lookup(TEST_MEMZONE_NAME("tempzone1"))) {
925a9de470cSBruce Richardson printf("Found previously free memzone - tempzone1\n");
92638689022SOphir Munk goto exit_test;
927a9de470cSBruce Richardson }
928a9de470cSBruce Richardson
929a9de470cSBruce Richardson i = 0;
930a9de470cSBruce Richardson do {
931a9de470cSBruce Richardson snprintf(name, sizeof(name), TEST_MEMZONE_NAME("tempzone%u"),
932a9de470cSBruce Richardson i);
933a9de470cSBruce Richardson mz[i] = rte_memzone_reserve(name, 1, SOCKET_ID_ANY, 0);
934a9de470cSBruce Richardson } while (mz[i++] != NULL);
935a9de470cSBruce Richardson
936a9de470cSBruce Richardson if (rte_memzone_free(mz[0])) {
937a9de470cSBruce Richardson printf("Fail memzone free - tempzone0\n");
93838689022SOphir Munk goto exit_test;
939a9de470cSBruce Richardson }
940a9de470cSBruce Richardson mz[0] = rte_memzone_reserve(TEST_MEMZONE_NAME("tempzone0new"), 0,
941a9de470cSBruce Richardson SOCKET_ID_ANY, 0);
942a9de470cSBruce Richardson
943a9de470cSBruce Richardson if (mz[0] == NULL) {
944a9de470cSBruce Richardson printf("Fail to create memzone - tempzone0new - when MAX memzones were "
945a9de470cSBruce Richardson "created and one was free\n");
94638689022SOphir Munk goto exit_test;
947a9de470cSBruce Richardson }
948a9de470cSBruce Richardson
949a9de470cSBruce Richardson for (i = i - 2; i >= 0; i--) {
950a9de470cSBruce Richardson if (rte_memzone_free(mz[i])) {
951a9de470cSBruce Richardson printf("Fail memzone free - tempzone%d\n", i);
95238689022SOphir Munk goto exit_test;
953a9de470cSBruce Richardson }
954a9de470cSBruce Richardson }
955a9de470cSBruce Richardson
95638689022SOphir Munk rc = 0;
95738689022SOphir Munk
95838689022SOphir Munk exit_test:
95938689022SOphir Munk rte_free(mz);
96038689022SOphir Munk return rc;
961a9de470cSBruce Richardson }
962a9de470cSBruce Richardson
963ab35397eSDavid Marchand static int test_memzones_left;
964ab35397eSDavid Marchand static int memzone_walk_cnt;
memzone_walk_clb(const struct rte_memzone * mz,void * arg __rte_unused)965ab35397eSDavid Marchand static void memzone_walk_clb(const struct rte_memzone *mz,
966ab35397eSDavid Marchand void *arg __rte_unused)
967ab35397eSDavid Marchand {
968ab35397eSDavid Marchand memzone_walk_cnt++;
969ab35397eSDavid Marchand if (!strncmp(TEST_MEMZONE_NAME(""), mz->name, RTE_MEMZONE_NAMESIZE))
970ab35397eSDavid Marchand test_memzones_left++;
971ab35397eSDavid Marchand }
972ab35397eSDavid Marchand
973a9de470cSBruce Richardson static int
test_memzone_basic(void)974a9de470cSBruce Richardson test_memzone_basic(void)
975a9de470cSBruce Richardson {
976a9de470cSBruce Richardson const struct rte_memzone *memzone1;
977a9de470cSBruce Richardson const struct rte_memzone *memzone2;
978a9de470cSBruce Richardson const struct rte_memzone *memzone3;
979a9de470cSBruce Richardson const struct rte_memzone *memzone4;
980a9de470cSBruce Richardson const struct rte_memzone *mz;
981a9de470cSBruce Richardson int memzone_cnt_after, memzone_cnt_expected;
982ab35397eSDavid Marchand int memzone_cnt_before;
983ab35397eSDavid Marchand
984ab35397eSDavid Marchand memzone_walk_cnt = 0;
985ab35397eSDavid Marchand test_memzones_left = 0;
986ab35397eSDavid Marchand rte_memzone_walk(memzone_walk_clb, NULL);
987ab35397eSDavid Marchand memzone_cnt_before = memzone_walk_cnt;
988a9de470cSBruce Richardson
989a9de470cSBruce Richardson memzone1 = rte_memzone_reserve(TEST_MEMZONE_NAME("testzone1"), 100,
990a9de470cSBruce Richardson SOCKET_ID_ANY, 0);
991a9de470cSBruce Richardson
992a9de470cSBruce Richardson memzone2 = rte_memzone_reserve(TEST_MEMZONE_NAME("testzone2"), 1000,
993a9de470cSBruce Richardson 0, 0);
994a9de470cSBruce Richardson
995a9de470cSBruce Richardson memzone3 = rte_memzone_reserve(TEST_MEMZONE_NAME("testzone3"), 1000,
996a9de470cSBruce Richardson 1, 0);
997a9de470cSBruce Richardson
998a9de470cSBruce Richardson memzone4 = rte_memzone_reserve(TEST_MEMZONE_NAME("testzone4"), 1024,
999a9de470cSBruce Richardson SOCKET_ID_ANY, 0);
1000a9de470cSBruce Richardson
1001a9de470cSBruce Richardson /* memzone3 may be NULL if we don't have NUMA */
1002a9de470cSBruce Richardson if (memzone1 == NULL || memzone2 == NULL || memzone4 == NULL)
1003a9de470cSBruce Richardson return -1;
1004a9de470cSBruce Richardson
1005a9de470cSBruce Richardson /* check how many memzones we are expecting */
1006a9de470cSBruce Richardson memzone_cnt_expected = memzone_cnt_before +
1007a9de470cSBruce Richardson (memzone1 != NULL) + (memzone2 != NULL) +
1008a9de470cSBruce Richardson (memzone3 != NULL) + (memzone4 != NULL);
1009a9de470cSBruce Richardson
1010ab35397eSDavid Marchand memzone_walk_cnt = 0;
1011ab35397eSDavid Marchand test_memzones_left = 0;
1012ab35397eSDavid Marchand rte_memzone_walk(memzone_walk_clb, NULL);
1013ab35397eSDavid Marchand memzone_cnt_after = memzone_walk_cnt;
1014a9de470cSBruce Richardson
1015a9de470cSBruce Richardson if (memzone_cnt_after != memzone_cnt_expected)
1016a9de470cSBruce Richardson return -1;
1017a9de470cSBruce Richardson
1018a9de470cSBruce Richardson
1019a9de470cSBruce Richardson rte_memzone_dump(stdout);
1020a9de470cSBruce Richardson
1021a9de470cSBruce Richardson /* check cache-line alignments */
1022a9de470cSBruce Richardson printf("check alignments and lengths\n");
1023a9de470cSBruce Richardson
1024a9de470cSBruce Richardson if ((memzone1->iova & RTE_CACHE_LINE_MASK) != 0)
1025a9de470cSBruce Richardson return -1;
1026a9de470cSBruce Richardson if ((memzone2->iova & RTE_CACHE_LINE_MASK) != 0)
1027a9de470cSBruce Richardson return -1;
1028a9de470cSBruce Richardson if (memzone3 != NULL && (memzone3->iova & RTE_CACHE_LINE_MASK) != 0)
1029a9de470cSBruce Richardson return -1;
1030a9de470cSBruce Richardson if ((memzone1->len & RTE_CACHE_LINE_MASK) != 0 || memzone1->len == 0)
1031a9de470cSBruce Richardson return -1;
1032a9de470cSBruce Richardson if ((memzone2->len & RTE_CACHE_LINE_MASK) != 0 || memzone2->len == 0)
1033a9de470cSBruce Richardson return -1;
1034a9de470cSBruce Richardson if (memzone3 != NULL && ((memzone3->len & RTE_CACHE_LINE_MASK) != 0 ||
1035a9de470cSBruce Richardson memzone3->len == 0))
1036a9de470cSBruce Richardson return -1;
1037a9de470cSBruce Richardson if (memzone4->len != 1024)
1038a9de470cSBruce Richardson return -1;
1039a9de470cSBruce Richardson
1040a9de470cSBruce Richardson /* check that zones don't overlap */
1041a9de470cSBruce Richardson printf("check overlapping\n");
1042a9de470cSBruce Richardson
1043a9de470cSBruce Richardson if (is_memory_overlap(memzone1->iova, memzone1->len,
1044a9de470cSBruce Richardson memzone2->iova, memzone2->len))
1045a9de470cSBruce Richardson return -1;
1046a9de470cSBruce Richardson if (memzone3 != NULL &&
1047a9de470cSBruce Richardson is_memory_overlap(memzone1->iova, memzone1->len,
1048a9de470cSBruce Richardson memzone3->iova, memzone3->len))
1049a9de470cSBruce Richardson return -1;
1050a9de470cSBruce Richardson if (memzone3 != NULL &&
1051a9de470cSBruce Richardson is_memory_overlap(memzone2->iova, memzone2->len,
1052a9de470cSBruce Richardson memzone3->iova, memzone3->len))
1053a9de470cSBruce Richardson return -1;
1054a9de470cSBruce Richardson
1055a9de470cSBruce Richardson printf("check socket ID\n");
1056a9de470cSBruce Richardson
1057a9de470cSBruce Richardson /* memzone2 must be on socket id 0 and memzone3 on socket 1 */
1058a9de470cSBruce Richardson if (memzone2->socket_id != 0)
1059a9de470cSBruce Richardson return -1;
1060a9de470cSBruce Richardson if (memzone3 != NULL && memzone3->socket_id != 1)
1061a9de470cSBruce Richardson return -1;
1062a9de470cSBruce Richardson
1063a9de470cSBruce Richardson printf("test zone lookup\n");
1064a9de470cSBruce Richardson mz = rte_memzone_lookup(TEST_MEMZONE_NAME("testzone1"));
1065a9de470cSBruce Richardson if (mz != memzone1)
1066a9de470cSBruce Richardson return -1;
1067a9de470cSBruce Richardson
10687be78d02SJosh Soref printf("test duplicate zone name\n");
1069a9de470cSBruce Richardson mz = rte_memzone_reserve(TEST_MEMZONE_NAME("testzone1"), 100,
1070a9de470cSBruce Richardson SOCKET_ID_ANY, 0);
1071a9de470cSBruce Richardson if (mz != NULL)
1072a9de470cSBruce Richardson return -1;
1073a9de470cSBruce Richardson
1074a9de470cSBruce Richardson if (rte_memzone_free(memzone1)) {
1075a9de470cSBruce Richardson printf("Fail memzone free - memzone1\n");
1076a9de470cSBruce Richardson return -1;
1077a9de470cSBruce Richardson }
1078a9de470cSBruce Richardson if (rte_memzone_free(memzone2)) {
1079a9de470cSBruce Richardson printf("Fail memzone free - memzone2\n");
1080a9de470cSBruce Richardson return -1;
1081a9de470cSBruce Richardson }
1082a9de470cSBruce Richardson if (memzone3 && rte_memzone_free(memzone3)) {
1083a9de470cSBruce Richardson printf("Fail memzone free - memzone3\n");
1084a9de470cSBruce Richardson return -1;
1085a9de470cSBruce Richardson }
1086a9de470cSBruce Richardson if (rte_memzone_free(memzone4)) {
1087a9de470cSBruce Richardson printf("Fail memzone free - memzone4\n");
1088a9de470cSBruce Richardson return -1;
1089a9de470cSBruce Richardson }
1090a9de470cSBruce Richardson
1091ab35397eSDavid Marchand memzone_walk_cnt = 0;
1092ab35397eSDavid Marchand test_memzones_left = 0;
1093ab35397eSDavid Marchand rte_memzone_walk(memzone_walk_clb, NULL);
1094ab35397eSDavid Marchand memzone_cnt_after = memzone_walk_cnt;
1095a9de470cSBruce Richardson if (memzone_cnt_after != memzone_cnt_before)
1096a9de470cSBruce Richardson return -1;
1097a9de470cSBruce Richardson
1098a9de470cSBruce Richardson return 0;
1099a9de470cSBruce Richardson }
1100a9de470cSBruce Richardson
1101a9de470cSBruce Richardson static int
test_memzone(void)1102a9de470cSBruce Richardson test_memzone(void)
1103a9de470cSBruce Richardson {
1104a9de470cSBruce Richardson /* take note of how many memzones were allocated before running */
1105ab35397eSDavid Marchand int memzone_cnt;
1106ab35397eSDavid Marchand
1107ab35397eSDavid Marchand memzone_walk_cnt = 0;
1108ab35397eSDavid Marchand test_memzones_left = 0;
1109ab35397eSDavid Marchand rte_memzone_walk(memzone_walk_clb, NULL);
1110ab35397eSDavid Marchand memzone_cnt = memzone_walk_cnt;
1111a9de470cSBruce Richardson
1112a9de470cSBruce Richardson printf("test basic memzone API\n");
1113a9de470cSBruce Richardson if (test_memzone_basic() < 0)
1114a9de470cSBruce Richardson return -1;
1115a9de470cSBruce Richardson
1116a9de470cSBruce Richardson printf("test free memzone\n");
1117a9de470cSBruce Richardson if (test_memzone_free() < 0)
1118a9de470cSBruce Richardson return -1;
1119a9de470cSBruce Richardson
1120a9de470cSBruce Richardson printf("test reserving memzone with bigger size than the maximum\n");
1121a9de470cSBruce Richardson if (test_memzone_reserving_zone_size_bigger_than_the_maximum() < 0)
1122a9de470cSBruce Richardson return -1;
1123a9de470cSBruce Richardson
1124a9de470cSBruce Richardson printf("test memzone_reserve flags\n");
1125a9de470cSBruce Richardson if (test_memzone_reserve_flags() < 0)
1126a9de470cSBruce Richardson return -1;
1127a9de470cSBruce Richardson
1128a9de470cSBruce Richardson printf("test alignment for memzone_reserve\n");
1129a9de470cSBruce Richardson if (test_memzone_aligned() < 0)
1130a9de470cSBruce Richardson return -1;
1131a9de470cSBruce Richardson
1132a9de470cSBruce Richardson printf("test boundary alignment for memzone_reserve\n");
1133a9de470cSBruce Richardson if (test_memzone_bounded() < 0)
1134a9de470cSBruce Richardson return -1;
1135a9de470cSBruce Richardson
1136a9de470cSBruce Richardson printf("test invalid alignment for memzone_reserve\n");
1137a9de470cSBruce Richardson if (test_memzone_invalid_alignment() < 0)
1138a9de470cSBruce Richardson return -1;
1139a9de470cSBruce Richardson
1140bc1a35fbSDavid Marchand printf("test invalid flags for memzone_reserve\n");
1141bc1a35fbSDavid Marchand if (test_memzone_invalid_flags() < 0)
1142bc1a35fbSDavid Marchand return -1;
1143bc1a35fbSDavid Marchand
1144a9de470cSBruce Richardson printf("test reserving the largest size memzone possible\n");
1145a9de470cSBruce Richardson if (test_memzone_reserve_max() < 0)
1146a9de470cSBruce Richardson return -1;
1147a9de470cSBruce Richardson
1148a9de470cSBruce Richardson printf("test reserving the largest size aligned memzone possible\n");
1149a9de470cSBruce Richardson if (test_memzone_reserve_max_aligned() < 0)
1150a9de470cSBruce Richardson return -1;
1151a9de470cSBruce Richardson
1152a9de470cSBruce Richardson printf("check memzone cleanup\n");
1153a9de470cSBruce Richardson memzone_walk_cnt = 0;
1154a9de470cSBruce Richardson test_memzones_left = 0;
1155a9de470cSBruce Richardson rte_memzone_walk(memzone_walk_clb, NULL);
1156a9de470cSBruce Richardson if (memzone_walk_cnt != memzone_cnt || test_memzones_left > 0) {
1157a9de470cSBruce Richardson printf("there are some memzones left after test\n");
1158a9de470cSBruce Richardson rte_memzone_dump(stdout);
1159a9de470cSBruce Richardson return -1;
1160a9de470cSBruce Richardson }
1161a9de470cSBruce Richardson
1162a9de470cSBruce Richardson return 0;
1163a9de470cSBruce Richardson }
1164a9de470cSBruce Richardson
1165*e0a8442cSBruce Richardson REGISTER_FAST_TEST(memzone_autotest, false, true, test_memzone);
1166