|
@@ -118,7 +118,6 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
|
|
int ret;
|
|
int ret;
|
|
int i;
|
|
int i;
|
|
unsigned long address = vmf->address;
|
|
unsigned long address = vmf->address;
|
|
- int retval = VM_FAULT_NOPAGE;
|
|
|
|
struct ttm_mem_type_manager *man =
|
|
struct ttm_mem_type_manager *man =
|
|
&bdev->man[bo->mem.mem_type];
|
|
&bdev->man[bo->mem.mem_type];
|
|
struct vm_area_struct cvma;
|
|
struct vm_area_struct cvma;
|
|
@@ -158,7 +157,7 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
|
|
* (if at all) by redirecting mmap to the exporter.
|
|
* (if at all) by redirecting mmap to the exporter.
|
|
*/
|
|
*/
|
|
if (bo->ttm && (bo->ttm->page_flags & TTM_PAGE_FLAG_SG)) {
|
|
if (bo->ttm && (bo->ttm->page_flags & TTM_PAGE_FLAG_SG)) {
|
|
- retval = VM_FAULT_SIGBUS;
|
|
|
|
|
|
+ ret = VM_FAULT_SIGBUS;
|
|
goto out_unlock;
|
|
goto out_unlock;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -169,10 +168,10 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
|
|
break;
|
|
break;
|
|
case -EBUSY:
|
|
case -EBUSY:
|
|
case -ERESTARTSYS:
|
|
case -ERESTARTSYS:
|
|
- retval = VM_FAULT_NOPAGE;
|
|
|
|
|
|
+ ret = VM_FAULT_NOPAGE;
|
|
goto out_unlock;
|
|
goto out_unlock;
|
|
default:
|
|
default:
|
|
- retval = VM_FAULT_SIGBUS;
|
|
|
|
|
|
+ ret = VM_FAULT_SIGBUS;
|
|
goto out_unlock;
|
|
goto out_unlock;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -183,12 +182,10 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
|
|
*/
|
|
*/
|
|
ret = ttm_bo_vm_fault_idle(bo, vmf);
|
|
ret = ttm_bo_vm_fault_idle(bo, vmf);
|
|
if (unlikely(ret != 0)) {
|
|
if (unlikely(ret != 0)) {
|
|
- retval = ret;
|
|
|
|
-
|
|
|
|
- if (retval == VM_FAULT_RETRY &&
|
|
|
|
|
|
+ if (ret == VM_FAULT_RETRY &&
|
|
!(vmf->flags & FAULT_FLAG_RETRY_NOWAIT)) {
|
|
!(vmf->flags & FAULT_FLAG_RETRY_NOWAIT)) {
|
|
/* The BO has already been unreserved. */
|
|
/* The BO has already been unreserved. */
|
|
- return retval;
|
|
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
goto out_unlock;
|
|
goto out_unlock;
|
|
@@ -196,12 +193,12 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
|
|
|
|
|
|
ret = ttm_mem_io_lock(man, true);
|
|
ret = ttm_mem_io_lock(man, true);
|
|
if (unlikely(ret != 0)) {
|
|
if (unlikely(ret != 0)) {
|
|
- retval = VM_FAULT_NOPAGE;
|
|
|
|
|
|
+ ret = VM_FAULT_NOPAGE;
|
|
goto out_unlock;
|
|
goto out_unlock;
|
|
}
|
|
}
|
|
ret = ttm_mem_io_reserve_vm(bo);
|
|
ret = ttm_mem_io_reserve_vm(bo);
|
|
if (unlikely(ret != 0)) {
|
|
if (unlikely(ret != 0)) {
|
|
- retval = VM_FAULT_SIGBUS;
|
|
|
|
|
|
+ ret = VM_FAULT_SIGBUS;
|
|
goto out_io_unlock;
|
|
goto out_io_unlock;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -211,7 +208,7 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
|
|
drm_vma_node_start(&bo->vma_node);
|
|
drm_vma_node_start(&bo->vma_node);
|
|
|
|
|
|
if (unlikely(page_offset >= bo->num_pages)) {
|
|
if (unlikely(page_offset >= bo->num_pages)) {
|
|
- retval = VM_FAULT_SIGBUS;
|
|
|
|
|
|
+ ret = VM_FAULT_SIGBUS;
|
|
goto out_io_unlock;
|
|
goto out_io_unlock;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -238,7 +235,7 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
|
|
|
|
|
|
/* Allocate all page at once, most common usage */
|
|
/* Allocate all page at once, most common usage */
|
|
if (ttm->bdev->driver->ttm_tt_populate(ttm, &ctx)) {
|
|
if (ttm->bdev->driver->ttm_tt_populate(ttm, &ctx)) {
|
|
- retval = VM_FAULT_OOM;
|
|
|
|
|
|
+ ret = VM_FAULT_OOM;
|
|
goto out_io_unlock;
|
|
goto out_io_unlock;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -255,7 +252,7 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
|
|
} else {
|
|
} else {
|
|
page = ttm->pages[page_offset];
|
|
page = ttm->pages[page_offset];
|
|
if (unlikely(!page && i == 0)) {
|
|
if (unlikely(!page && i == 0)) {
|
|
- retval = VM_FAULT_OOM;
|
|
|
|
|
|
+ ret = VM_FAULT_OOM;
|
|
goto out_io_unlock;
|
|
goto out_io_unlock;
|
|
} else if (unlikely(!page)) {
|
|
} else if (unlikely(!page)) {
|
|
break;
|
|
break;
|
|
@@ -280,7 +277,7 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
|
|
if (unlikely((ret == -EBUSY) || (ret != 0 && i > 0)))
|
|
if (unlikely((ret == -EBUSY) || (ret != 0 && i > 0)))
|
|
break;
|
|
break;
|
|
else if (unlikely(ret != 0)) {
|
|
else if (unlikely(ret != 0)) {
|
|
- retval =
|
|
|
|
|
|
+ ret =
|
|
(ret == -ENOMEM) ? VM_FAULT_OOM : VM_FAULT_SIGBUS;
|
|
(ret == -ENOMEM) ? VM_FAULT_OOM : VM_FAULT_SIGBUS;
|
|
goto out_io_unlock;
|
|
goto out_io_unlock;
|
|
}
|
|
}
|
|
@@ -289,11 +286,12 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
|
|
if (unlikely(++page_offset >= page_last))
|
|
if (unlikely(++page_offset >= page_last))
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ ret = VM_FAULT_NOPAGE;
|
|
out_io_unlock:
|
|
out_io_unlock:
|
|
ttm_mem_io_unlock(man);
|
|
ttm_mem_io_unlock(man);
|
|
out_unlock:
|
|
out_unlock:
|
|
ttm_bo_unreserve(bo);
|
|
ttm_bo_unreserve(bo);
|
|
- return retval;
|
|
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
static void ttm_bo_vm_open(struct vm_area_struct *vma)
|
|
static void ttm_bo_vm_open(struct vm_area_struct *vma)
|