|
@@ -74,7 +74,7 @@ struct ipmmu_vmsa_domain {
|
|
|
struct io_pgtable_ops *iop;
|
|
|
|
|
|
unsigned int context_id;
|
|
|
- spinlock_t lock; /* Protects mappings */
|
|
|
+ struct mutex mutex; /* Protects mappings */
|
|
|
};
|
|
|
|
|
|
static struct ipmmu_vmsa_domain *to_vmsa_domain(struct iommu_domain *dom)
|
|
@@ -600,7 +600,7 @@ static struct iommu_domain *__ipmmu_domain_alloc(unsigned type)
|
|
|
if (!domain)
|
|
|
return NULL;
|
|
|
|
|
|
- spin_lock_init(&domain->lock);
|
|
|
+ mutex_init(&domain->mutex);
|
|
|
|
|
|
return &domain->io_domain;
|
|
|
}
|
|
@@ -646,7 +646,6 @@ static int ipmmu_attach_device(struct iommu_domain *io_domain,
|
|
|
struct iommu_fwspec *fwspec = dev->iommu_fwspec;
|
|
|
struct ipmmu_vmsa_device *mmu = to_ipmmu(dev);
|
|
|
struct ipmmu_vmsa_domain *domain = to_vmsa_domain(io_domain);
|
|
|
- unsigned long flags;
|
|
|
unsigned int i;
|
|
|
int ret = 0;
|
|
|
|
|
@@ -655,7 +654,7 @@ static int ipmmu_attach_device(struct iommu_domain *io_domain,
|
|
|
return -ENXIO;
|
|
|
}
|
|
|
|
|
|
- spin_lock_irqsave(&domain->lock, flags);
|
|
|
+ mutex_lock(&domain->mutex);
|
|
|
|
|
|
if (!domain->mmu) {
|
|
|
/* The domain hasn't been used yet, initialize it. */
|
|
@@ -679,7 +678,7 @@ static int ipmmu_attach_device(struct iommu_domain *io_domain,
|
|
|
} else
|
|
|
dev_info(dev, "Reusing IPMMU context %u\n", domain->context_id);
|
|
|
|
|
|
- spin_unlock_irqrestore(&domain->lock, flags);
|
|
|
+ mutex_unlock(&domain->mutex);
|
|
|
|
|
|
if (ret < 0)
|
|
|
return ret;
|