ion: use vm_insert_pfn for faulted pages
authorColin Cross <ccross@android.com>
Tue, 26 Nov 2013 23:05:46 +0000 (15:05 -0800)
committerColin Cross <ccross@android.com>
Thu, 12 Dec 2013 23:27:10 +0000 (15:27 -0800)
Most ion userspace mappings are created with remap_pfn_range.  Use
vm_insert_pfn instead of vm_insert_page to make faulted cached
mappings look more like uncached mappings.

Change-Id: I9ec5cad3fef54f3b80be8b306d7ff2f1fe3f0e66
Signed-off-by: Colin Cross <ccross@android.com>
drivers/staging/android/ion/ion.c

index fb345975937974c3e0cc0477c988ab4bd2fb2e77..4ccdda706f3c53f4bf25e24e2b796d83bdf9cd5b 100644 (file)
@@ -890,14 +890,15 @@ static void ion_buffer_sync_for_device(struct ion_buffer *buffer,
 int ion_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 {
        struct ion_buffer *buffer = vma->vm_private_data;
+       unsigned long pfn;
        int ret;
 
        mutex_lock(&buffer->lock);
        ion_buffer_page_dirty(buffer->pages + vmf->pgoff);
-
        BUG_ON(!buffer->pages || !buffer->pages[vmf->pgoff]);
-       ret = vm_insert_page(vma, (unsigned long)vmf->virtual_address,
-                            ion_buffer_page(buffer->pages[vmf->pgoff]));
+
+       pfn = page_to_pfn(ion_buffer_page(buffer->pages[vmf->pgoff]));
+       ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);
        mutex_unlock(&buffer->lock);
        if (ret)
                return VM_FAULT_ERROR;
@@ -956,6 +957,8 @@ static int ion_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma)
        }
 
        if (ion_buffer_fault_user_mappings(buffer)) {
+               vma->vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND |
+                                                       VM_DONTDUMP;
                vma->vm_private_data = buffer;
                vma->vm_ops = &ion_vma_ops;
                ion_vm_open(vma);