patch 'eal: fix DMA mask validation with IOVA mode option' has been queued to stable release 22.11.11
luca.boccassi at gmail.com
luca.boccassi at gmail.com
Mon Oct 27 17:19:06 CET 2025
Hi,
FYI, your patch has been queued to stable release 22.11.11
Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 10/29/25. So please
shout if anyone has objections.
Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.
Queued patches are on a temporary branch at:
https://github.com/bluca/dpdk-stable
This queued commit can be viewed at:
https://github.com/bluca/dpdk-stable/commit/0980930c32a05807f48c2cace72e5e2e5dabf7a7
Thanks.
Luca Boccassi
---
>From 0980930c32a05807f48c2cace72e5e2e5dabf7a7 Mon Sep 17 00:00:00 2001
From: Shani Peretz <shperetz at nvidia.com>
Date: Thu, 18 Sep 2025 09:47:54 +0300
Subject: [PATCH] eal: fix DMA mask validation with IOVA mode option
[ upstream commit e37ff4ef296f33e4c3a0e9306241c4f8fcae5061 ]
When --iova-mode is explicitly specified in command line, DMA mask
constraints were not being validated, leading to potential runtime
failures when device DMA capabilities are exceeded.
The issue occurred because rte_bus_get_iommu_class() was only called
during IOVA mode auto-detection, but this function has the important
side effect of triggering DMA mask detection (e.g., Intel IOMMU
address width checking via pci_device_iommu_support_va()).
This created an inconsistency, when choosing explicit mode,
the DMA checks are bypassed, but when choosing auto-detection mode,
the constraints are checked and enforced.
The fix moves rte_bus_get_iommu_class() outside the conditional logic
to ensure it's always called during EAL initialization.
Fixes: 4374ebc24bc1 ("malloc: modify error message for DMA mask check")
Signed-off-by: Shani Peretz <shperetz at nvidia.com>
Acked-by: Anatoly Burakov <anatoly.burakov at intel.com>
---
lib/eal/freebsd/eal.c | 6 +++++-
lib/eal/linux/eal.c | 5 ++++-
lib/eal/windows/eal.c | 5 ++++-
3 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c
index 008a6c68e4..aa9f85c647 100644
--- a/lib/eal/freebsd/eal.c
+++ b/lib/eal/freebsd/eal.c
@@ -692,6 +692,10 @@ rte_eal_init(int argc, char **argv)
* with a message describing the cause.
*/
has_phys_addr = internal_conf->no_hugetlbfs == 0;
+
+ /* Always call rte_bus_get_iommu_class() to trigger DMA mask detection and validation */
+ enum rte_iova_mode bus_iova_mode = rte_bus_get_iommu_class();
+
iova_mode = internal_conf->iova_mode;
if (iova_mode == RTE_IOVA_PA && !has_phys_addr) {
rte_eal_init_alert("Cannot use IOVA as 'PA' since physical addresses are not available");
@@ -702,7 +706,7 @@ rte_eal_init(int argc, char **argv)
RTE_LOG(DEBUG, EAL, "Specific IOVA mode is not requested, autodetecting\n");
if (has_phys_addr) {
RTE_LOG(DEBUG, EAL, "Selecting IOVA mode according to bus requests\n");
- iova_mode = rte_bus_get_iommu_class();
+ iova_mode = bus_iova_mode;
if (iova_mode == RTE_IOVA_DC)
iova_mode = RTE_IOVA_PA;
} else {
diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c
index f6ac970ed9..9f9a03bcf7 100644
--- a/lib/eal/linux/eal.c
+++ b/lib/eal/linux/eal.c
@@ -1065,10 +1065,13 @@ rte_eal_init(int argc, char **argv)
phys_addrs = rte_eal_using_phys_addrs() != 0;
+ /* Always call rte_bus_get_iommu_class() to trigger DMA mask detection and validation */
+ enum rte_iova_mode bus_iova_mode = rte_bus_get_iommu_class();
+
/* if no EAL option "--iova-mode=<pa|va>", use bus IOVA scheme */
if (internal_conf->iova_mode == RTE_IOVA_DC) {
/* autodetect the IOVA mapping mode */
- enum rte_iova_mode iova_mode = rte_bus_get_iommu_class();
+ enum rte_iova_mode iova_mode = bus_iova_mode;
if (iova_mode == RTE_IOVA_DC) {
RTE_LOG(DEBUG, EAL, "Buses did not request a specific IOVA mode.\n");
diff --git a/lib/eal/windows/eal.c b/lib/eal/windows/eal.c
index 56fadc7afe..3a459172f9 100644
--- a/lib/eal/windows/eal.c
+++ b/lib/eal/windows/eal.c
@@ -359,6 +359,9 @@ rte_eal_init(int argc, char **argv)
has_phys_addr = false;
}
+ /* Always call rte_bus_get_iommu_class() to trigger DMA mask detection and validation */
+ enum rte_iova_mode bus_iova_mode = rte_bus_get_iommu_class();
+
iova_mode = internal_conf->iova_mode;
if (iova_mode == RTE_IOVA_PA && !has_phys_addr) {
rte_eal_init_alert("Cannot use IOVA as 'PA' since physical addresses are not available");
@@ -369,7 +372,7 @@ rte_eal_init(int argc, char **argv)
RTE_LOG(DEBUG, EAL, "Specific IOVA mode is not requested, autodetecting\n");
if (has_phys_addr) {
RTE_LOG(DEBUG, EAL, "Selecting IOVA mode according to bus requests\n");
- iova_mode = rte_bus_get_iommu_class();
+ iova_mode = bus_iova_mode;
if (iova_mode == RTE_IOVA_DC)
iova_mode = RTE_IOVA_PA;
} else {
--
2.47.3
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2025-10-27 15:54:35.909480984 +0000
+++ 0028-eal-fix-DMA-mask-validation-with-IOVA-mode-option.patch 2025-10-27 15:54:34.803949751 +0000
@@ -1 +1 @@
-From e37ff4ef296f33e4c3a0e9306241c4f8fcae5061 Mon Sep 17 00:00:00 2001
+From 0980930c32a05807f48c2cace72e5e2e5dabf7a7 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit e37ff4ef296f33e4c3a0e9306241c4f8fcae5061 ]
+
@@ -23 +24,0 @@
-Cc: stable at dpdk.org
@@ -34 +35 @@
-index c1ab8d86d2..0f957919d3 100644
+index 008a6c68e4..aa9f85c647 100644
@@ -37 +38 @@
-@@ -670,12 +670,16 @@ rte_eal_init(int argc, char **argv)
+@@ -692,6 +692,10 @@ rte_eal_init(int argc, char **argv)
@@ -46,2 +47,4 @@
- if (iova_mode == RTE_IOVA_DC) {
- EAL_LOG(DEBUG, "Specific IOVA mode is not requested, autodetecting");
+ if (iova_mode == RTE_IOVA_PA && !has_phys_addr) {
+ rte_eal_init_alert("Cannot use IOVA as 'PA' since physical addresses are not available");
+@@ -702,7 +706,7 @@ rte_eal_init(int argc, char **argv)
+ RTE_LOG(DEBUG, EAL, "Specific IOVA mode is not requested, autodetecting\n");
@@ -49 +52 @@
- EAL_LOG(DEBUG, "Selecting IOVA mode according to bus requests");
+ RTE_LOG(DEBUG, EAL, "Selecting IOVA mode according to bus requests\n");
@@ -52,3 +55,3 @@
- if (iova_mode == RTE_IOVA_DC) {
- if (!RTE_IOVA_IN_MBUF) {
- iova_mode = RTE_IOVA_VA;
+ if (iova_mode == RTE_IOVA_DC)
+ iova_mode = RTE_IOVA_PA;
+ } else {
@@ -56 +59 @@
-index 52efb8626b..3a0c9c9db6 100644
+index f6ac970ed9..9f9a03bcf7 100644
@@ -59 +62 @@
-@@ -1042,10 +1042,13 @@ rte_eal_init(int argc, char **argv)
+@@ -1065,10 +1065,13 @@ rte_eal_init(int argc, char **argv)
@@ -73 +76 @@
- EAL_LOG(DEBUG, "Buses did not request a specific IOVA mode.");
+ RTE_LOG(DEBUG, EAL, "Buses did not request a specific IOVA mode.\n");
@@ -75 +78 @@
-index 4f0a164d9b..2502ec3c3d 100644
+index 56fadc7afe..3a459172f9 100644
@@ -78 +81 @@
-@@ -348,12 +348,15 @@ rte_eal_init(int argc, char **argv)
+@@ -359,6 +359,9 @@ rte_eal_init(int argc, char **argv)
@@ -86,2 +89,4 @@
- if (iova_mode == RTE_IOVA_DC) {
- EAL_LOG(DEBUG, "Specific IOVA mode is not requested, autodetecting");
+ if (iova_mode == RTE_IOVA_PA && !has_phys_addr) {
+ rte_eal_init_alert("Cannot use IOVA as 'PA' since physical addresses are not available");
+@@ -369,7 +372,7 @@ rte_eal_init(int argc, char **argv)
+ RTE_LOG(DEBUG, EAL, "Specific IOVA mode is not requested, autodetecting\n");
@@ -89 +94 @@
- EAL_LOG(DEBUG, "Selecting IOVA mode according to bus requests");
+ RTE_LOG(DEBUG, EAL, "Selecting IOVA mode according to bus requests\n");
@@ -92,3 +97,3 @@
- if (iova_mode == RTE_IOVA_DC) {
- if (!RTE_IOVA_IN_MBUF) {
- iova_mode = RTE_IOVA_VA;
+ if (iova_mode == RTE_IOVA_DC)
+ iova_mode = RTE_IOVA_PA;
+ } else {
More information about the stable
mailing list