test/mem: check segment fd API
authorAnatoly Burakov <anatoly.burakov@intel.com>
Thu, 13 Dec 2018 11:43:19 +0000 (11:43 +0000)
committerThomas Monjalon <thomas@monjalon.net>
Thu, 20 Dec 2018 21:59:00 +0000 (22:59 +0100)
Use memory autotest to also test segment fd API. This will not do
any checks - just see if the relevant API's return success or
indicate that the API is not supported.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Tiwei Bie <tiwei.bie@intel.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
test/test/test_memory.c

index b96bca7..3da803e 100644 (file)
@@ -37,10 +37,44 @@ check_mem(const struct rte_memseg_list *msl __rte_unused,
        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
@@ -59,6 +93,15 @@ test_memory(void)
        /* 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;
 }