<div dir="ltr"><div>Hello,<br><br>I have a devices which writes to a video buffer. This buffer is allocated in system memory using CMA and I want to implement streaming write from this buffer to a block device. My application opens video buffer with mmap and I would like to use O_DIRECT write to avoid page cache related overhead. Basically, the pseudo-code of the application looks like this:<br><br>    f_in = open(&quot;/dev/videobuf&quot;, O_RDONLY);<br>    f_mmap = mmap(0, BUFFER_SIZE, PROT_READ, MAP_SHARED, f_in, 0);<br>    f_out = open(&quot;/dev/sda&quot;, O_WRONLY | O_DIRECT);<br>    write(f_out, f_mmap, BLOCK_SIZE);<br><br>where BLOCK_SIZE is sector aligned value. f_out is opened without any errors, but write results in EFAULT. I tried to track down this issue and it turned out that mmap implementation in video buffer&#39;s driver uses remap_pfn_range(), which sets VM_IO and VM_PFNMAP flags for VMA. The O_DIRECT path in block device drivers checks these flags and returns EFAULT. As far as I understand (from reading comments to VMA flags), O_DIRECT writes need to pin the memory pages, but VMA flags indicate the absence of &quot;struct page&quot; for underlying memory which causes an error. Am I right here? <br>And the main question is how to correctly implement O_DIRECT write from mmapped buffer? I have video buffer driver sources and can modify it appropriately.<br><br></div>Mikhail<br></div>