Commit 13f59a78 authored by Robin Murphy's avatar Robin Murphy Committed by Joerg Roedel

iommu: Allow taking a reference on a group directly

iommu_group_get_for_dev() expects that the IOMMU driver's device_group
callback return a group with a reference held for the given device.
Whilst allocating a new group is fine, and pci_device_group() correctly
handles reusing an existing group, there is no general means for IOMMU
drivers doing their own group lookup to take additional references on an
existing group pointer without having to also store device pointers or
resort to elaborate trickery.

Add an IOMMU-driver-specific function to fill the hole.
Acked-by: default avatarSricharan R <sricharan@codeaurora.org>
Signed-off-by: default avatarRobin Murphy <robin.murphy@arm.com>
Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 60c4e804
...@@ -551,6 +551,19 @@ struct iommu_group *iommu_group_get(struct device *dev) ...@@ -551,6 +551,19 @@ struct iommu_group *iommu_group_get(struct device *dev)
} }
EXPORT_SYMBOL_GPL(iommu_group_get); EXPORT_SYMBOL_GPL(iommu_group_get);
/**
* iommu_group_ref_get - Increment reference on a group
* @group: the group to use, must not be NULL
*
* This function is called by iommu drivers to take additional references on an
* existing group. Returns the given group for convenience.
*/
struct iommu_group *iommu_group_ref_get(struct iommu_group *group)
{
kobject_get(group->devices_kobj);
return group;
}
/** /**
* iommu_group_put - Decrement group reference * iommu_group_put - Decrement group reference
* @group: the group to use * @group: the group to use
......
...@@ -253,6 +253,7 @@ extern void iommu_group_remove_device(struct device *dev); ...@@ -253,6 +253,7 @@ extern void iommu_group_remove_device(struct device *dev);
extern int iommu_group_for_each_dev(struct iommu_group *group, void *data, extern int iommu_group_for_each_dev(struct iommu_group *group, void *data,
int (*fn)(struct device *, void *)); int (*fn)(struct device *, void *));
extern struct iommu_group *iommu_group_get(struct device *dev); extern struct iommu_group *iommu_group_get(struct device *dev);
extern struct iommu_group *iommu_group_ref_get(struct iommu_group *group);
extern void iommu_group_put(struct iommu_group *group); extern void iommu_group_put(struct iommu_group *group);
extern int iommu_group_register_notifier(struct iommu_group *group, extern int iommu_group_register_notifier(struct iommu_group *group,
struct notifier_block *nb); struct notifier_block *nb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment