diff mbox series

[v2,6/7] eal/mem: use DMA mask check for legacy memory

Message ID 20181101195330.19464-7-alejandro.lucero@netronome.com (mailing list archive)
State Accepted, archived
Delegated to: Thomas Monjalon
Headers show
Series fix DMA mask check | expand

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Alejandro Lucero Nov. 1, 2018, 7:53 p.m. UTC
If a device reports addressing limitations through a dma mask,
the IOVAs for mapped memory needs to be checked out for ensuring
correct functionality.

Previous patches introduced this DMA check for main memory code
currently being used but other options like legacy memory and the
no hugepages option need to be also considered.

This patch adds the DMA check for those cases.

Signed-off-by: Alejandro Lucero <alejandro.lucero@netronome.com>
---
 lib/librte_eal/linuxapp/eal/eal_memory.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)
diff mbox series

Patch

diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c
index fce86fda6..c7935879a 100644
--- a/lib/librte_eal/linuxapp/eal/eal_memory.c
+++ b/lib/librte_eal/linuxapp/eal/eal_memory.c
@@ -1393,6 +1393,18 @@  eal_legacy_hugepage_init(void)
 
 			addr = RTE_PTR_ADD(addr, (size_t)page_sz);
 		}
+		if (mcfg->dma_maskbits &&
+		    rte_mem_check_dma_mask(mcfg->dma_maskbits)) {
+			RTE_LOG(ERR, EAL,
+				"%s(): couldnt allocate memory due to IOVA exceeding limits of current DMA mask.\n",
+				__func__);
+			if (rte_eal_iova_mode() == RTE_IOVA_VA &&
+			    rte_eal_using_phys_addrs())
+				RTE_LOG(ERR, EAL,
+					"%s(): Please try initializing EAL with --iova-mode=pa parameter.\n",
+					__func__);
+			goto fail;
+		}
 		return 0;
 	}
 
@@ -1628,6 +1640,14 @@  eal_legacy_hugepage_init(void)
 		rte_fbarray_destroy(&msl->memseg_arr);
 	}
 
+	if (mcfg->dma_maskbits &&
+	    rte_mem_check_dma_mask(mcfg->dma_maskbits)) {
+		RTE_LOG(ERR, EAL,
+			"%s(): couldn't allocate memory due to IOVA exceeding limits of current DMA mask.\n",
+			__func__);
+		goto fail;
+	}
+
 	return 0;
 
 fail: