diff --git a/drivers/iommu/io-pgtable-arm-common.c b/drivers/iommu/io-pgtable-arm-common.c index a8d803167fc2..a7d9604b102f 100644 --- a/drivers/iommu/io-pgtable-arm-common.c +++ b/drivers/iommu/io-pgtable-arm-common.c @@ -551,7 +551,7 @@ static phys_addr_t arm_lpae_iova_to_phys(struct io_pgtable_ops *ops, int ret; ret = __arm_lpae_iopte_walk(data, &walk_data, data->pgd, data->start_level); - if (ret) + if (ret || !iopte_valid(d.pte)) return 0; iova &= (ARM_LPAE_BLOCK_SIZE(d.lvl, data) - 1); @@ -614,8 +614,11 @@ static int io_pgtable_visit(struct arm_lpae_io_pgtable *data, return 0; } - if (!is_table) - return -EINVAL; + /* Don't fail the walk if one entry is invalid, just skip over it */ + if (!is_table) { + walk_data->addr += size; + return 0; + } ptep = iopte_deref(pte, data);