examples/bpf: move from test directory
[dpdk.git] / test / test / test_memory.c
index c9b287c..3da803e 100644 (file)
@@ -5,8 +5,11 @@
 #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"
 
  */
 
 static int
-check_mem(const struct rte_memseg *ms, void *arg __rte_unused)
+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;
+       size_t i, max = ms->len;
 
-       for (i = 0; i < ms->len; i++, mem++)
+       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
@@ -55,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;
 }