Am 04.10.23 um 01:03 schrieb Andi Shyti:
From: Chris Wilson <chris.p.wilson@xxxxxxxxxxxxxxx>
Enforce that an mmap of a dmabuf is always using MAP_SHARED so that all
access (both read and writes) using the device memory and not a local
copy-on-write page in system memory.
As much as I would like to do this I fear that this won't work.
First of all interesting approach to do this in .get_unmapped_area. The
standard handling is to have the check like "if
(is_cow_mapping(vma->vm_flags)) return -EINVAL;", see TTM for example.
Then IIRC we already tried this and had to revert it because it breaks
the UAPI. Some broken applications actually use shared mappings (but not
really cow) and we would like to keep them working.
Regards,
Christian.
Signed-off-by: Chris Wilson <chris.p.wilson@xxxxxxxxxxxxxxx>
Signed-off-by: Andi Shyti <andi.shyti@xxxxxxxxxxxxxxx>
---
drivers/dma-buf/dma-buf.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
index 21916bba77d5..1ec297241842 100644
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
@@ -25,6 +25,7 @@
#include <linux/poll.h>
#include <linux/dma-resv.h>
#include <linux/mm.h>
+#include <linux/mman.h>
#include <linux/mount.h>
#include <linux/pseudo_fs.h>
@@ -128,6 +129,19 @@ static struct file_system_type dma_buf_fs_type = {
.kill_sb = kill_anon_super,
};
+static unsigned long
+dma_buf_get_unmapped_area(struct file *file,
+ unsigned long addr,
+ unsigned long len,
+ unsigned long pgoff,
+ unsigned long flags)
+{
+ if ((flags & MAP_TYPE) == MAP_PRIVATE)
+ return -EINVAL;
+
+ return current->mm->get_unmapped_area(file, addr, len, pgoff, flags);
+}
+
static int dma_buf_mmap_internal(struct file *file, struct vm_area_struct *vma)
{
struct dma_buf *dmabuf;
@@ -508,6 +522,7 @@ static void dma_buf_show_fdinfo(struct seq_file *m, struct file *file)
static const struct file_operations dma_buf_fops = {
.release = dma_buf_file_release,
+ .get_unmapped_area = dma_buf_get_unmapped_area,
.mmap = dma_buf_mmap_internal,
.llseek = dma_buf_llseek,
.poll = dma_buf_poll,