Thierry Reding
2019-Dec-18 13:42 UTC
[PATCH v3 0/5] iommu: Implement generic_iommu_put_resv_regions()
From: Thierry Reding <treding at nvidia.com> Most IOMMU drivers only need to free the memory allocated for each reserved region. Instead of open-coding the loop to do this in each driver, extract the code into a common function that can be used by all these drivers. Changes in v3: - add Reviewed-by from Jean-Philippe Brucker on virtio patch - add Acked-by from Will Deacon on ARM SMMU patch - rename to generic_iommu_put_resv_regions() Changes in v2: - change subject prefix to "iommu: virtio: " for virtio-iommu.c driver Thierry Thierry Reding (5): iommu: Implement generic_iommu_put_resv_regions() iommu: arm: Use generic_iommu_put_resv_regions() iommu: amd: Use generic_iommu_put_resv_regions() iommu: intel: Use generic_iommu_put_resv_regions() iommu: virtio: Use generic_iommu_put_resv_regions() drivers/iommu/amd_iommu.c | 11 +---------- drivers/iommu/arm-smmu-v3.c | 11 +---------- drivers/iommu/arm-smmu.c | 11 +---------- drivers/iommu/intel-iommu.c | 11 +---------- drivers/iommu/iommu.c | 19 +++++++++++++++++++ drivers/iommu/virtio-iommu.c | 14 +++----------- include/linux/iommu.h | 2 ++ 7 files changed, 28 insertions(+), 51 deletions(-) -- 2.24.1
Thierry Reding
2019-Dec-18 13:42 UTC
[PATCH v3 1/5] iommu: Implement generic_iommu_put_resv_regions()
From: Thierry Reding <treding at nvidia.com> Implement a generic function for removing reserved regions. This can be used by drivers that don't do anything fancy with these regions other than allocating memory for them. Signed-off-by: Thierry Reding <treding at nvidia.com> --- drivers/iommu/iommu.c | 19 +++++++++++++++++++ include/linux/iommu.h | 2 ++ 2 files changed, 21 insertions(+) diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index fdd40756dbc1..101f2d68eb6e 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -2229,6 +2229,25 @@ void iommu_put_resv_regions(struct device *dev, struct list_head *list) ops->put_resv_regions(dev, list); } +/** + * generic_iommu_put_resv_regions - Reserved region driver helper + * @dev: device for which to free reserved regions + * @list: reserved region list for device + * + * IOMMU drivers can use this to implement their .put_resv_regions() callback + * for simple reservations. Memory allocated for each reserved region will be + * freed. If an IOMMU driver allocates additional resources per region, it is + * going to have to implement a custom callback. + */ +void generic_iommu_put_resv_regions(struct device *dev, struct list_head *list) +{ + struct iommu_resv_region *entry, *next; + + list_for_each_entry_safe(entry, next, list, list) + kfree(entry); +} +EXPORT_SYMBOL(generic_iommu_put_resv_regions); + struct iommu_resv_region *iommu_alloc_resv_region(phys_addr_t start, size_t length, int prot, enum iommu_resv_type type) diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 1b4fbe703950..2e06b31579c2 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -477,6 +477,8 @@ extern void iommu_set_fault_handler(struct iommu_domain *domain, extern void iommu_get_resv_regions(struct device *dev, struct list_head *list); extern void iommu_put_resv_regions(struct device *dev, struct list_head *list); +extern void generic_iommu_put_resv_regions(struct device *dev, + struct list_head *list); extern int iommu_request_dm_for_dev(struct device *dev); extern int iommu_request_dma_domain_for_dev(struct device *dev); extern void iommu_set_default_passthrough(bool cmd_line); -- 2.24.1
Thierry Reding
2019-Dec-18 13:42 UTC
[PATCH v3 2/5] iommu: arm: Use generic_iommu_put_resv_regions()
From: Thierry Reding <treding at nvidia.com> Use the new standard function instead of open-coding it. Cc: Will Deacon <will at kernel.org> Cc: Robin Murphy <robin.murphy at arm.com> Acked-by: Will Deacon <will at kernel.org> Signed-off-by: Thierry Reding <treding at nvidia.com> --- drivers/iommu/arm-smmu-v3.c | 11 +---------- drivers/iommu/arm-smmu.c | 11 +---------- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c index effe72eb89e7..7f5b74a418de 100644 --- a/drivers/iommu/arm-smmu-v3.c +++ b/drivers/iommu/arm-smmu-v3.c @@ -2710,15 +2710,6 @@ static void arm_smmu_get_resv_regions(struct device *dev, iommu_dma_get_resv_regions(dev, head); } -static void arm_smmu_put_resv_regions(struct device *dev, - struct list_head *head) -{ - struct iommu_resv_region *entry, *next; - - list_for_each_entry_safe(entry, next, head, list) - kfree(entry); -} - static struct iommu_ops arm_smmu_ops = { .capable = arm_smmu_capable, .domain_alloc = arm_smmu_domain_alloc, @@ -2736,7 +2727,7 @@ static struct iommu_ops arm_smmu_ops = { .domain_set_attr = arm_smmu_domain_set_attr, .of_xlate = arm_smmu_of_xlate, .get_resv_regions = arm_smmu_get_resv_regions, - .put_resv_regions = arm_smmu_put_resv_regions, + .put_resv_regions = generic_iommu_put_resv_regions, .pgsize_bitmap = -1UL, /* Restricted during device attach */ }; diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c index 31ad3fe9a6d1..7a5978bbeca8 100644 --- a/drivers/iommu/arm-smmu.c +++ b/drivers/iommu/arm-smmu.c @@ -1576,15 +1576,6 @@ static void arm_smmu_get_resv_regions(struct device *dev, iommu_dma_get_resv_regions(dev, head); } -static void arm_smmu_put_resv_regions(struct device *dev, - struct list_head *head) -{ - struct iommu_resv_region *entry, *next; - - list_for_each_entry_safe(entry, next, head, list) - kfree(entry); -} - static struct iommu_ops arm_smmu_ops = { .capable = arm_smmu_capable, .domain_alloc = arm_smmu_domain_alloc, @@ -1602,7 +1593,7 @@ static struct iommu_ops arm_smmu_ops = { .domain_set_attr = arm_smmu_domain_set_attr, .of_xlate = arm_smmu_of_xlate, .get_resv_regions = arm_smmu_get_resv_regions, - .put_resv_regions = arm_smmu_put_resv_regions, + .put_resv_regions = generic_iommu_put_resv_regions, .pgsize_bitmap = -1UL, /* Restricted during device attach */ }; -- 2.24.1
Thierry Reding
2019-Dec-18 13:42 UTC
[PATCH v3 3/5] iommu: amd: Use generic_iommu_put_resv_regions()
From: Thierry Reding <treding at nvidia.com> Use the new standard function instead of open-coding it. Signed-off-by: Thierry Reding <treding at nvidia.com> --- drivers/iommu/amd_iommu.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index 7a6c056b9b9c..9ea6c4b8e402 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -2638,15 +2638,6 @@ static void amd_iommu_get_resv_regions(struct device *dev, list_add_tail(®ion->list, head); } -static void amd_iommu_put_resv_regions(struct device *dev, - struct list_head *head) -{ - struct iommu_resv_region *entry, *next; - - list_for_each_entry_safe(entry, next, head, list) - kfree(entry); -} - static bool amd_iommu_is_attach_deferred(struct iommu_domain *domain, struct device *dev) { @@ -2685,7 +2676,7 @@ const struct iommu_ops amd_iommu_ops = { .device_group = amd_iommu_device_group, .domain_get_attr = amd_iommu_domain_get_attr, .get_resv_regions = amd_iommu_get_resv_regions, - .put_resv_regions = amd_iommu_put_resv_regions, + .put_resv_regions = generic_iommu_put_resv_regions, .is_attach_deferred = amd_iommu_is_attach_deferred, .pgsize_bitmap = AMD_IOMMU_PGSIZES, .flush_iotlb_all = amd_iommu_flush_iotlb_all, -- 2.24.1
Thierry Reding
2019-Dec-18 13:42 UTC
[PATCH v3 4/5] iommu: intel: Use generic_iommu_put_resv_regions()
From: Thierry Reding <treding at nvidia.com> Use the new standard function instead of open-coding it. Cc: David Woodhouse <dwmw2 at infradead.org> Signed-off-by: Thierry Reding <treding at nvidia.com> --- drivers/iommu/intel-iommu.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 42966611a192..a6d5b7cf9183 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -5744,15 +5744,6 @@ static void intel_iommu_get_resv_regions(struct device *device, list_add_tail(®->list, head); } -static void intel_iommu_put_resv_regions(struct device *dev, - struct list_head *head) -{ - struct iommu_resv_region *entry, *next; - - list_for_each_entry_safe(entry, next, head, list) - kfree(entry); -} - int intel_iommu_enable_pasid(struct intel_iommu *iommu, struct device *dev) { struct device_domain_info *info; @@ -5987,7 +5978,7 @@ const struct iommu_ops intel_iommu_ops = { .add_device = intel_iommu_add_device, .remove_device = intel_iommu_remove_device, .get_resv_regions = intel_iommu_get_resv_regions, - .put_resv_regions = intel_iommu_put_resv_regions, + .put_resv_regions = generic_iommu_put_resv_regions, .apply_resv_region = intel_iommu_apply_resv_region, .device_group = pci_device_group, .dev_has_feat = intel_iommu_dev_has_feat, -- 2.24.1
Thierry Reding
2019-Dec-18 13:42 UTC
[PATCH v3 5/5] iommu: virtio: Use generic_iommu_put_resv_regions()
From: Thierry Reding <treding at nvidia.com> Use the new standard function instead of open-coding it. Cc: Jean-Philippe Brucker <jean-philippe at linaro.org> Cc: virtualization at lists.linux-foundation.org Reviewed-by: Jean-Philippe Brucker <jean-philippe at linaro.org> Signed-off-by: Thierry Reding <treding at nvidia.com> --- drivers/iommu/virtio-iommu.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c index 315c7cc4f99d..cce329d71fba 100644 --- a/drivers/iommu/virtio-iommu.c +++ b/drivers/iommu/virtio-iommu.c @@ -837,14 +837,6 @@ static void viommu_get_resv_regions(struct device *dev, struct list_head *head) iommu_dma_get_resv_regions(dev, head); } -static void viommu_put_resv_regions(struct device *dev, struct list_head *head) -{ - struct iommu_resv_region *entry, *next; - - list_for_each_entry_safe(entry, next, head, list) - kfree(entry); -} - static struct iommu_ops viommu_ops; static struct virtio_driver virtio_iommu_drv; @@ -914,7 +906,7 @@ static int viommu_add_device(struct device *dev) err_unlink_dev: iommu_device_unlink(&viommu->iommu, dev); err_free_dev: - viommu_put_resv_regions(dev, &vdev->resv_regions); + generic_iommu_put_resv_regions(dev, &vdev->resv_regions); kfree(vdev); return ret; @@ -932,7 +924,7 @@ static void viommu_remove_device(struct device *dev) iommu_group_remove_device(dev); iommu_device_unlink(&vdev->viommu->iommu, dev); - viommu_put_resv_regions(dev, &vdev->resv_regions); + generic_iommu_put_resv_regions(dev, &vdev->resv_regions); kfree(vdev); } @@ -961,7 +953,7 @@ static struct iommu_ops viommu_ops = { .remove_device = viommu_remove_device, .device_group = viommu_device_group, .get_resv_regions = viommu_get_resv_regions, - .put_resv_regions = viommu_put_resv_regions, + .put_resv_regions = generic_iommu_put_resv_regions, .of_xlate = viommu_of_xlate, }; -- 2.24.1
Thierry Reding
2019-Dec-19 12:47 UTC
[PATCH v3 4/5] iommu: intel: Use generic_iommu_put_resv_regions()
On Thu, Dec 19, 2019 at 09:53:22AM +0800, Lu Baolu wrote:> Please tweak the title to > > "iommu/vt-d: Use generic_iommu_put_resv_regions()" > > then, > > Acked-by: Lu Baolu <baolu.lu at linux.intel.com> > > Best regards, > baoluJoerg, do you want me to resend with this change or is it more efficient if you fix up the subject while applying? Thierry> On 12/18/19 9:42 PM, Thierry Reding wrote: > > From: Thierry Reding <treding at nvidia.com> > > > > Use the new standard function instead of open-coding it. > > > > Cc: David Woodhouse <dwmw2 at infradead.org> > > Signed-off-by: Thierry Reding <treding at nvidia.com> > > --- > > drivers/iommu/intel-iommu.c | 11 +---------- > > 1 file changed, 1 insertion(+), 10 deletions(-) > > > > diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c > > index 42966611a192..a6d5b7cf9183 100644 > > --- a/drivers/iommu/intel-iommu.c > > +++ b/drivers/iommu/intel-iommu.c > > @@ -5744,15 +5744,6 @@ static void intel_iommu_get_resv_regions(struct device *device, > > list_add_tail(®->list, head); > > } > > -static void intel_iommu_put_resv_regions(struct device *dev, > > - struct list_head *head) > > -{ > > - struct iommu_resv_region *entry, *next; > > - > > - list_for_each_entry_safe(entry, next, head, list) > > - kfree(entry); > > -} > > - > > int intel_iommu_enable_pasid(struct intel_iommu *iommu, struct device *dev) > > { > > struct device_domain_info *info; > > @@ -5987,7 +5978,7 @@ const struct iommu_ops intel_iommu_ops = { > > .add_device = intel_iommu_add_device, > > .remove_device = intel_iommu_remove_device, > > .get_resv_regions = intel_iommu_get_resv_regions, > > - .put_resv_regions = intel_iommu_put_resv_regions, > > + .put_resv_regions = generic_iommu_put_resv_regions, > > .apply_resv_region = intel_iommu_apply_resv_region, > > .device_group = pci_device_group, > > .dev_has_feat = intel_iommu_dev_has_feat, > >-------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 833 bytes Desc: not available URL: <http://lists.linuxfoundation.org/pipermail/virtualization/attachments/20191219/1d201f11/attachment.sig>
Joerg Roedel
2019-Dec-19 15:35 UTC
[PATCH v3 4/5] iommu: intel: Use generic_iommu_put_resv_regions()
On Thu, Dec 19, 2019 at 01:47:47PM +0100, Thierry Reding wrote:> On Thu, Dec 19, 2019 at 09:53:22AM +0800, Lu Baolu wrote: > > Please tweak the title to > > > > "iommu/vt-d: Use generic_iommu_put_resv_regions()" > > > > then, > > > > Acked-by: Lu Baolu <baolu.lu at linux.intel.com> > > > > Best regards, > > baolu > > Joerg, do you want me to resend with this change or is it more efficient > if you fix up the subject while applying?No need to re-send, I'll fix it up in this patch and in the others too. Joerg
Reasonably Related Threads
- [PATCH v2 0/5] iommu: Implement iommu_put_resv_regions_simple()
- [PATCH v3 4/5] iommu: intel: Use generic_iommu_put_resv_regions()
- [PATCH v2 00/33] iommu: Move iommu_group setup to IOMMU core code
- [PATCH v2 00/33] iommu: Move iommu_group setup to IOMMU core code
- [PATCH v3 00/34] iommu: Move iommu_group setup to IOMMU core code