New upstream version 18.08
[deb_dpdk.git] / test / test / test_memzone.c
index 8ece1ac..452d7cc 100644 (file)
@@ -104,28 +104,47 @@ test_memzone_reserving_zone_size_bigger_than_the_maximum(void)
        return 0;
 }
 
+struct walk_arg {
+       int hugepage_2MB_avail;
+       int hugepage_1GB_avail;
+       int hugepage_16MB_avail;
+       int hugepage_16GB_avail;
+};
+static int
+find_available_pagesz(const struct rte_memseg_list *msl, void *arg)
+{
+       struct walk_arg *wa = arg;
+
+       if (msl->page_sz == RTE_PGSIZE_2M)
+               wa->hugepage_2MB_avail = 1;
+       if (msl->page_sz == RTE_PGSIZE_1G)
+               wa->hugepage_1GB_avail = 1;
+       if (msl->page_sz == RTE_PGSIZE_16M)
+               wa->hugepage_16MB_avail = 1;
+       if (msl->page_sz == RTE_PGSIZE_16G)
+               wa->hugepage_16GB_avail = 1;
+
+       return 0;
+}
+
 static int
 test_memzone_reserve_flags(void)
 {
        const struct rte_memzone *mz;
-       const struct rte_memseg *ms;
-       int hugepage_2MB_avail = 0;
-       int hugepage_1GB_avail = 0;
-       int hugepage_16MB_avail = 0;
-       int hugepage_16GB_avail = 0;
+       struct walk_arg wa;
+       int hugepage_2MB_avail, hugepage_1GB_avail;
+       int hugepage_16MB_avail, hugepage_16GB_avail;
        const size_t size = 100;
-       int i = 0;
-       ms = rte_eal_get_physmem_layout();
-       for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-               if (ms[i].hugepage_sz == RTE_PGSIZE_2M)
-                       hugepage_2MB_avail = 1;
-               if (ms[i].hugepage_sz == RTE_PGSIZE_1G)
-                       hugepage_1GB_avail = 1;
-               if (ms[i].hugepage_sz == RTE_PGSIZE_16M)
-                       hugepage_16MB_avail = 1;
-               if (ms[i].hugepage_sz == RTE_PGSIZE_16G)
-                       hugepage_16GB_avail = 1;
-       }
+
+       memset(&wa, 0, sizeof(wa));
+
+       rte_memseg_list_walk(find_available_pagesz, &wa);
+
+       hugepage_2MB_avail = wa.hugepage_2MB_avail;
+       hugepage_1GB_avail = wa.hugepage_1GB_avail;
+       hugepage_16MB_avail = wa.hugepage_16MB_avail;
+       hugepage_16GB_avail = wa.hugepage_16GB_avail;
+
        /* Display the availability of 2MB ,1GB, 16MB, 16GB pages */
        if (hugepage_2MB_avail)
                printf("2MB Huge pages available\n");
@@ -448,61 +467,69 @@ test_memzone_reserve_flags(void)
 
 /* Find the heap with the greatest free block size */
 static size_t
-find_max_block_free_size(const unsigned _align)
+find_max_block_free_size(unsigned int align, unsigned int socket_id)
 {
        struct rte_malloc_socket_stats stats;
-       unsigned i, align = _align;
-       size_t len = 0;
+       size_t len, overhead;
 
-       for (i = 0; i < RTE_MAX_NUMA_NODES; i++) {
-               rte_malloc_get_socket_stats(i, &stats);
-               if (stats.greatest_free_size > len)
-                       len = stats.greatest_free_size;
-       }
+       rte_malloc_get_socket_stats(socket_id, &stats);
 
-       if (align < RTE_CACHE_LINE_SIZE)
-               align = RTE_CACHE_LINE_ROUNDUP(align+1);
+       len = stats.greatest_free_size;
+       overhead = MALLOC_ELEM_OVERHEAD;
 
-       if (len <= MALLOC_ELEM_OVERHEAD + align)
+       if (len == 0)
                return 0;
 
-       return len - MALLOC_ELEM_OVERHEAD - align;
+       align = RTE_CACHE_LINE_ROUNDUP(align);
+       overhead += align;
+
+       if (len < overhead)
+               return 0;
+
+       return len - overhead;
 }
 
 static int
 test_memzone_reserve_max(void)
 {
-       const struct rte_memzone *mz;
-       size_t maxlen;
+       unsigned int i;
 
-       maxlen = find_max_block_free_size(0);
+       for (i = 0; i < rte_socket_count(); i++) {
+               const struct rte_memzone *mz;
+               size_t maxlen;
+               int socket;
 
-       if (maxlen == 0) {
-               printf("There is no space left!\n");
-               return 0;
-       }
+               socket = rte_socket_id_by_idx(i);
+               maxlen = find_max_block_free_size(0, socket);
 
-       mz = rte_memzone_reserve(TEST_MEMZONE_NAME("max_zone"), 0,
-                       SOCKET_ID_ANY, 0);
-       if (mz == NULL){
-               printf("Failed to reserve a big chunk of memory - %s\n",
-                               rte_strerror(rte_errno));
-               rte_dump_physmem_layout(stdout);
-               rte_memzone_dump(stdout);
-               return -1;
-       }
+               if (maxlen == 0) {
+                       printf("There is no space left!\n");
+                       return 0;
+               }
 
-       if (mz->len != maxlen) {
-               printf("Memzone reserve with 0 size did not return bigest block\n");
-               printf("Expected size = %zu, actual size = %zu\n", maxlen, mz->len);
-               rte_dump_physmem_layout(stdout);
-               rte_memzone_dump(stdout);
-               return -1;
-       }
+               mz = rte_memzone_reserve(TEST_MEMZONE_NAME("max_zone"), 0,
+                               socket, 0);
+               if (mz == NULL) {
+                       printf("Failed to reserve a big chunk of memory - %s\n",
+                                       rte_strerror(rte_errno));
+                       rte_dump_physmem_layout(stdout);
+                       rte_memzone_dump(stdout);
+                       return -1;
+               }
 
-       if (rte_memzone_free(mz)) {
-               printf("Fail memzone free\n");
-               return -1;
+               if (mz->len != maxlen) {
+                       printf("Memzone reserve with 0 size did not return bigest block\n");
+                       printf("Expected size = %zu, actual size = %zu\n",
+                                       maxlen, mz->len);
+                       rte_dump_physmem_layout(stdout);
+                       rte_memzone_dump(stdout);
+                       return -1;
+               }
+
+               if (rte_memzone_free(mz)) {
+                       printf("Fail memzone free\n");
+                       return -1;
+               }
        }
 
        return 0;
@@ -511,45 +538,62 @@ test_memzone_reserve_max(void)
 static int
 test_memzone_reserve_max_aligned(void)
 {
-       const struct rte_memzone *mz;
-       size_t maxlen = 0;
+       unsigned int i;
 
-       /* random alignment */
-       rte_srand((unsigned)rte_rdtsc());
-       const unsigned align = 1 << ((rte_rand() % 8) + 5); /* from 128 up to 4k alignment */
+       for (i = 0; i < rte_socket_count(); i++) {
+               const struct rte_memzone *mz;
+               size_t maxlen, minlen = 0;
+               int socket;
 
-       maxlen = find_max_block_free_size(align);
+               socket = rte_socket_id_by_idx(i);
 
-       if (maxlen == 0) {
-               printf("There is no space left for biggest %u-aligned memzone!\n", align);
-               return 0;
-       }
+               /* random alignment */
+               rte_srand((unsigned int)rte_rdtsc());
+               const unsigned int align = 1 << ((rte_rand() % 8) + 5); /* from 128 up to 4k alignment */
 
-       mz = rte_memzone_reserve_aligned(TEST_MEMZONE_NAME("max_zone_aligned"),
-                       0, SOCKET_ID_ANY, 0, align);
-       if (mz == NULL){
-               printf("Failed to reserve a big chunk of memory - %s\n",
-                               rte_strerror(rte_errno));
-               rte_dump_physmem_layout(stdout);
-               rte_memzone_dump(stdout);
-               return -1;
-       }
+               /* memzone size may be between size and size - align */
+               minlen = find_max_block_free_size(align, socket);
+               maxlen = find_max_block_free_size(0, socket);
 
-       if (mz->len != maxlen) {
-               printf("Memzone reserve with 0 size and alignment %u did not return"
-                               " bigest block\n", align);
-               printf("Expected size = %zu, actual size = %zu\n",
-                               maxlen, mz->len);
-               rte_dump_physmem_layout(stdout);
-               rte_memzone_dump(stdout);
-               return -1;
-       }
+               if (minlen == 0 || maxlen == 0) {
+                       printf("There is no space left for biggest %u-aligned memzone!\n",
+                                       align);
+                       return 0;
+               }
 
-       if (rte_memzone_free(mz)) {
-               printf("Fail memzone free\n");
-               return -1;
-       }
+               mz = rte_memzone_reserve_aligned(
+                               TEST_MEMZONE_NAME("max_zone_aligned"),
+                               0, socket, 0, align);
+               if (mz == NULL) {
+                       printf("Failed to reserve a big chunk of memory - %s\n",
+                                       rte_strerror(rte_errno));
+                       rte_dump_physmem_layout(stdout);
+                       rte_memzone_dump(stdout);
+                       return -1;
+               }
+               if (mz->addr != RTE_PTR_ALIGN(mz->addr, align)) {
+                       printf("Memzone reserve with 0 size and alignment %u did not return aligned block\n",
+                                       align);
+                       rte_dump_physmem_layout(stdout);
+                       rte_memzone_dump(stdout);
+                       return -1;
+               }
 
+               if (mz->len < minlen || mz->len > maxlen) {
+                       printf("Memzone reserve with 0 size and alignment %u did not return"
+                                       " bigest block\n", align);
+                       printf("Expected size = %zu-%zu, actual size = %zu\n",
+                                       minlen, maxlen, mz->len);
+                       rte_dump_physmem_layout(stdout);
+                       rte_memzone_dump(stdout);
+                       return -1;
+               }
+
+               if (rte_memzone_free(mz)) {
+                       printf("Fail memzone free\n");
+                       return -1;
+               }
+       }
        return 0;
 }
 
@@ -890,7 +934,7 @@ test_memzone_basic(void)
        const struct rte_memzone *mz;
        int memzone_cnt_after, memzone_cnt_expected;
        int memzone_cnt_before =
-                       rte_eal_get_configuration()->mem_config->memzone_cnt;
+                       rte_eal_get_configuration()->mem_config->memzones.count;
 
        memzone1 = rte_memzone_reserve(TEST_MEMZONE_NAME("testzone1"), 100,
                                SOCKET_ID_ANY, 0);
@@ -914,7 +958,7 @@ test_memzone_basic(void)
                        (memzone3 != NULL) + (memzone4 != NULL);
 
        memzone_cnt_after =
-                       rte_eal_get_configuration()->mem_config->memzone_cnt;
+                       rte_eal_get_configuration()->mem_config->memzones.count;
 
        if (memzone_cnt_after != memzone_cnt_expected)
                return -1;
@@ -993,7 +1037,7 @@ test_memzone_basic(void)
        }
 
        memzone_cnt_after =
-                       rte_eal_get_configuration()->mem_config->memzone_cnt;
+                       rte_eal_get_configuration()->mem_config->memzones.count;
        if (memzone_cnt_after != memzone_cnt_before)
                return -1;
 
@@ -1014,7 +1058,8 @@ static int
 test_memzone(void)
 {
        /* take note of how many memzones were allocated before running */
-       int memzone_cnt = rte_eal_get_configuration()->mem_config->memzone_cnt;
+       int memzone_cnt =
+                       rte_eal_get_configuration()->mem_config->memzones.count;
 
        printf("test basic memzone API\n");
        if (test_memzone_basic() < 0)