summaryrefslogtreecommitdiff
path: root/drivers/mempool
diff options
context:
space:
mode:
authorShreyansh Jain <shreyansh.jain@nxp.com>2018-04-27 22:50:58 +0530
committerThomas Monjalon <thomas@monjalon.net>2018-04-27 21:41:33 +0200
commit06d5038a472f07385f58c82eba6aadb162a5b4f1 (patch)
tree125c968aabad55252b6dd970387011009220cf70 /drivers/mempool
parent365fb925d3b39e10b781e0662c2b57e8303b2147 (diff)
downloaddpdk-06d5038a472f07385f58c82eba6aadb162a5b4f1.zip
dpdk-06d5038a472f07385f58c82eba6aadb162a5b4f1.tar.gz
dpdk-06d5038a472f07385f58c82eba6aadb162a5b4f1.tar.xz
bus/dpaa: optimize physical to virtual address search
With Hotplugging memory support, the order of memseg has been changed from physically contiguous to virtual contiguous. DPAA bus and drivers depend on PA to VA address conversion for I/O. This patch creates a list of blocks requested to be pinned to the DPAA mempool. For searching physical addresses, it is expected that it would belong to this list (from hardware pool) and hence it is less expensive than memseg walks. Though, there is a marginal drop in performance vis-a-vis the legacy mode with physically contiguous memsegs. Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
Diffstat (limited to 'drivers/mempool')
-rw-r--r--drivers/mempool/dpaa/dpaa_mempool.c33
-rw-r--r--drivers/mempool/dpaa/rte_mempool_dpaa_version.map1
2 files changed, 33 insertions, 1 deletions
diff --git a/drivers/mempool/dpaa/dpaa_mempool.c b/drivers/mempool/dpaa/dpaa_mempool.c
index 580e464..10c536b 100644
--- a/drivers/mempool/dpaa/dpaa_mempool.c
+++ b/drivers/mempool/dpaa/dpaa_mempool.c
@@ -27,6 +27,13 @@
#include <dpaa_mempool.h>
+/* List of all the memseg information locally maintained in dpaa driver. This
+ * is to optimize the PA_to_VA searches until a better mechanism (algo) is
+ * available.
+ */
+struct dpaa_memseg_list rte_dpaa_memsegs
+ = TAILQ_HEAD_INITIALIZER(rte_dpaa_memsegs);
+
struct dpaa_bp_info rte_dpaa_bpid_info[DPAA_MAX_BPOOLS];
static int
@@ -287,10 +294,34 @@ dpaa_populate(struct rte_mempool *mp, unsigned int max_objs,
/* Detect pool area has sufficient space for elements in this memzone */
if (len >= total_elt_sz * mp->size)
bp_info->flags |= DPAA_MPOOL_SINGLE_SEGMENT;
+ struct dpaa_memseg *ms;
+
+ /* For each memory chunk pinned to the Mempool, a linked list of the
+ * contained memsegs is created for searching when PA to VA
+ * conversion is required.
+ */
+ ms = rte_zmalloc(NULL, sizeof(struct dpaa_memseg), 0);
+ if (!ms) {
+ DPAA_MEMPOOL_ERR("Unable to allocate internal memory.");
+ DPAA_MEMPOOL_WARN("Fast Physical to Virtual Addr translation would not be available.");
+ /* If the element is not added, it would only lead to failure
+ * in searching for the element and the logic would Fallback
+ * to traditional DPDK memseg traversal code. So, this is not
+ * a blocking error - but, error would be printed on screen.
+ */
+ return 0;
+ }
+
+ ms->vaddr = vaddr;
+ ms->iova = paddr;
+ ms->len = len;
+ /* Head insertions are generally faster than tail insertions as the
+ * buffers pinned are picked from rear end.
+ */
+ TAILQ_INSERT_HEAD(&rte_dpaa_memsegs, ms, next);
return rte_mempool_op_populate_default(mp, max_objs, vaddr, paddr, len,
obj_cb, obj_cb_arg);
-
}
struct rte_mempool_ops dpaa_mpool_ops = {
diff --git a/drivers/mempool/dpaa/rte_mempool_dpaa_version.map b/drivers/mempool/dpaa/rte_mempool_dpaa_version.map
index d05f274..60bf50b 100644
--- a/drivers/mempool/dpaa/rte_mempool_dpaa_version.map
+++ b/drivers/mempool/dpaa/rte_mempool_dpaa_version.map
@@ -2,6 +2,7 @@ DPDK_17.11 {
global:
rte_dpaa_bpid_info;
+ rte_dpaa_memsegs;
local: *;
};