[RFC 3/6] udmabuf: enforce access flags

Gurchetan Singh gurchetansingh at chromium.org
Thu Aug 1 02:25:14 UTC 2019


Enforce the access flags that were added earlier.

Signed-off-by: Gurchetan Singh <gurchetansingh at chromium.org>
---
 drivers/dma-buf/udmabuf.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c
index 4ecf2a94fed3..134e53d24c2b 100644
--- a/drivers/dma-buf/udmabuf.c
+++ b/drivers/dma-buf/udmabuf.c
@@ -16,6 +16,7 @@ static const u32    list_limit = 1024;  /* udmabuf_create_list->count limit */
 static const size_t size_limit_mb = 64; /* total dmabuf size, in megabytes  */
 
 struct udmabuf {
+	u32 flags;
 	pgoff_t pagecount;
 	struct page **pages;
 };
@@ -37,10 +38,17 @@ static const struct vm_operations_struct udmabuf_vm_ops = {
 static int mmap_udmabuf(struct dma_buf *buf, struct vm_area_struct *vma)
 {
 	struct udmabuf *ubuf = buf->priv;
+	pgprot_t pgprot = vm_get_page_prot(vma->vm_flags);
 
 	if ((vma->vm_flags & (VM_SHARED | VM_MAYSHARE)) == 0)
 		return -EINVAL;
 
+	if (ubuf->flags & UDMABUF_FLAGS_PROT_NONE)
+		return -EINVAL;
+
+	if ((ubuf->flags & UDMABUF_FLAGS_PROT_READ) == 0)
+		vma->vm_page_prot = pgprot_writecombine(pgprot);
+
 	vma->vm_ops = &udmabuf_vm_ops;
 	vma->vm_private_data = ubuf;
 	return 0;
@@ -193,6 +201,7 @@ static long udmabuf_create(const struct udmabuf_create_list *head,
 	else if (head->flags & UDMABUF_FLAGS_PROT_WRITE)
 		exp_info.flags = O_WRONLY;
 
+	ubuf->flags = head->flags;
 	buf = dma_buf_export(&exp_info);
 	if (IS_ERR(buf)) {
 		ret = PTR_ERR(buf);
-- 
2.17.1



More information about the dri-devel mailing list