summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/plat-omap/dmm_user.c10
-rw-r--r--arch/arm/plat-omap/include/plat/iommu.h2
-rw-r--r--arch/arm/plat-omap/iommu.c11
3 files changed, 16 insertions, 7 deletions
diff --git a/arch/arm/plat-omap/dmm_user.c b/arch/arm/plat-omap/dmm_user.c
index 30f8bedee140..3afa28db3d2d 100644
--- a/arch/arm/plat-omap/dmm_user.c
+++ b/arch/arm/plat-omap/dmm_user.c
@@ -244,7 +244,15 @@ static int omap_dmm_release(struct inode *inode, struct file *filp)
}
obj = filp->private_data;
flush_signals(current);
- iommu_notify_event(obj->iovmm->iommu, IOMMU_CLOSE, NULL);
+
+ status = mutex_lock_interruptible(&obj->iovmm->dmm_map_lock);
+ if (status == 0) {
+ iommu_notify_event(obj->iovmm->iommu, IOMMU_CLOSE, NULL);
+ mutex_unlock(&obj->iovmm->dmm_map_lock);
+ } else {
+ pr_err("%s mutex_lock_interruptible returned 0x%x\n",
+ __func__, status);
+ }
user_remove_resources(obj);
iommu_put(obj->iovmm->iommu);
kfree(obj);
diff --git a/arch/arm/plat-omap/include/plat/iommu.h b/arch/arm/plat-omap/include/plat/iommu.h
index 2d949d4947d1..80311a1684fd 100644
--- a/arch/arm/plat-omap/include/plat/iommu.h
+++ b/arch/arm/plat-omap/include/plat/iommu.h
@@ -46,7 +46,7 @@ struct iommu {
struct list_head mmap;
struct mutex mmap_lock; /* protect mmap */
- struct blocking_notifier_head notifier;
+ struct raw_notifier_head notifier;
struct iotlb_entry *tlbs_e;/* iommu tlbs context: saved area */
diff --git a/arch/arm/plat-omap/iommu.c b/arch/arm/plat-omap/iommu.c
index d5deb3e60007..d728af8aec6b 100644
--- a/arch/arm/plat-omap/iommu.c
+++ b/arch/arm/plat-omap/iommu.c
@@ -827,15 +827,16 @@ void eventfd_notification(struct iommu *obj)
eventfd_signal(fd_reg->evt_ctx, 1);
}
-int iommu_notify_event(struct iommu *obj, int event, void *data) {
- return blocking_notifier_call_chain(&obj->notifier, event, data);
+int iommu_notify_event(struct iommu *obj, int event, void *data)
+{
+ return raw_notifier_call_chain(&obj->notifier, event, data);
}
int iommu_register_notifier(struct iommu *obj, struct notifier_block *nb)
{
if (!nb)
return -EINVAL;
- return blocking_notifier_chain_register(&obj->notifier, nb);
+ return raw_notifier_chain_register(&obj->notifier, nb);
}
EXPORT_SYMBOL_GPL(iommu_register_notifier);
@@ -843,7 +844,7 @@ int iommu_unregister_notifier(struct iommu *obj, struct notifier_block *nb)
{
if (!nb)
return -EINVAL;
- return blocking_notifier_chain_unregister(&obj->notifier, nb);
+ return raw_notifier_chain_unregister(&obj->notifier, nb);
}
EXPORT_SYMBOL_GPL(iommu_unregister_notifier);
@@ -995,7 +996,7 @@ static int __devinit omap_iommu_probe(struct platform_device *pdev)
INIT_LIST_HEAD(&obj->event_list);
obj->regbase = pdata->io_base;
- BLOCKING_INIT_NOTIFIER_HEAD(&obj->notifier);
+ RAW_INIT_NOTIFIER_HEAD(&obj->notifier);
err = request_irq(pdata->irq, iommu_fault_handler, IRQF_SHARED,
dev_name(&pdev->dev), obj);