Re: [PATCH] dma-buf: Deny copy-on-writes mmaps

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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,




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux