Skip to content

Commit

Permalink
iommu: Simplify and fix ida handling
Browse files Browse the repository at this point in the history
Ida handling can be much simplified by using the ida_simple_.. functions.

This change also fixes the bug that previously checking for errors
returned by ida_get_new() was incomplete.
ida_get_new() can return errors other than EAGAIN, e.g. ENOSPC.
This case wasn't handled.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
  • Loading branch information
Heiner Kallweit authored and Joerg Roedel committed Jul 13, 2016
1 parent e38d1f1 commit feccf39
Showing 1 changed file with 6 additions and 18 deletions.
24 changes: 6 additions & 18 deletions drivers/iommu/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@

static struct kset *iommu_group_kset;
static DEFINE_IDA(iommu_group_ida);
static DEFINE_MUTEX(iommu_group_mutex);

struct iommu_callback_data {
const struct iommu_ops *ops;
Expand Down Expand Up @@ -144,9 +143,7 @@ static void iommu_group_release(struct kobject *kobj)
if (group->iommu_data_release)
group->iommu_data_release(group->iommu_data);

mutex_lock(&iommu_group_mutex);
ida_remove(&iommu_group_ida, group->id);
mutex_unlock(&iommu_group_mutex);
ida_simple_remove(&iommu_group_ida, group->id);

if (group->default_domain)
iommu_domain_free(group->default_domain);
Expand Down Expand Up @@ -186,26 +183,17 @@ struct iommu_group *iommu_group_alloc(void)
INIT_LIST_HEAD(&group->devices);
BLOCKING_INIT_NOTIFIER_HEAD(&group->notifier);

mutex_lock(&iommu_group_mutex);

again:
if (unlikely(0 == ida_pre_get(&iommu_group_ida, GFP_KERNEL))) {
ret = ida_simple_get(&iommu_group_ida, 0, 0, GFP_KERNEL);
if (ret < 0) {
kfree(group);
mutex_unlock(&iommu_group_mutex);
return ERR_PTR(-ENOMEM);
return ERR_PTR(ret);
}

if (-EAGAIN == ida_get_new(&iommu_group_ida, &group->id))
goto again;

mutex_unlock(&iommu_group_mutex);
group->id = ret;

ret = kobject_init_and_add(&group->kobj, &iommu_group_ktype,
NULL, "%d", group->id);
if (ret) {
mutex_lock(&iommu_group_mutex);
ida_remove(&iommu_group_ida, group->id);
mutex_unlock(&iommu_group_mutex);
ida_simple_remove(&iommu_group_ida, group->id);
kfree(group);
return ERR_PTR(ret);
}
Expand Down

0 comments on commit feccf39

Please sign in to comment.