Skip to content

Commit

Permalink
iommu: Allocate a default domain for iommu groups
Browse files Browse the repository at this point in the history
The default domain will be used (if supported by the iommu
driver) when the devices in the iommu group are not attached
to any other domain.

Signed-off-by: Joerg Roedel <jroedel@suse.de>
  • Loading branch information
Joerg Roedel committed Jun 9, 2015
1 parent 843cb6d commit 53723dc
Showing 1 changed file with 27 additions and 4 deletions.
31 changes: 27 additions & 4 deletions drivers/iommu/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ struct iommu_group {
void (*iommu_data_release)(void *iommu_data);
char *name;
int id;
struct iommu_domain *default_domain;
};

struct iommu_device {
Expand All @@ -75,6 +76,9 @@ struct iommu_group_attribute iommu_group_attr_##_name = \
#define to_iommu_group(_kobj) \
container_of(_kobj, struct iommu_group, kobj)

static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
unsigned type);

static ssize_t iommu_group_attr_show(struct kobject *kobj,
struct attribute *__attr, char *buf)
{
Expand Down Expand Up @@ -137,6 +141,9 @@ static void iommu_group_release(struct kobject *kobj)
ida_remove(&iommu_group_ida, group->id);
mutex_unlock(&iommu_group_mutex);

if (group->default_domain)
iommu_domain_free(group->default_domain);

kfree(group->name);
kfree(group);
}
Expand Down Expand Up @@ -701,7 +708,17 @@ static struct iommu_group *iommu_group_get_for_pci_dev(struct pci_dev *pdev)
return group;

/* No shared group found, allocate new */
return iommu_group_alloc();
group = iommu_group_alloc();
if (group) {
/*
* Try to allocate a default domain - needs support from the
* IOMMU driver.
*/
group->default_domain = __iommu_domain_alloc(pdev->dev.bus,
IOMMU_DOMAIN_DMA);
}

return group;
}

/**
Expand Down Expand Up @@ -922,22 +939,28 @@ void iommu_set_fault_handler(struct iommu_domain *domain,
}
EXPORT_SYMBOL_GPL(iommu_set_fault_handler);

struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
unsigned type)
{
struct iommu_domain *domain;

if (bus == NULL || bus->iommu_ops == NULL)
return NULL;

domain = bus->iommu_ops->domain_alloc(IOMMU_DOMAIN_UNMANAGED);
domain = bus->iommu_ops->domain_alloc(type);
if (!domain)
return NULL;

domain->ops = bus->iommu_ops;
domain->type = IOMMU_DOMAIN_UNMANAGED;
domain->type = type;

return domain;
}

struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
{
return __iommu_domain_alloc(bus, IOMMU_DOMAIN_UNMANAGED);
}
EXPORT_SYMBOL_GPL(iommu_domain_alloc);

void iommu_domain_free(struct iommu_domain *domain)
Expand Down

0 comments on commit 53723dc

Please sign in to comment.