aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLiam Mark <lmark@codeaurora.org>2019-01-18 13:37:44 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-01-22 05:38:09 -0500
commit31eb79db420a3f94c4c45a8c0a05cd30e333f981 (patch)
treea1f7be49aed0bd72a89eee2fef17735ba85f2271 /drivers
parent97715058b70da1262fd07798c8b2e3e894f759dd (diff)
staging: android: ion: Support cpu access during dma_buf_detach
Often userspace doesn't know when the kernel will be calling dma_buf_detach on the buffer. If userpace starts its CPU access at the same time as the sg list is being freed it could end up accessing the sg list after it has been freed. Thread A Thread B - DMA_BUF_IOCTL_SYNC IOCT - ion_dma_buf_begin_cpu_access - list_for_each_entry - ion_dma_buf_detatch - free_duped_table - dma_sync_sg_for_cpu Fix this by getting the ion_buffer lock before freeing the sg table memory. Fixes: 2a55e7b5e544 ("staging: android: ion: Call dma_map_sg for syncing and mapping") Signed-off-by: Liam Mark <lmark@codeaurora.org> Acked-by: Laura Abbott <labbott@redhat.com> Acked-by: Andrew F. Davis <afd@ti.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/staging/android/ion/ion.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c
index a0802de8c3a1..6f5afab7c1a1 100644
--- a/drivers/staging/android/ion/ion.c
+++ b/drivers/staging/android/ion/ion.c
@@ -248,10 +248,10 @@ static void ion_dma_buf_detatch(struct dma_buf *dmabuf,
248 struct ion_dma_buf_attachment *a = attachment->priv; 248 struct ion_dma_buf_attachment *a = attachment->priv;
249 struct ion_buffer *buffer = dmabuf->priv; 249 struct ion_buffer *buffer = dmabuf->priv;
250 250
251 free_duped_table(a->table);
252 mutex_lock(&buffer->lock); 251 mutex_lock(&buffer->lock);
253 list_del(&a->list); 252 list_del(&a->list);
254 mutex_unlock(&buffer->lock); 253 mutex_unlock(&buffer->lock);
254 free_duped_table(a->table);
255 255
256 kfree(a); 256 kfree(a);
257} 257}