diff options
Diffstat (limited to 'src/spdk/dpdk/app/test/test_memory.c')
-rw-r--r-- | src/spdk/dpdk/app/test/test_memory.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/spdk/dpdk/app/test/test_memory.c b/src/spdk/dpdk/app/test/test_memory.c new file mode 100644 index 000000000..7d5ae99ba --- /dev/null +++ b/src/spdk/dpdk/app/test/test_memory.c @@ -0,0 +1,107 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2014 Intel Corporation + */ + +#include <stdio.h> +#include <stdint.h> + +#include <rte_eal.h> +#include <rte_memory.h> +#include <rte_common.h> +#include <rte_memzone.h> + +#include "test.h" + +/* + * Memory + * ====== + * + * - Dump the mapped memory. The python-expect script checks that at + * least one line is dumped. + * + * - Check that memory size is different than 0. + * + * - Try to read all memory; it should not segfault. + */ + +static int +check_mem(const struct rte_memseg_list *msl __rte_unused, + const struct rte_memseg *ms, void *arg __rte_unused) +{ + volatile uint8_t *mem = (volatile uint8_t *) ms->addr; + size_t i, max = ms->len; + + for (i = 0; i < max; i++, mem++) + *mem; + return 0; +} + +static int +check_seg_fds(const struct rte_memseg_list *msl, const struct rte_memseg *ms, + void *arg __rte_unused) +{ + size_t offset; + int ret; + + /* skip external segments */ + if (msl->external) + return 0; + + /* try segment fd first. we're in a callback, so thread-unsafe */ + ret = rte_memseg_get_fd_thread_unsafe(ms); + if (ret < 0) { + /* ENOTSUP means segment is valid, but there is not support for + * segment fd API (e.g. on FreeBSD). + */ + if (errno == ENOTSUP) + return 1; + /* all other errors are treated as failures */ + return -1; + } + + /* we're able to get memseg fd - try getting its offset */ + ret = rte_memseg_get_fd_offset_thread_unsafe(ms, &offset); + if (ret < 0) { + if (errno == ENOTSUP) + return 1; + return -1; + } + return 0; +} + +static int +test_memory(void) +{ + uint64_t s; + int ret; + + /* + * dump the mapped memory: the python-expect script checks + * that at least one line is dumped + */ + printf("Dump memory layout\n"); + rte_dump_physmem_layout(stdout); + + /* check that memory size is != 0 */ + s = rte_eal_get_physmem_size(); + if (s == 0) { + printf("No memory detected\n"); + return -1; + } + + /* try to read memory (should not segfault) */ + rte_memseg_walk(check_mem, NULL); + + /* check segment fd support */ + ret = rte_memseg_walk(check_seg_fds, NULL); + if (ret == 1) { + printf("Segment fd API is unsupported\n"); + } else if (ret == -1) { + printf("Error getting segment fd's\n"); + return -1; + } + + return 0; +} + +REGISTER_TEST_COMMAND(memory_autotest, test_memory); |