Skip to content
/ linux Public
forked from torvalds/linux

Commit

Permalink
iommu/amd: Set the pgsize_bitmap correctly
Browse files Browse the repository at this point in the history
When using io_pgtable the correct pgsize_bitmap is stored in the cfg, both
v1_alloc_pgtable() and v2_alloc_pgtable() set it correctly.

This fixes a bug where the v2 pgtable had the wrong pgsize as
protection_domain_init_v2() would set it and then do_iommu_domain_alloc()
immediately resets it.

Remove the confusing ops.pgsize_bitmap since that is not used if the
driver sets domain.pgsize_bitmap.

Fixes: 1342881 ("iommu/amd: Add domain_alloc_user based domain allocation")
Reviewed-by: Vasant Hegde <[email protected]>
Signed-off-by: Jason Gunthorpe <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Joerg Roedel <[email protected]>
  • Loading branch information
jgunthorpe authored and joergroedel committed Sep 4, 2024
1 parent b0a6c88 commit 7a41dcb
Showing 1 changed file with 4 additions and 24 deletions.
28 changes: 4 additions & 24 deletions drivers/iommu/amd/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -2264,26 +2264,11 @@ void protection_domain_free(struct protection_domain *domain)
kfree(domain);
}

static int protection_domain_init_v1(struct protection_domain *domain)
{
domain->pd_mode = PD_MODE_V1;
return 0;
}

static int protection_domain_init_v2(struct protection_domain *pdom)
{
pdom->pd_mode = PD_MODE_V2;
pdom->domain.pgsize_bitmap = AMD_IOMMU_PGSIZES_V2;

return 0;
}

struct protection_domain *protection_domain_alloc(unsigned int type)
{
struct io_pgtable_ops *pgtbl_ops;
struct protection_domain *domain;
int pgtable;
int ret;

domain = kzalloc(sizeof(*domain), GFP_KERNEL);
if (!domain)
Expand Down Expand Up @@ -2319,18 +2304,14 @@ struct protection_domain *protection_domain_alloc(unsigned int type)

switch (pgtable) {
case AMD_IOMMU_V1:
ret = protection_domain_init_v1(domain);
domain->pd_mode = PD_MODE_V1;
break;
case AMD_IOMMU_V2:
ret = protection_domain_init_v2(domain);
domain->pd_mode = PD_MODE_V2;
break;
default:
ret = -EINVAL;
break;
}

if (ret)
goto out_err;
}

pgtbl_ops = alloc_io_pgtable_ops(pgtable, &domain->iop.pgtbl_cfg, domain);
if (!pgtbl_ops)
Expand Down Expand Up @@ -2383,10 +2364,10 @@ static struct iommu_domain *do_iommu_domain_alloc(unsigned int type,
domain->domain.geometry.aperture_start = 0;
domain->domain.geometry.aperture_end = dma_max_address();
domain->domain.geometry.force_aperture = true;
domain->domain.pgsize_bitmap = domain->iop.iop.cfg.pgsize_bitmap;

if (iommu) {
domain->domain.type = type;
domain->domain.pgsize_bitmap = iommu->iommu.ops->pgsize_bitmap;
domain->domain.ops = iommu->iommu.ops->default_domain_ops;

if (dirty_tracking)
Expand Down Expand Up @@ -2869,7 +2850,6 @@ const struct iommu_ops amd_iommu_ops = {
.device_group = amd_iommu_device_group,
.get_resv_regions = amd_iommu_get_resv_regions,
.is_attach_deferred = amd_iommu_is_attach_deferred,
.pgsize_bitmap = AMD_IOMMU_PGSIZES,
.def_domain_type = amd_iommu_def_domain_type,
.dev_enable_feat = amd_iommu_dev_enable_feature,
.dev_disable_feat = amd_iommu_dev_disable_feature,
Expand Down

0 comments on commit 7a41dcb

Please sign in to comment.