On Thu, 10 Sept 2026 at 14:56, Anatoly Burakov
<[email protected]> wrote:
> @@ -500,7 +507,8 @@ rte_dpaa2_get_iommu_class(void)
>                 return RTE_IOVA_DC;
>
>         /* check if all devices on the bus support Virtual addressing or not 
> */
> -       if (fslmc_all_device_support_iova() != 0 && 
> dev_vfio_noiommu_is_enabled() == 0)
> +       if (fslmc_all_device_support_iova() != 0 &&
> +                       dev_vfio_get_iommu_mode() == 
> DEV_VFIO_IOMMU_MODE_UNSAFE)
>                 return RTE_IOVA_VA;
>
>         return RTE_IOVA_PA;

IA flagged this part:

In `fslmc_bus.c`, the condition changed from:
```c
/* Old */
if (fslmc_all_device_support_iova() != 0 && dev_vfio_noiommu_is_enabled() == 0)
    return RTE_IOVA_VA;

/* New */
if (fslmc_all_device_support_iova() != 0 &&
        dev_vfio_get_iommu_mode() == DEV_VFIO_IOMMU_MODE_UNSAFE)
    return RTE_IOVA_VA;
```

The old code returned `RTE_IOVA_VA` when NOIOMMU was **disabled** (==
0), but the new code returns `RTE_IOVA_VA` when IOMMU mode is
**UNSAFE** (i.e., NOIOMMU is enabled).

Looking at `dev_vfio_noiommu_is_enabled()`:
```c
int
dev_vfio_noiommu_is_enabled(void)
{
    return vfio_global_cfg.iommu_mode == DEV_VFIO_IOMMU_MODE_UNSAFE;
}
```

So:
- Old: `dev_vfio_noiommu_is_enabled() == 0` → NOIOMMU is NOT enabled →
IOMMU is SAFE
- New: `dev_vfio_get_iommu_mode() == DEV_VFIO_IOMMU_MODE_UNSAFE` →
NOIOMMU IS enabled

**This is an inverted condition.** The old code returned `RTE_IOVA_VA`
when IOMMU was safe (NOIOMMU disabled), but the new code returns
`RTE_IOVA_VA` when IOMMU is unsafe (NOIOMMU enabled). This appears to
be a correctness bug that will change the IOVA mode selection
behavior.

**Suggested fix:** The new condition should likely be:
```c
if (fslmc_all_device_support_iova() != 0 &&
        dev_vfio_get_iommu_mode() != DEV_VFIO_IOMMU_MODE_UNSAFE)
    return RTE_IOVA_VA;
```

Or if the intent was to check for safe mode:
```c
if (fslmc_all_device_support_iova() != 0 &&
        dev_vfio_get_iommu_mode() == DEV_VFIO_IOMMU_MODE_SAFE)
    return RTE_IOVA_VA;
```

-- 
David Marchand

Reply via email to