* [PATCH v2 0/5] iommu: Implement iommu_put_resv_regions_simple()
@ 2019-12-09 14:50 Thierry Reding
2019-12-09 14:50 ` [PATCH v2 1/5] " Thierry Reding
` (5 more replies)
0 siblings, 6 replies; 9+ messages in thread
From: Thierry Reding @ 2019-12-09 14:50 UTC (permalink / raw)
To: Joerg Roedel
Cc: Will Deacon, Robin Murphy, David Woodhouse,
Jean-Philippe Brucker, Christoph Hellwig, iommu,
linux-arm-kernel, virtualization, linux-kernel
From: Thierry Reding <treding@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 v2:
- change subject prefix to "iommu: virtio: " for virtio-iommu.c driver
Thierry
Thierry Reding (5):
iommu: Implement iommu_put_resv_regions_simple()
iommu: arm: Use iommu_put_resv_regions_simple()
iommu: amd: Use iommu_put_resv_regions_simple()
iommu: intel: Use iommu_put_resv_regions_simple()
iommu: virtio: Use iommu_put_resv_regions_simple()
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.23.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 1/5] iommu: Implement iommu_put_resv_regions_simple()
2019-12-09 14:50 [PATCH v2 0/5] iommu: Implement iommu_put_resv_regions_simple() Thierry Reding
@ 2019-12-09 14:50 ` Thierry Reding
2019-12-09 14:50 ` [PATCH v2 2/5] iommu: arm: Use iommu_put_resv_regions_simple() Thierry Reding
` (4 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Thierry Reding @ 2019-12-09 14:50 UTC (permalink / raw)
To: Joerg Roedel
Cc: Will Deacon, Robin Murphy, David Woodhouse,
Jean-Philippe Brucker, Christoph Hellwig, iommu,
linux-arm-kernel, virtualization, linux-kernel
From: Thierry Reding <treding@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@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 db7bfd4f2d20..a46d3bcafa06 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);
}
+/**
+ * iommu_put_resv_regions_simple - 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 iommu_put_resv_regions_simple(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(iommu_put_resv_regions_simple);
+
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..a249aa55596b 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 iommu_put_resv_regions_simple(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.23.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 2/5] iommu: arm: Use iommu_put_resv_regions_simple()
2019-12-09 14:50 [PATCH v2 0/5] iommu: Implement iommu_put_resv_regions_simple() Thierry Reding
2019-12-09 14:50 ` [PATCH v2 1/5] " Thierry Reding
@ 2019-12-09 14:50 ` Thierry Reding
2019-12-17 10:59 ` Will Deacon
2019-12-09 14:50 ` [PATCH v2 3/5] iommu: amd: " Thierry Reding
` (3 subsequent siblings)
5 siblings, 1 reply; 9+ messages in thread
From: Thierry Reding @ 2019-12-09 14:50 UTC (permalink / raw)
To: Joerg Roedel
Cc: Will Deacon, Robin Murphy, David Woodhouse,
Jean-Philippe Brucker, Christoph Hellwig, iommu,
linux-arm-kernel, virtualization, linux-kernel
From: Thierry Reding <treding@nvidia.com>
Use the new standard function instead of open-coding it.
Cc: Will Deacon <will@kernel.org>
Cc: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Thierry Reding <treding@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..eebf6086080f 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 = iommu_put_resv_regions_simple,
.pgsize_bitmap = -1UL, /* Restricted during device attach */
};
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 31ad3fe9a6d1..d1aef07bb784 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 = iommu_put_resv_regions_simple,
.pgsize_bitmap = -1UL, /* Restricted during device attach */
};
--
2.23.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 3/5] iommu: amd: Use iommu_put_resv_regions_simple()
2019-12-09 14:50 [PATCH v2 0/5] iommu: Implement iommu_put_resv_regions_simple() Thierry Reding
2019-12-09 14:50 ` [PATCH v2 1/5] " Thierry Reding
2019-12-09 14:50 ` [PATCH v2 2/5] iommu: arm: Use iommu_put_resv_regions_simple() Thierry Reding
@ 2019-12-09 14:50 ` Thierry Reding
2019-12-09 14:50 ` [PATCH v2 4/5] iommu: intel: " Thierry Reding
` (2 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Thierry Reding @ 2019-12-09 14:50 UTC (permalink / raw)
To: Joerg Roedel
Cc: Will Deacon, Robin Murphy, David Woodhouse,
Jean-Philippe Brucker, Christoph Hellwig, iommu,
linux-arm-kernel, virtualization, linux-kernel
From: Thierry Reding <treding@nvidia.com>
Use the new standard function instead of open-coding it.
Signed-off-by: Thierry Reding <treding@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 bd25674ee4db..5896cbe6106b 100644
--- a/drivers/iommu/amd_iommu.c
+++ b/drivers/iommu/amd_iommu.c
@@ -2641,15 +2641,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)
{
@@ -2688,7 +2679,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 = iommu_put_resv_regions_simple,
.is_attach_deferred = amd_iommu_is_attach_deferred,
.pgsize_bitmap = AMD_IOMMU_PGSIZES,
.flush_iotlb_all = amd_iommu_flush_iotlb_all,
--
2.23.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 4/5] iommu: intel: Use iommu_put_resv_regions_simple()
2019-12-09 14:50 [PATCH v2 0/5] iommu: Implement iommu_put_resv_regions_simple() Thierry Reding
` (2 preceding siblings ...)
2019-12-09 14:50 ` [PATCH v2 3/5] iommu: amd: " Thierry Reding
@ 2019-12-09 14:50 ` Thierry Reding
2019-12-09 14:50 ` [PATCH v2 5/5] iommu: virtio: " Thierry Reding
2019-12-17 10:08 ` [PATCH v2 0/5] iommu: Implement iommu_put_resv_regions_simple() Joerg Roedel
5 siblings, 0 replies; 9+ messages in thread
From: Thierry Reding @ 2019-12-09 14:50 UTC (permalink / raw)
To: Joerg Roedel
Cc: Will Deacon, Robin Murphy, David Woodhouse,
Jean-Philippe Brucker, Christoph Hellwig, iommu,
linux-arm-kernel, virtualization, linux-kernel
From: Thierry Reding <treding@nvidia.com>
Use the new standard function instead of open-coding it.
Cc: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Thierry Reding <treding@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 0c8d81f56a30..480f424f6a47 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -5752,15 +5752,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;
@@ -5995,7 +5986,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 = iommu_put_resv_regions_simple,
.apply_resv_region = intel_iommu_apply_resv_region,
.device_group = pci_device_group,
.dev_has_feat = intel_iommu_dev_has_feat,
--
2.23.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 5/5] iommu: virtio: Use iommu_put_resv_regions_simple()
2019-12-09 14:50 [PATCH v2 0/5] iommu: Implement iommu_put_resv_regions_simple() Thierry Reding
` (3 preceding siblings ...)
2019-12-09 14:50 ` [PATCH v2 4/5] iommu: intel: " Thierry Reding
@ 2019-12-09 14:50 ` Thierry Reding
2019-12-11 15:44 ` Jean-Philippe Brucker
2019-12-17 10:08 ` [PATCH v2 0/5] iommu: Implement iommu_put_resv_regions_simple() Joerg Roedel
5 siblings, 1 reply; 9+ messages in thread
From: Thierry Reding @ 2019-12-09 14:50 UTC (permalink / raw)
To: Joerg Roedel
Cc: Will Deacon, Robin Murphy, David Woodhouse,
Jean-Philippe Brucker, Christoph Hellwig, iommu,
linux-arm-kernel, virtualization, linux-kernel
From: Thierry Reding <treding@nvidia.com>
Use the new standard function instead of open-coding it.
Cc: Jean-Philippe Brucker <jean-philippe@linaro.org>
Cc: virtualization@lists.linux-foundation.org
Signed-off-by: Thierry Reding <treding@nvidia.com>
---
Changes in v2:
- change subject prefix to 'iommu: virt:' to 'iommu: virtio:'
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..834e56a28d4d 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);
+ iommu_put_resv_regions_simple(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);
+ iommu_put_resv_regions_simple(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 = iommu_put_resv_regions_simple,
.of_xlate = viommu_of_xlate,
};
--
2.23.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 5/5] iommu: virtio: Use iommu_put_resv_regions_simple()
2019-12-09 14:50 ` [PATCH v2 5/5] iommu: virtio: " Thierry Reding
@ 2019-12-11 15:44 ` Jean-Philippe Brucker
0 siblings, 0 replies; 9+ messages in thread
From: Jean-Philippe Brucker @ 2019-12-11 15:44 UTC (permalink / raw)
To: Thierry Reding
Cc: Joerg Roedel, Will Deacon, Robin Murphy, David Woodhouse,
Christoph Hellwig, iommu, linux-arm-kernel, virtualization,
linux-kernel
On Mon, Dec 09, 2019 at 03:50:07PM +0100, Thierry Reding wrote:
> From: Thierry Reding <treding@nvidia.com>
>
> Use the new standard function instead of open-coding it.
>
> Cc: Jean-Philippe Brucker <jean-philippe@linaro.org>
> Cc: virtualization@lists.linux-foundation.org
> Signed-off-by: Thierry Reding <treding@nvidia.com>
Reviewed-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 0/5] iommu: Implement iommu_put_resv_regions_simple()
2019-12-09 14:50 [PATCH v2 0/5] iommu: Implement iommu_put_resv_regions_simple() Thierry Reding
` (4 preceding siblings ...)
2019-12-09 14:50 ` [PATCH v2 5/5] iommu: virtio: " Thierry Reding
@ 2019-12-17 10:08 ` Joerg Roedel
5 siblings, 0 replies; 9+ messages in thread
From: Joerg Roedel @ 2019-12-17 10:08 UTC (permalink / raw)
To: Thierry Reding
Cc: Will Deacon, Robin Murphy, David Woodhouse,
Jean-Philippe Brucker, Christoph Hellwig, iommu,
linux-arm-kernel, virtualization, linux-kernel
Hi Thierry
On Mon, Dec 09, 2019 at 03:50:02PM +0100, Thierry Reding wrote:
> From: Thierry Reding <treding@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 v2:
> - change subject prefix to "iommu: virtio: " for virtio-iommu.c driver
>
> Thierry
>
> Thierry Reding (5):
> iommu: Implement iommu_put_resv_regions_simple()
> iommu: arm: Use iommu_put_resv_regions_simple()
> iommu: amd: Use iommu_put_resv_regions_simple()
> iommu: intel: Use iommu_put_resv_regions_simple()
> iommu: virtio: Use iommu_put_resv_regions_simple()
Thanks, that is a nice consolidation. Just a minor nit, can you please
rename iommu_put_resv_regions_simple to
generic_iommu_put_resv_regsions(). That matches the naming in other
places where we have done similar things.
Thanks,
Joerg
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/5] iommu: arm: Use iommu_put_resv_regions_simple()
2019-12-09 14:50 ` [PATCH v2 2/5] iommu: arm: Use iommu_put_resv_regions_simple() Thierry Reding
@ 2019-12-17 10:59 ` Will Deacon
0 siblings, 0 replies; 9+ messages in thread
From: Will Deacon @ 2019-12-17 10:59 UTC (permalink / raw)
To: Thierry Reding
Cc: Joerg Roedel, Robin Murphy, David Woodhouse,
Jean-Philippe Brucker, Christoph Hellwig, iommu,
linux-arm-kernel, virtualization, linux-kernel
On Mon, Dec 09, 2019 at 03:50:04PM +0100, Thierry Reding wrote:
> From: Thierry Reding <treding@nvidia.com>
>
> Use the new standard function instead of open-coding it.
>
> Cc: Will Deacon <will@kernel.org>
> Cc: Robin Murphy <robin.murphy@arm.com>
> Signed-off-by: Thierry Reding <treding@nvidia.com>
> ---
> drivers/iommu/arm-smmu-v3.c | 11 +----------
> drivers/iommu/arm-smmu.c | 11 +----------
> 2 files changed, 2 insertions(+), 20 deletions(-)
Acked-by: Will Deacon <will@kernel.org>
Will
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2019-12-17 10:59 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-09 14:50 [PATCH v2 0/5] iommu: Implement iommu_put_resv_regions_simple() Thierry Reding
2019-12-09 14:50 ` [PATCH v2 1/5] " Thierry Reding
2019-12-09 14:50 ` [PATCH v2 2/5] iommu: arm: Use iommu_put_resv_regions_simple() Thierry Reding
2019-12-17 10:59 ` Will Deacon
2019-12-09 14:50 ` [PATCH v2 3/5] iommu: amd: " Thierry Reding
2019-12-09 14:50 ` [PATCH v2 4/5] iommu: intel: " Thierry Reding
2019-12-09 14:50 ` [PATCH v2 5/5] iommu: virtio: " Thierry Reding
2019-12-11 15:44 ` Jean-Philippe Brucker
2019-12-17 10:08 ` [PATCH v2 0/5] iommu: Implement iommu_put_resv_regions_simple() Joerg Roedel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).