a9de470cc7
Since all other apps have been moved to the "app" folder, the autotest app remains alone in the test folder. Rather than having an entire top-level folder for this, we can move it back to where it all started in early versions of DPDK - the "app/" folder. This move has a couple of advantages: * This reduces clutter at the top level of the project, due to one less folder. * It eliminates the separate build task necessary for building the autotests using make "make test-build" which means that developers are less likely to miss something in their own compilation tests * It re-aligns the final location of the test binary in the app folder when building with make with it's location in the source tree. For meson builds, the autotest app is different from the other apps in that it needs a series of different test cases defined for it for use by "meson test". Therefore, it does not get built as part of the main loop in the app folder, but gets built separately at the end. Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
109 lines
2.2 KiB
C
109 lines
2.2 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2010-2014 Intel Corporation
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdint.h>
|
|
|
|
#include <rte_eal.h>
|
|
#include <rte_eal_memconfig.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);
|