On Wed, Oct 14, 2020 at 03:39:36PM +0100, Burakov, Anatoly wrote: > External Email > > ---------------------------------------------------------------------- > On 12-Oct-20 9:11 AM, Nithin Dabilpuram wrote: > > Add test case in test_memory to test VFIO DMA map/unmap. > > > > Signed-off-by: Nithin Dabilpuram <ndabilpu...@marvell.com> > > --- > > app/test/test_memory.c | 79 > > ++++++++++++++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 79 insertions(+) > > > > diff --git a/app/test/test_memory.c b/app/test/test_memory.c > > index 7d5ae99..1c56455 100644 > > --- a/app/test/test_memory.c > > +++ b/app/test/test_memory.c > > @@ -4,11 +4,16 @@ > > #include <stdio.h> > > #include <stdint.h> > > +#include <string.h> > > +#include <sys/mman.h> > > +#include <unistd.h> > > #include <rte_eal.h> > > +#include <rte_errno.h> > > #include <rte_memory.h> > > #include <rte_common.h> > > #include <rte_memzone.h> > > +#include <rte_vfio.h> > > #include "test.h" > > @@ -70,6 +75,71 @@ check_seg_fds(const struct rte_memseg_list *msl, const > > struct rte_memseg *ms, > > } > > static int > > +test_memory_vfio_dma_map(void) > > +{ > > + uint64_t sz = 2 * sysconf(_SC_PAGESIZE), sz1, sz2; > > i think we now have a function for that, rte_page_size() ? > > Also, i would prefer > > uint64_t sz1, sz2, sz = 2 * rte_page_size(); > > Easier to parse IMO.
Ack, will use rte_mem_page_size(). > > > + uint64_t unmap1, unmap2; > > + uint8_t *mem; > > + int ret; > > + > > + /* Check if vfio is enabled in both kernel and eal */ > > + ret = rte_vfio_is_enabled("vfio"); > > + if (!ret) > > + return 1; > > No need, rte_vfio_container_dma_map() should set errno to ENODEV if vfio is > not enabled. Ack. > > > + > > + /* Allocate twice size of page */ > > + mem = mmap(NULL, sz, PROT_READ | PROT_WRITE, > > + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > > + if (mem == MAP_FAILED) { > > + printf("Failed to allocate memory for external heap\n"); > > + return -1; > > + } > > + > > + /* Force page allocation */ > > + memset(mem, 0, sz); > > + > > + /* map the whole region */ > > + ret = rte_vfio_container_dma_map(RTE_VFIO_DEFAULT_CONTAINER_FD, > > + (uint64_t)mem, (rte_iova_t)mem, sz); > > should be (uintptr_t) perhaps? > > Also, this can return -1 with rte_errno == ENOTSUP, i think this happens if > there are no devices attached (or if there's no VFIO support, like it would > be on FreeBSD or Windows). Ok. Will return 1 if NOTSUP. > > > + if (ret) { > > + printf("Failed to dma map whole region, ret=%d\n", ret); > > + goto fail; > > + } > > + > > + unmap1 = (uint64_t)mem + (sz / 2); > > + sz1 = sz / 2; > > + unmap2 = (uint64_t)mem; > > + sz2 = sz / 2; > > + /* unmap the partial region */ > > + ret = rte_vfio_container_dma_unmap(RTE_VFIO_DEFAULT_CONTAINER_FD, > > + unmap1, (rte_iova_t)unmap1, sz1); > > + if (ret) { > > + if (rte_errno == ENOTSUP) { > > + printf("Partial dma unmap not supported\n"); > > + unmap2 = (uint64_t)mem; > > + sz2 = sz; > > + } else { > > + printf("Failed to unmap send half region, ret=%d(%d)\n", > > I think "send half" is a typo? Also, here and in other places, i would > prefer a rte_strerror() instead of raw rte_errno number. Ack. > > > + ret, rte_errno); > > + goto fail; > > + } > > + } > > + > > + /* unmap the remaining region */ > > + ret = rte_vfio_container_dma_unmap(RTE_VFIO_DEFAULT_CONTAINER_FD, > > + unmap2, (rte_iova_t)unmap2, sz2); > > + if (ret) { > > + printf("Failed to unmap remaining region, ret=%d(%d)\n", ret, > > + rte_errno); > > + goto fail; > > + } > > + > > +fail: > > + munmap(mem, sz); > > + return ret; > > +} > > + > > +static int > > test_memory(void) > > { > > uint64_t s; > > @@ -101,6 +171,15 @@ test_memory(void) > > return -1; > > } > > + /* test for vfio dma map/unmap */ > > + ret = test_memory_vfio_dma_map(); > > + if (ret == 1) { > > + printf("VFIO dma map/unmap unsupported\n"); > > + } else if (ret < 0) { > > + printf("Error vfio dma map/unmap, ret=%d\n", ret); > > + return -1; > > + } > > + > > This looks odd in this autotest. Perhaps create a new autotest for VFIO? Ack, will add test_vfio.c > > > return 0; > > } > > > > > -- > Thanks, > Anatoly