Module Name: src
Committed By: riastradh
Date: Sun Dec 19 01:47:24 UTC 2021
Modified Files:
src/sys/external/bsd/drm2/ttm: ttm_bo_vm.c
Log Message:
Sync ttm_bo_vm.c.
To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/external/bsd/drm2/ttm/ttm_bo_vm.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/drm2/ttm/ttm_bo_vm.c
diff -u src/sys/external/bsd/drm2/ttm/ttm_bo_vm.c:1.14 src/sys/external/bsd/drm2/ttm/ttm_bo_vm.c:1.15
--- src/sys/external/bsd/drm2/ttm/ttm_bo_vm.c:1.14 Sun Feb 23 15:46:40 2020
+++ src/sys/external/bsd/drm2/ttm/ttm_bo_vm.c Sun Dec 19 01:47:24 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ttm_bo_vm.c,v 1.14 2020/02/23 15:46:40 ad Exp $ */
+/* $NetBSD: ttm_bo_vm.c,v 1.15 2021/12/19 01:47:24 riastradh Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ttm_bo_vm.c,v 1.14 2020/02/23 15:46:40 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ttm_bo_vm.c,v 1.15 2021/12/19 01:47:24 riastradh Exp $");
#include <sys/types.h>
@@ -101,7 +101,7 @@ ttm_bo_uvm_fault(struct uvm_faultinfo *u
}
/* Try to lock the buffer. */
- ret = ttm_bo_reserve(bo, true, true, false, NULL);
+ ret = ttm_bo_reserve(bo, true, true, NULL);
if (ret) {
if (ret != -EBUSY)
goto out0;
@@ -132,7 +132,7 @@ ttm_bo_uvm_fault(struct uvm_faultinfo *u
ret = ttm_bo_uvm_fault_idle(bo, ufi);
if (ret) {
- KASSERT(ret == -ERESTART);
+ KASSERT(ret == -ERESTART || ret == -EFAULT);
/* ttm_bo_uvm_fault_idle calls uvmfault_unlockall for us. */
ttm_bo_unreserve(bo);
/* XXX errno Linux->NetBSD */
@@ -156,13 +156,18 @@ ttm_bo_uvm_fault(struct uvm_faultinfo *u
size = bo->mem.bus.size;
pgprot = ttm_io_prot(bo->mem.placement, vm_prot);
} else {
+ struct ttm_operation_ctx ctx = {
+ .interruptible = false,
+ .no_wait_gpu = false,
+ .flags = TTM_OPT_FLAG_FORCE_ALLOC,
+ };
u.ttm = bo->ttm;
size = (bo->ttm->num_pages << PAGE_SHIFT);
if (ISSET(bo->mem.placement, TTM_PL_FLAG_CACHED))
pgprot = vm_prot;
else
pgprot = ttm_io_prot(bo->mem.placement, vm_prot);
- if ((*u.ttm->bdev->driver->ttm_tt_populate)(u.ttm)) {
+ if (ttm_tt_populate(u.ttm, &ctx)) {
ret = -ENOMEM;
goto out2;
}
@@ -208,16 +213,24 @@ out0: uvmfault_unlockall(ufi, ufi->entry
static int
ttm_bo_uvm_fault_idle(struct ttm_buffer_object *bo, struct uvm_faultinfo *ufi)
{
+ int ret = 0;
- if (__predict_true(!test_bit(TTM_BO_PRIV_FLAG_MOVING,
- &bo->priv_flags)))
- return 0;
- if (ttm_bo_wait(bo, false, false, true) == 0)
- return 0;
-
- uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, NULL);
- (void)ttm_bo_wait(bo, false, true, false);
- return -ERESTART;
+ if (__predict_true(!bo->moving))
+ goto out0;
+
+ if (dma_fence_is_signaled(bo->moving))
+ goto out1;
+
+ if (dma_fence_wait(bo->moving, true) != 0) {
+ ret = -EFAULT;
+ goto out2;
+ }
+
+ ret = -ERESTART;
+out2: uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, NULL);
+out1: dma_fence_put(bo->moving);
+ bo->moving = NULL;
+out0: return ret;
}
int