+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;
+}
+