aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/ttm
diff options
context:
space:
mode:
authorThomas Hellstrom <thellstrom@vmware.com>2014-01-03 03:21:54 -0500
committerThomas Hellstrom <thellstrom@vmware.com>2014-01-08 03:53:12 -0500
commit7dfe8b6187f43d791229b1f8eef9b7fa872f7195 (patch)
tree9242269f1c1b31608b7510ad612e34a0692ec9d2 /drivers/gpu/drm/ttm
parent859ae233cd0ee76b6143f948ba1cb6b0b4c342f8 (diff)
drm/ttm: Use VM_PFNMAP for shared bo maps
VM_PFNMAP is faster than VM_MIXEDMAP due to reduced page administration so use it for shared maps where we don't have any Copy-On-Write pages. For private maps, we continue to use VM_MIXEDMAP. Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
Diffstat (limited to 'drivers/gpu/drm/ttm')
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo_vm.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
index b249ab9b1eb2..cdda78458885 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
@@ -220,7 +220,11 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
220 pfn = page_to_pfn(page); 220 pfn = page_to_pfn(page);
221 } 221 }
222 222
223 ret = vm_insert_mixed(&cvma, address, pfn); 223 if (vma->vm_flags & VM_MIXEDMAP)
224 ret = vm_insert_mixed(&cvma, address, pfn);
225 else
226 ret = vm_insert_pfn(&cvma, address, pfn);
227
224 /* 228 /*
225 * Somebody beat us to this PTE or prefaulting to 229 * Somebody beat us to this PTE or prefaulting to
226 * an already populated PTE, or prefaulting error. 230 * an already populated PTE, or prefaulting error.
@@ -319,7 +323,14 @@ int ttm_bo_mmap(struct file *filp, struct vm_area_struct *vma,
319 */ 323 */
320 324
321 vma->vm_private_data = bo; 325 vma->vm_private_data = bo;
322 vma->vm_flags |= VM_IO | VM_MIXEDMAP | VM_DONTEXPAND | VM_DONTDUMP; 326
327 /*
328 * PFNMAP is faster than MIXEDMAP due to reduced page
329 * administration. So use MIXEDMAP only if private VMA, where
330 * we need to support COW.
331 */
332 vma->vm_flags |= (vma->vm_flags & VM_SHARED) ? VM_PFNMAP : VM_MIXEDMAP;
333 vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP;
323 return 0; 334 return 0;
324out_unref: 335out_unref:
325 ttm_bo_unref(&bo); 336 ttm_bo_unref(&bo);
@@ -334,7 +345,8 @@ int ttm_fbdev_mmap(struct vm_area_struct *vma, struct ttm_buffer_object *bo)
334 345
335 vma->vm_ops = &ttm_bo_vm_ops; 346 vma->vm_ops = &ttm_bo_vm_ops;
336 vma->vm_private_data = ttm_bo_reference(bo); 347 vma->vm_private_data = ttm_bo_reference(bo);
337 vma->vm_flags |= VM_IO | VM_MIXEDMAP | VM_DONTEXPAND; 348 vma->vm_flags |= (vma->vm_flags & VM_SHARED) ? VM_PFNMAP : VM_MIXEDMAP;
349 vma->vm_flags |= VM_IO | VM_DONTEXPAND;
338 return 0; 350 return 0;
339} 351}
340EXPORT_SYMBOL(ttm_fbdev_mmap); 352EXPORT_SYMBOL(ttm_fbdev_mmap);