diff options
Diffstat (limited to 'drivers/gpu/drm/ttm/ttm_bo_vm.c')
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo_vm.c | 15 | 
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c index ca7744b852f5..4212b8c91dd4 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c @@ -218,14 +218,21 @@ vm_fault_t ttm_bo_vm_fault_reserved(struct vm_fault *vmf,  	prot = ttm_io_prot(bo, bo->resource, prot);  	if (!bo->resource->bus.is_iomem) {  		struct ttm_operation_ctx ctx = { -			.interruptible = false, +			.interruptible = true,  			.no_wait_gpu = false,  			.force_alloc = true  		};  		ttm = bo->ttm; -		if (ttm_tt_populate(bdev, bo->ttm, &ctx)) -			return VM_FAULT_OOM; +		err = ttm_tt_populate(bdev, bo->ttm, &ctx); +		if (err) { +			if (err == -EINTR || err == -ERESTARTSYS || +			    err == -EAGAIN) +				return VM_FAULT_NOPAGE; + +			pr_debug("TTM fault hit %pe.\n", ERR_PTR(err)); +			return VM_FAULT_SIGBUS; +		}  	} else {  		/* Iomem should not be marked encrypted */  		prot = pgprot_decrypted(prot); @@ -254,7 +261,7 @@ vm_fault_t ttm_bo_vm_fault_reserved(struct vm_fault *vmf,  		 * encryption bits. This is because the exact location of the  		 * data may not be known at mmap() time and may also change  		 * at arbitrary times while the data is mmap'ed. -		 * See vmf_insert_mixed_prot() for a discussion. +		 * See vmf_insert_pfn_prot() for a discussion.  		 */  		ret = vmf_insert_pfn_prot(vma, address, pfn, prot);  |