summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorAngela Stegmaier <angelabaker@ti.com>2011-05-31 09:24:36 +0100
committerAndy Green <andy.green@linaro.org>2011-05-31 11:06:06 +0100
commiteb0e5198252f006ce0b31085a4bc2af0d833f166 (patch)
treef73a56bb02df4145fa0d90c750478f88756b72b3 /arch
parent0eca056750a13de1ea4cd5c3923ec011b3581e36 (diff)
omap:iommu-add spinlock protection to event list access
This patch adds spinlock protection to event list accesses in order to avoid list corruption. Signed-off-by: Angela Stegmaier <angelabaker@ti.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/plat-omap/include/plat/iommu.h1
-rw-r--r--arch/arm/plat-omap/iommu.c1
-rw-r--r--arch/arm/plat-omap/iovmm.c4
3 files changed, 6 insertions, 0 deletions
diff --git a/arch/arm/plat-omap/include/plat/iommu.h b/arch/arm/plat-omap/include/plat/iommu.h
index 8c737be12fb..d8acbdaf82a 100644
--- a/arch/arm/plat-omap/include/plat/iommu.h
+++ b/arch/arm/plat-omap/include/plat/iommu.h
@@ -56,6 +56,7 @@ struct iommu {
u32 da_end;
struct platform_device *pdev;
struct list_head event_list;
+ spinlock_t event_lock;
};
struct cr_regs {
diff --git a/arch/arm/plat-omap/iommu.c b/arch/arm/plat-omap/iommu.c
index b23a1806262..09f9a67b84c 100644
--- a/arch/arm/plat-omap/iommu.c
+++ b/arch/arm/plat-omap/iommu.c
@@ -956,6 +956,7 @@ static int __devinit omap_iommu_probe(struct platform_device *pdev)
spin_lock_init(&obj->page_table_lock);
INIT_LIST_HEAD(&obj->mmap);
+ spin_lock_init(&obj->event_lock);
INIT_LIST_HEAD(&obj->event_list);
obj->regbase = pdata->io_base;
diff --git a/arch/arm/plat-omap/iovmm.c b/arch/arm/plat-omap/iovmm.c
index ddf1f8a37ec..98b694b1cbe 100644
--- a/arch/arm/plat-omap/iovmm.c
+++ b/arch/arm/plat-omap/iovmm.c
@@ -251,7 +251,9 @@ static int omap_iovmm_ioctl(struct inode *inode, struct file *filp,
fd_reg->fd = fd;
fd_reg->evt_ctx = eventfd_ctx_fdget(fd);
INIT_LIST_HEAD(&fd_reg->list);
+ spin_lock_irq(&obj->iovmm->iommu->event_lock);
list_add_tail(&fd_reg->list, &obj->iovmm->iommu->event_list);
+ spin_unlock_irq(&obj->iovmm->iommu->event_lock);
break;
}
case IOMMU_IOCEVENTUNREG:
@@ -266,6 +268,7 @@ static int omap_iovmm_ioctl(struct inode *inode, struct file *filp,
goto err_user_buf;
}
/* Free DMM mapped memory resources */
+ spin_lock_irq(&obj->iovmm->iommu->event_lock);
list_for_each_entry_safe(fd_reg, temp_reg,
&obj->iovmm->iommu->event_list, list) {
if (fd_reg->fd == fd) {
@@ -273,6 +276,7 @@ static int omap_iovmm_ioctl(struct inode *inode, struct file *filp,
kfree(fd_reg);
}
}
+ spin_unlock_irq(&obj->iovmm->iommu->event_lock);
break;
}
case IOVMM_IOCMEMFLUSH: