| From d386735588c3e22129c2bc6eb64fc1d37a8f805c Mon Sep 17 00:00:00 2001 |
| From: Thomas Hellstrom <thellstrom@vmware.com> |
| Date: Sun, 8 Dec 2013 23:23:57 -0800 |
| Subject: drm/ttm: Fix accesses through vmas with only partial coverage |
| |
| From: Thomas Hellstrom <thellstrom@vmware.com> |
| |
| commit d386735588c3e22129c2bc6eb64fc1d37a8f805c upstream. |
| |
| VMAs covering a bo but that didn't start at the same address space offset as |
| the bo they were mapping were incorrectly generating SEGFAULT errors in |
| the fault handler. |
| |
| Reported-by: Joseph Dolinak <kanilo2@yahoo.com> |
| Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> |
| Reviewed-by: Jakob Bornecrantz <jakob@vmware.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/ttm/ttm_bo_vm.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c |
| +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c |
| @@ -116,9 +116,9 @@ static int ttm_bo_vm_fault(struct vm_are |
| } |
| |
| page_offset = ((address - vma->vm_start) >> PAGE_SHIFT) + |
| - drm_vma_node_start(&bo->vma_node) - vma->vm_pgoff; |
| - page_last = vma_pages(vma) + |
| - drm_vma_node_start(&bo->vma_node) - vma->vm_pgoff; |
| + vma->vm_pgoff - drm_vma_node_start(&bo->vma_node); |
| + page_last = vma_pages(vma) + vma->vm_pgoff - |
| + drm_vma_node_start(&bo->vma_node); |
| |
| if (unlikely(page_offset >= bo->num_pages)) { |
| retval = VM_FAULT_SIGBUS; |