mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
iommu/io-pgtable-arm: Rationalise size check
It makes little sense to only validate the requested size after we think we've found a matching block size - making the check up-front is simple, and far more logical than waiting to walk off the bottom of the table to infer that we must have been passed a bogus size to start with. We're missing an equivalent check on the unmap path, so add that as well for consistency. Signed-off-by: Robin Murphy <robin.murphy@arm.com> Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
b5813c164e
commit
f7b90d2c74
1 changed files with 9 additions and 1 deletions
|
@ -392,7 +392,7 @@ static int __arm_lpae_map(struct arm_lpae_io_pgtable *data, unsigned long iova,
|
||||||
ptep += ARM_LPAE_LVL_IDX(iova, lvl, data);
|
ptep += ARM_LPAE_LVL_IDX(iova, lvl, data);
|
||||||
|
|
||||||
/* If we can install a leaf entry at this level, then do so */
|
/* If we can install a leaf entry at this level, then do so */
|
||||||
if (size == block_size && (size & cfg->pgsize_bitmap))
|
if (size == block_size)
|
||||||
return arm_lpae_init_pte(data, iova, paddr, prot, lvl, ptep);
|
return arm_lpae_init_pte(data, iova, paddr, prot, lvl, ptep);
|
||||||
|
|
||||||
/* We can't allocate tables at the final level */
|
/* We can't allocate tables at the final level */
|
||||||
|
@ -479,6 +479,7 @@ static int arm_lpae_map(struct io_pgtable_ops *ops, unsigned long iova,
|
||||||
phys_addr_t paddr, size_t size, int iommu_prot)
|
phys_addr_t paddr, size_t size, int iommu_prot)
|
||||||
{
|
{
|
||||||
struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
|
struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
|
||||||
|
struct io_pgtable_cfg *cfg = &data->iop.cfg;
|
||||||
arm_lpae_iopte *ptep = data->pgd;
|
arm_lpae_iopte *ptep = data->pgd;
|
||||||
int ret, lvl = ARM_LPAE_START_LVL(data);
|
int ret, lvl = ARM_LPAE_START_LVL(data);
|
||||||
arm_lpae_iopte prot;
|
arm_lpae_iopte prot;
|
||||||
|
@ -487,6 +488,9 @@ static int arm_lpae_map(struct io_pgtable_ops *ops, unsigned long iova,
|
||||||
if (!(iommu_prot & (IOMMU_READ | IOMMU_WRITE)))
|
if (!(iommu_prot & (IOMMU_READ | IOMMU_WRITE)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (WARN_ON(!size || (size & cfg->pgsize_bitmap) != size))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (WARN_ON(iova >= (1ULL << data->iop.cfg.ias) ||
|
if (WARN_ON(iova >= (1ULL << data->iop.cfg.ias) ||
|
||||||
paddr >= (1ULL << data->iop.cfg.oas)))
|
paddr >= (1ULL << data->iop.cfg.oas)))
|
||||||
return -ERANGE;
|
return -ERANGE;
|
||||||
|
@ -652,9 +656,13 @@ static size_t arm_lpae_unmap(struct io_pgtable_ops *ops, unsigned long iova,
|
||||||
size_t size, struct iommu_iotlb_gather *gather)
|
size_t size, struct iommu_iotlb_gather *gather)
|
||||||
{
|
{
|
||||||
struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
|
struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
|
||||||
|
struct io_pgtable_cfg *cfg = &data->iop.cfg;
|
||||||
arm_lpae_iopte *ptep = data->pgd;
|
arm_lpae_iopte *ptep = data->pgd;
|
||||||
int lvl = ARM_LPAE_START_LVL(data);
|
int lvl = ARM_LPAE_START_LVL(data);
|
||||||
|
|
||||||
|
if (WARN_ON(!size || (size & cfg->pgsize_bitmap) != size))
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (WARN_ON(iova >= (1ULL << data->iop.cfg.ias)))
|
if (WARN_ON(iova >= (1ULL << data->iop.cfg.ias)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue