Skip to content

Commit

Permalink
iommu: Consolitate ->add/remove_device() calls
Browse files Browse the repository at this point in the history
Put them into separate functions and call those where the
plain ops have been called before.

Signed-off-by: Joerg Roedel <jroedel@suse.de>
  • Loading branch information
Joerg Roedel committed Dec 17, 2018
1 parent 6954cf9 commit cc5aed4
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 26 deletions.
51 changes: 25 additions & 26 deletions drivers/iommu/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,23 @@ void iommu_device_unregister(struct iommu_device *iommu)
spin_unlock(&iommu_device_lock);
}

int iommu_probe_device(struct device *dev)
{
const struct iommu_ops *ops = dev->bus->iommu_ops;

WARN_ON(dev->iommu_group);

return ops->add_device(dev);
}

void iommu_release_device(struct device *dev)
{
const struct iommu_ops *ops = dev->bus->iommu_ops;

if (dev->iommu_group)
ops->remove_device(dev);
}

static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
unsigned type);
static int __iommu_attach_device(struct iommu_domain *domain,
Expand Down Expand Up @@ -1118,16 +1135,7 @@ struct iommu_domain *iommu_group_default_domain(struct iommu_group *group)

static int add_iommu_group(struct device *dev, void *data)
{
struct iommu_callback_data *cb = data;
const struct iommu_ops *ops = cb->ops;
int ret;

if (!ops->add_device)
return 0;

WARN_ON(dev->iommu_group);

ret = ops->add_device(dev);
int ret = iommu_probe_device(dev);

/*
* We ignore -ENODEV errors for now, as they just mean that the
Expand All @@ -1142,39 +1150,30 @@ static int add_iommu_group(struct device *dev, void *data)

static int remove_iommu_group(struct device *dev, void *data)
{
struct iommu_callback_data *cb = data;
const struct iommu_ops *ops = cb->ops;

if (ops->remove_device && dev->iommu_group)
ops->remove_device(dev);
iommu_release_device(dev);

return 0;
}

static int iommu_bus_notifier(struct notifier_block *nb,
unsigned long action, void *data)
{
unsigned long group_action = 0;
struct device *dev = data;
const struct iommu_ops *ops = dev->bus->iommu_ops;
struct iommu_group *group;
unsigned long group_action = 0;

/*
* ADD/DEL call into iommu driver ops if provided, which may
* result in ADD/DEL notifiers to group->notifier
*/
if (action == BUS_NOTIFY_ADD_DEVICE) {
if (ops->add_device) {
int ret;
int ret;

ret = ops->add_device(dev);
return (ret) ? NOTIFY_DONE : NOTIFY_OK;
}
ret = iommu_probe_device(dev);
return (ret) ? NOTIFY_DONE : NOTIFY_OK;
} else if (action == BUS_NOTIFY_REMOVED_DEVICE) {
if (ops->remove_device && dev->iommu_group) {
ops->remove_device(dev);
return 0;
}
iommu_release_device(dev);
return NOTIFY_OK;
}

/*
Expand Down
3 changes: 3 additions & 0 deletions include/linux/iommu.h
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,9 @@ static inline void dev_iommu_fwspec_set(struct device *dev,
dev->iommu_fwspec = fwspec;
}

int iommu_probe_device(struct device *dev);
void iommu_release_device(struct device *dev);

#else /* CONFIG_IOMMU_API */

struct iommu_ops {};
Expand Down

0 comments on commit cc5aed4

Please sign in to comment.