Re: [PATCH v4 06/13] iommu/arm-smmu-v3: Add context descriptor tables allocators
On Tue, Jan 14, 2020 at 12:52:30PM +0100, Jean-Philippe Brucker wrote: > On Tue, Jan 14, 2020 at 11:06:52AM +, Will Deacon wrote: > > > /* Context descriptor manipulation functions */ > > > +static int arm_smmu_alloc_cd_leaf_table(struct arm_smmu_device *smmu, > > > + struct arm_smmu_cd_table *table, > > > + size_t num_entries) > > > +{ > > > + size_t size = num_entries * (CTXDESC_CD_DWORDS << 3); > > > + > > > + table->ptr = dmam_alloc_coherent(smmu->dev, size, &table->ptr_dma, > > > + GFP_KERNEL); > > > + if (!table->ptr) { > > > + dev_warn(smmu->dev, > > > + "failed to allocate context descriptor table\n"); > > > + return -ENOMEM; > > > + } > > > + return 0; > > > +} > > > + > > > +static void arm_smmu_free_cd_leaf_table(struct arm_smmu_device *smmu, > > > + struct arm_smmu_cd_table *table, > > > + size_t num_entries) > > > +{ > > > + size_t size = num_entries * (CTXDESC_CD_DWORDS << 3); > > > + > > > + dmam_free_coherent(smmu->dev, size, table->ptr, table->ptr_dma); > > > +} > > > > I think we'd be better off taking the 'arm_smmu_s1_cfg' as a parameter here > > instead of the table pointer and a num_entries value, since the code above > > implies that we support partial freeing of the context descriptors. > > > > I can do that as a follow-up patch if you agree. Thoughts? > > Do you mean only changing the arguments of arm_smmu_free_cd_leaf_table(), > or arm_smmu_alloc_cd_leaf_table() as well? For free() I agree, for alloc() > I'm not sure it would look better. Yeah, just for free(). I'll spin something on top after I've finished reviewing the series. > For my tests I have a debug patch that allocates PASIDs randomly which > quickly consumes DMA for leaf tables. So I do have to free the leaves > individually when they aren't used, but it will be easy for me to update. Cool. Will ___ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu
Re: [PATCH v4 06/13] iommu/arm-smmu-v3: Add context descriptor tables allocators
On Tue, Jan 14, 2020 at 11:06:52AM +, Will Deacon wrote: > > /* Context descriptor manipulation functions */ > > +static int arm_smmu_alloc_cd_leaf_table(struct arm_smmu_device *smmu, > > + struct arm_smmu_cd_table *table, > > + size_t num_entries) > > +{ > > + size_t size = num_entries * (CTXDESC_CD_DWORDS << 3); > > + > > + table->ptr = dmam_alloc_coherent(smmu->dev, size, &table->ptr_dma, > > +GFP_KERNEL); > > + if (!table->ptr) { > > + dev_warn(smmu->dev, > > +"failed to allocate context descriptor table\n"); > > + return -ENOMEM; > > + } > > + return 0; > > +} > > + > > +static void arm_smmu_free_cd_leaf_table(struct arm_smmu_device *smmu, > > + struct arm_smmu_cd_table *table, > > + size_t num_entries) > > +{ > > + size_t size = num_entries * (CTXDESC_CD_DWORDS << 3); > > + > > + dmam_free_coherent(smmu->dev, size, table->ptr, table->ptr_dma); > > +} > > I think we'd be better off taking the 'arm_smmu_s1_cfg' as a parameter here > instead of the table pointer and a num_entries value, since the code above > implies that we support partial freeing of the context descriptors. > > I can do that as a follow-up patch if you agree. Thoughts? Do you mean only changing the arguments of arm_smmu_free_cd_leaf_table(), or arm_smmu_alloc_cd_leaf_table() as well? For free() I agree, for alloc() I'm not sure it would look better. For my tests I have a debug patch that allocates PASIDs randomly which quickly consumes DMA for leaf tables. So I do have to free the leaves individually when they aren't used, but it will be easy for me to update. Thanks, Jean ___ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu
Re: [PATCH v4 06/13] iommu/arm-smmu-v3: Add context descriptor tables allocators
On Thu, Dec 19, 2019 at 05:30:26PM +0100, Jean-Philippe Brucker wrote: > Support for SSID will require allocating context descriptor tables. Move > the context descriptor allocation to separate functions. > > Reviewed-by: Eric Auger > Reviewed-by: Jonathan Cameron > Signed-off-by: Jean-Philippe Brucker > --- > drivers/iommu/arm-smmu-v3.c | 57 ++--- > 1 file changed, 46 insertions(+), 11 deletions(-) > > diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c > index b287e303b1d7..43d6a7ded6e4 100644 > --- a/drivers/iommu/arm-smmu-v3.c > +++ b/drivers/iommu/arm-smmu-v3.c > @@ -568,6 +568,7 @@ struct arm_smmu_cd_table { > struct arm_smmu_s1_cfg { > struct arm_smmu_cd_tabletable; > struct arm_smmu_ctx_desccd; > + u8 s1cdmax; > }; > > struct arm_smmu_s2_cfg { > @@ -1455,6 +1456,31 @@ static int arm_smmu_cmdq_issue_sync(struct > arm_smmu_device *smmu) > } > > /* Context descriptor manipulation functions */ > +static int arm_smmu_alloc_cd_leaf_table(struct arm_smmu_device *smmu, > + struct arm_smmu_cd_table *table, > + size_t num_entries) > +{ > + size_t size = num_entries * (CTXDESC_CD_DWORDS << 3); > + > + table->ptr = dmam_alloc_coherent(smmu->dev, size, &table->ptr_dma, > + GFP_KERNEL); > + if (!table->ptr) { > + dev_warn(smmu->dev, > + "failed to allocate context descriptor table\n"); > + return -ENOMEM; > + } > + return 0; > +} > + > +static void arm_smmu_free_cd_leaf_table(struct arm_smmu_device *smmu, > + struct arm_smmu_cd_table *table, > + size_t num_entries) > +{ > + size_t size = num_entries * (CTXDESC_CD_DWORDS << 3); > + > + dmam_free_coherent(smmu->dev, size, table->ptr, table->ptr_dma); > +} I think we'd be better off taking the 'arm_smmu_s1_cfg' as a parameter here instead of the table pointer and a num_entries value, since the code above implies that we support partial freeing of the context descriptors. I can do that as a follow-up patch if you agree. Thoughts? Will ___ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu