diff options
author | Alexey Kardashevskiy <aik@ozlabs.ru> | 2013-03-25 10:23:49 +1100 |
---|---|---|
committer | Joerg Roedel <joro@8bytes.org> | 2013-04-24 19:56:51 +0200 |
commit | aa16bea929aed6ea854b55d2be8306a9fb40e694 (patch) | |
tree | 2a2cead5f2b1123b4b4b13d307d6db035e2c13fe /drivers | |
parent | 61e015ac5b4d46c2054a78d9bc82c840274929a0 (diff) | |
download | lwn-aa16bea929aed6ea854b55d2be8306a9fb40e694.tar.gz lwn-aa16bea929aed6ea854b55d2be8306a9fb40e694.zip |
iommu: Add a function to find an iommu group by id
As IOMMU groups are exposed to the user space by their numbers,
the user space can use them in various kernel APIs so the kernel
might need an API to find a group by its ID.
As an example, QEMU VFIO on PPC64 platform needs it to associate
a logical bus number (LIOBN) with a specific IOMMU group in order
to support in-kernel handling of DMA map/unmap requests.
The patch adds the iommu_group_get_by_id(id) function which performs
such search.
v2: fixed reference counting.
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Acked-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Joerg Roedel <joro@8bytes.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/iommu/iommu.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index b972d430d92b..db01af01ce0a 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -204,6 +204,35 @@ again: } EXPORT_SYMBOL_GPL(iommu_group_alloc); +struct iommu_group *iommu_group_get_by_id(int id) +{ + struct kobject *group_kobj; + struct iommu_group *group; + const char *name; + + if (!iommu_group_kset) + return NULL; + + name = kasprintf(GFP_KERNEL, "%d", id); + if (!name) + return NULL; + + group_kobj = kset_find_obj(iommu_group_kset, name); + kfree(name); + + if (!group_kobj) + return NULL; + + group = container_of(group_kobj, struct iommu_group, kobj); + BUG_ON(group->id != id); + + kobject_get(group->devices_kobj); + kobject_put(&group->kobj); + + return group; +} +EXPORT_SYMBOL_GPL(iommu_group_get_by_id); + /** * iommu_group_get_iommudata - retrieve iommu_data registered for a group * @group: the group |