From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anatoly Burakov Subject: [PATCH v5 31/70] test: use memseg walk instead of iteration Date: Mon, 9 Apr 2018 19:00:34 +0100 Message-ID: <03e3eadf32e76f924433665400e3f5617e8027f7.1523296700.git.anatoly.burakov@intel.com> References: Cc: keith.wiles@intel.com, jianfeng.tan@intel.com, andras.kovacs@ericsson.com, laszlo.vadkeri@ericsson.com, benjamin.walker@intel.com, bruce.richardson@intel.com, thomas@monjalon.net, konstantin.ananyev@intel.com, kuralamudhan.ramakrishnan@intel.com, louise.m.daly@intel.com, nelio.laranjeiro@6wind.com, yskoh@mellanox.com, pepperjo@japf.ch, jerin.jacob@caviumnetworks.com, hemant.agrawal@nxp.com, olivier.matz@6wind.com, shreyansh.jain@nxp.com, gowrishankar.m@linux.vnet.ibm.com To: dev@dpdk.org Return-path: Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by dpdk.org (Postfix) with ESMTP id 8AA3C1B840 for ; Mon, 9 Apr 2018 20:01:35 +0200 (CEST) In-Reply-To: In-Reply-To: References: List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Reduce dependency on internal details of EAL memory subsystem, and simplify code. Signed-off-by: Anatoly Burakov Tested-by: Santosh Shukla Tested-by: Hemant Agrawal --- test/test/test_malloc.c | 40 +++++++++++++++++++++++------------- test/test/test_memory.c | 23 +++++++++++---------- test/test/test_memzone.c | 53 ++++++++++++++++++++++++++++++++---------------- 3 files changed, 74 insertions(+), 42 deletions(-) diff --git a/test/test/test_malloc.c b/test/test/test_malloc.c index ccc5fea..28c241f 100644 --- a/test/test/test_malloc.c +++ b/test/test/test_malloc.c @@ -705,16 +705,34 @@ test_malloc_bad_params(void) return -1; } +static int +check_socket_mem(const struct rte_memseg *ms, void *arg) +{ + int32_t *socket = arg; + + return *socket == ms->socket_id; +} + /* Check if memory is available on a specific socket */ static int is_mem_on_socket(int32_t socket) { - const struct rte_memseg *ms = rte_eal_get_physmem_layout(); - unsigned i; + return rte_memseg_walk(check_socket_mem, &socket); +} - for (i = 0; i < RTE_MAX_MEMSEG; i++) { - if (socket == ms[i].socket_id) - return 1; +struct walk_param { + void *addr; + int32_t socket; +}; +static int +find_socket(const struct rte_memseg *ms, void *arg) +{ + struct walk_param *param = arg; + + if (param->addr >= ms->addr && + param->addr < RTE_PTR_ADD(ms->addr, ms->len)) { + param->socket = ms->socket_id; + return 1; } return 0; } @@ -726,15 +744,9 @@ is_mem_on_socket(int32_t socket) static int32_t addr_to_socket(void * addr) { - const struct rte_memseg *ms = rte_eal_get_physmem_layout(); - unsigned i; - - for (i = 0; i < RTE_MAX_MEMSEG; i++) { - if ((ms[i].addr <= addr) && - ((uintptr_t)addr < - ((uintptr_t)ms[i].addr + (uintptr_t)ms[i].len))) - return ms[i].socket_id; - } + struct walk_param param = {.addr = addr, .socket = 0}; + if (rte_memseg_walk(find_socket, ¶m) > 0) + return param.socket; return -1; } diff --git a/test/test/test_memory.c b/test/test/test_memory.c index 972321f..c9b287c 100644 --- a/test/test/test_memory.c +++ b/test/test/test_memory.c @@ -23,12 +23,20 @@ */ static int +check_mem(const struct rte_memseg *ms, void *arg __rte_unused) +{ + volatile uint8_t *mem = (volatile uint8_t *) ms->addr; + size_t i; + + for (i = 0; i < ms->len; i++, mem++) + *mem; + return 0; +} + +static int test_memory(void) { uint64_t s; - unsigned i; - size_t j; - const struct rte_memseg *mem; /* * dump the mapped memory: the python-expect script checks @@ -45,14 +53,7 @@ test_memory(void) } /* try to read memory (should not segfault) */ - mem = rte_eal_get_physmem_layout(); - for (i = 0; i < RTE_MAX_MEMSEG && mem[i].addr != NULL ; i++) { - - /* check memory */ - for (j = 0; jhugepage_sz == RTE_PGSIZE_2M) + wa->hugepage_2MB_avail = 1; + if (ms->hugepage_sz == RTE_PGSIZE_1G) + wa->hugepage_1GB_avail = 1; + if (ms->hugepage_sz == RTE_PGSIZE_16M) + wa->hugepage_16MB_avail = 1; + if (ms->hugepage_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_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"); -- 2.7.4