return 0;
}
+int __rte_experimental
+rte_memseg_contig_walk(rte_memseg_contig_walk_t func, void *arg)
+{
+ struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
+ int i, j, ret;
+
+ for (i = 0; i < RTE_MAX_MEMSEG; i++) {
+ const struct rte_memseg *ms = &mcfg->memseg[i];
+ size_t total_len;
+ void *end_addr;
+
+ if (ms->addr == NULL)
+ continue;
+
+ end_addr = RTE_PTR_ADD(ms->addr, ms->len);
+
+ /* check how many more segments are contiguous to this one */
+ for (j = i + 1; j < RTE_MAX_MEMSEG; j++) {
+ const struct rte_memseg *next = &mcfg->memseg[j];
+
+ if (next->addr != end_addr)
+ break;
+
+ end_addr = RTE_PTR_ADD(next->addr, next->len);
+ i++;
+ }
+ total_len = RTE_PTR_DIFF(end_addr, ms->addr);
+
+ ret = func(ms, total_len, arg);
+ if (ret < 0)
+ return -1;
+ if (ret > 0)
+ return 1;
+ }
+ return 0;
+}
+
/* init memory subsystem */
int
rte_eal_memory_init(void)
*/
typedef int (*rte_memseg_walk_t)(const struct rte_memseg *ms, void *arg);
+/**
+ * Memseg contig walk function prototype. This will trigger a callback on every
+ * VA-contiguous are starting at memseg ``ms``, so total valid VA space at each
+ * callback call will be [``ms->addr``, ``ms->addr + len``).
+ *
+ * Returning 0 will continue walk
+ * Returning 1 will stop the walk
+ * Returning -1 will stop the walk and report error
+ */
+typedef int (*rte_memseg_contig_walk_t)(const struct rte_memseg *ms,
+ size_t len, void *arg);
+
/**
* Walk list of all memsegs.
*
int __rte_experimental
rte_memseg_walk(rte_memseg_walk_t func, void *arg);
+/**
+ * Walk each VA-contiguous area.
+ *
+ * @param func
+ * Iterator function
+ * @param arg
+ * Argument passed to iterator
+ * @return
+ * 0 if walked over the entire list
+ * 1 if stopped by the user
+ * -1 if user function reported error
+ */
+int __rte_experimental
+rte_memseg_contig_walk(rte_memseg_contig_walk_t func, void *arg);
+
/**
* Get the layout of the available physical memory.
*