diff options
| author | Angela Stegmaier <angelabaker@ti.com> | 2011-05-31 09:24:36 +0100 |
|---|---|---|
| committer | Andy Green <andy.green@linaro.org> | 2011-05-31 11:06:06 +0100 |
| commit | eb0e5198252f006ce0b31085a4bc2af0d833f166 (patch) | |
| tree | f73a56bb02df4145fa0d90c750478f88756b72b3 /arch | |
| parent | 0eca056750a13de1ea4cd5c3923ec011b3581e36 (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.h | 1 | ||||
| -rw-r--r-- | arch/arm/plat-omap/iommu.c | 1 | ||||
| -rw-r--r-- | arch/arm/plat-omap/iovmm.c | 4 |
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: |
