Skip to content

Commit

Permalink
iommu: Add a function to find an iommu group by id
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Alexey Kardashevskiy authored and Joerg Roedel committed Apr 24, 2013
1 parent 61e015a commit aa16bea
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 0 deletions.
29 changes: 29 additions & 0 deletions drivers/iommu/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,35 @@ struct iommu_group *iommu_group_alloc(void)
}
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
Expand Down
1 change: 1 addition & 0 deletions include/linux/iommu.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ struct iommu_ops {
extern int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops);
extern bool iommu_present(struct bus_type *bus);
extern struct iommu_domain *iommu_domain_alloc(struct bus_type *bus);
extern struct iommu_group *iommu_group_get_by_id(int id);
extern void iommu_domain_free(struct iommu_domain *domain);
extern int iommu_attach_device(struct iommu_domain *domain,
struct device *dev);
Expand Down

0 comments on commit aa16bea

Please sign in to comment.