diff mbox

[4/7] drm/ttm: use an operation ctx for ttm_tt_populate in ttm_bo_driver

Message ID 1513766101-15993-4-git-send-email-Hongbo.He@amd.com (mailing list archive)
State New, archived
Headers show

Commit Message

He, Hongbo Dec. 20, 2017, 10:34 a.m. UTC
Change-Id: I803ea52d11e5c06add0dffab836c3aecc00b56dd
Signed-off-by: Roger He <Hongbo.He@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c  |  7 ++++---
 drivers/gpu/drm/ast/ast_ttm.c            |  5 +++--
 drivers/gpu/drm/cirrus/cirrus_ttm.c      |  5 +++--
 drivers/gpu/drm/nouveau/nouveau_bo.c     |  8 ++++----
 drivers/gpu/drm/qxl/qxl_ttm.c            |  5 +++--
 drivers/gpu/drm/radeon/radeon_ttm.c      |  9 +++++----
 drivers/gpu/drm/ttm/ttm_agp_backend.c    |  4 ++--
 drivers/gpu/drm/ttm/ttm_bo_util.c        | 11 ++++++++---
 drivers/gpu/drm/ttm/ttm_bo_vm.c          |  7 ++++++-
 drivers/gpu/drm/ttm/ttm_page_alloc.c     | 13 +++++--------
 drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 11 ++++-------
 drivers/gpu/drm/ttm/ttm_tt.c             |  6 +++++-
 drivers/gpu/drm/virtio/virtgpu_object.c  |  6 +++++-
 drivers/gpu/drm/virtio/virtgpu_ttm.c     |  5 +++--
 drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c   | 13 +++++--------
 drivers/gpu/drm/vmwgfx/vmwgfx_mob.c      | 13 +++++++++++--
 include/drm/ttm/ttm_bo_driver.h          |  5 +++--
 include/drm/ttm/ttm_page_alloc.h         | 11 +++++++----
 18 files changed, 86 insertions(+), 58 deletions(-)

Comments

Christian König Dec. 20, 2017, 2:20 p.m. UTC | #1
Am 20.12.2017 um 11:34 schrieb Roger He:
> Change-Id: I803ea52d11e5c06add0dffab836c3aecc00b56dd
> Signed-off-by: Roger He <Hongbo.He@amd.com>

Commit message! And please double check the coding style of 
ast_ttm_tt_populate.

With that fixed that patch is Reviewed-by: Christian König 
<christian.koenig@amd.com>.

Regards,
Christian.

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c  |  7 ++++---
>   drivers/gpu/drm/ast/ast_ttm.c            |  5 +++--
>   drivers/gpu/drm/cirrus/cirrus_ttm.c      |  5 +++--
>   drivers/gpu/drm/nouveau/nouveau_bo.c     |  8 ++++----
>   drivers/gpu/drm/qxl/qxl_ttm.c            |  5 +++--
>   drivers/gpu/drm/radeon/radeon_ttm.c      |  9 +++++----
>   drivers/gpu/drm/ttm/ttm_agp_backend.c    |  4 ++--
>   drivers/gpu/drm/ttm/ttm_bo_util.c        | 11 ++++++++---
>   drivers/gpu/drm/ttm/ttm_bo_vm.c          |  7 ++++++-
>   drivers/gpu/drm/ttm/ttm_page_alloc.c     | 13 +++++--------
>   drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 11 ++++-------
>   drivers/gpu/drm/ttm/ttm_tt.c             |  6 +++++-
>   drivers/gpu/drm/virtio/virtgpu_object.c  |  6 +++++-
>   drivers/gpu/drm/virtio/virtgpu_ttm.c     |  5 +++--
>   drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c   | 13 +++++--------
>   drivers/gpu/drm/vmwgfx/vmwgfx_mob.c      | 13 +++++++++++--
>   include/drm/ttm/ttm_bo_driver.h          |  5 +++--
>   include/drm/ttm/ttm_page_alloc.h         | 11 +++++++----
>   18 files changed, 86 insertions(+), 58 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index f1b7d98..52aab9d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -990,7 +990,8 @@ static struct ttm_tt *amdgpu_ttm_tt_create(struct ttm_bo_device *bdev,
>   	return &gtt->ttm.ttm;
>   }
>   
> -static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm)
> +static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm,
> +					struct ttm_operation_ctx *ctx)
>   {
>   	struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
>   	struct amdgpu_ttm_tt *gtt = (void *)ttm;
> @@ -1018,11 +1019,11 @@ static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm)
>   
>   #ifdef CONFIG_SWIOTLB
>   	if (swiotlb_nr_tbl()) {
> -		return ttm_dma_populate(&gtt->ttm, adev->dev);
> +		return ttm_dma_populate(&gtt->ttm, adev->dev, ctx);
>   	}
>   #endif
>   
> -	return ttm_populate_and_map_pages(adev->dev, &gtt->ttm);
> +	return ttm_populate_and_map_pages(adev->dev, &gtt->ttm, ctx);
>   }
>   
>   static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm)
> diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c
> index 28da7c2..1413e94 100644
> --- a/drivers/gpu/drm/ast/ast_ttm.c
> +++ b/drivers/gpu/drm/ast/ast_ttm.c
> @@ -216,9 +216,10 @@ static struct ttm_tt *ast_ttm_tt_create(struct ttm_bo_device *bdev,
>   	return tt;
>   }
>   
> -static int ast_ttm_tt_populate(struct ttm_tt *ttm)
> +static int ast_ttm_tt_populate(struct ttm_tt *ttm,
> +			struct ttm_operation_ctx *ctx)
>   {
> -	return ttm_pool_populate(ttm);
> +	return ttm_pool_populate(ttm, ctx);
>   }
>   
>   static void ast_ttm_tt_unpopulate(struct ttm_tt *ttm)
> diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
> index 2a5b54d..95e2d40 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
> +++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
> @@ -216,9 +216,10 @@ static struct ttm_tt *cirrus_ttm_tt_create(struct ttm_bo_device *bdev,
>   	return tt;
>   }
>   
> -static int cirrus_ttm_tt_populate(struct ttm_tt *ttm)
> +static int cirrus_ttm_tt_populate(struct ttm_tt *ttm,
> +				struct ttm_operation_ctx *ctx)
>   {
> -	return ttm_pool_populate(ttm);
> +	return ttm_pool_populate(ttm, ctx);
>   }
>   
>   static void cirrus_ttm_tt_unpopulate(struct ttm_tt *ttm)
> diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
> index 6b6fb20..b141c27 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_bo.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
> @@ -1547,7 +1547,7 @@ nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo)
>   }
>   
>   static int
> -nouveau_ttm_tt_populate(struct ttm_tt *ttm)
> +nouveau_ttm_tt_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)
>   {
>   	struct ttm_dma_tt *ttm_dma = (void *)ttm;
>   	struct nouveau_drm *drm;
> @@ -1572,17 +1572,17 @@ nouveau_ttm_tt_populate(struct ttm_tt *ttm)
>   
>   #if IS_ENABLED(CONFIG_AGP)
>   	if (drm->agp.bridge) {
> -		return ttm_agp_tt_populate(ttm);
> +		return ttm_agp_tt_populate(ttm, ctx);
>   	}
>   #endif
>   
>   #if IS_ENABLED(CONFIG_SWIOTLB) && IS_ENABLED(CONFIG_X86)
>   	if (swiotlb_nr_tbl()) {
> -		return ttm_dma_populate((void *)ttm, dev);
> +		return ttm_dma_populate((void *)ttm, dev, ctx);
>   	}
>   #endif
>   
> -	r = ttm_pool_populate(ttm);
> +	r = ttm_pool_populate(ttm, ctx);
>   	if (r) {
>   		return r;
>   	}
> diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
> index 78ce118..989645c 100644
> --- a/drivers/gpu/drm/qxl/qxl_ttm.c
> +++ b/drivers/gpu/drm/qxl/qxl_ttm.c
> @@ -291,14 +291,15 @@ static struct ttm_backend_func qxl_backend_func = {
>   	.destroy = &qxl_ttm_backend_destroy,
>   };
>   
> -static int qxl_ttm_tt_populate(struct ttm_tt *ttm)
> +static int qxl_ttm_tt_populate(struct ttm_tt *ttm,
> +				struct ttm_operation_ctx *ctx)
>   {
>   	int r;
>   
>   	if (ttm->state != tt_unpopulated)
>   		return 0;
>   
> -	r = ttm_pool_populate(ttm);
> +	r = ttm_pool_populate(ttm, ctx);
>   	if (r)
>   		return r;
>   
> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
> index 557fd79..634fc6f 100644
> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
> @@ -721,7 +721,8 @@ static struct radeon_ttm_tt *radeon_ttm_tt_to_gtt(struct ttm_tt *ttm)
>   	return (struct radeon_ttm_tt *)ttm;
>   }
>   
> -static int radeon_ttm_tt_populate(struct ttm_tt *ttm)
> +static int radeon_ttm_tt_populate(struct ttm_tt *ttm,
> +				struct ttm_operation_ctx *ctx)
>   {
>   	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(ttm);
>   	struct radeon_device *rdev;
> @@ -750,17 +751,17 @@ static int radeon_ttm_tt_populate(struct ttm_tt *ttm)
>   	rdev = radeon_get_rdev(ttm->bdev);
>   #if IS_ENABLED(CONFIG_AGP)
>   	if (rdev->flags & RADEON_IS_AGP) {
> -		return ttm_agp_tt_populate(ttm);
> +		return ttm_agp_tt_populate(ttm, ctx);
>   	}
>   #endif
>   
>   #ifdef CONFIG_SWIOTLB
>   	if (swiotlb_nr_tbl()) {
> -		return ttm_dma_populate(&gtt->ttm, rdev->dev);
> +		return ttm_dma_populate(&gtt->ttm, rdev->dev, ctx);
>   	}
>   #endif
>   
> -	return ttm_populate_and_map_pages(rdev->dev, &gtt->ttm);
> +	return ttm_populate_and_map_pages(rdev->dev, &gtt->ttm, ctx);
>   }
>   
>   static void radeon_ttm_tt_unpopulate(struct ttm_tt *ttm)
> diff --git a/drivers/gpu/drm/ttm/ttm_agp_backend.c b/drivers/gpu/drm/ttm/ttm_agp_backend.c
> index 028ab60..3e795a0 100644
> --- a/drivers/gpu/drm/ttm/ttm_agp_backend.c
> +++ b/drivers/gpu/drm/ttm/ttm_agp_backend.c
> @@ -133,12 +133,12 @@ struct ttm_tt *ttm_agp_tt_create(struct ttm_bo_device *bdev,
>   }
>   EXPORT_SYMBOL(ttm_agp_tt_create);
>   
> -int ttm_agp_tt_populate(struct ttm_tt *ttm)
> +int ttm_agp_tt_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)
>   {
>   	if (ttm->state != tt_unpopulated)
>   		return 0;
>   
> -	return ttm_pool_populate(ttm);
> +	return ttm_pool_populate(ttm, ctx);
>   }
>   EXPORT_SYMBOL(ttm_agp_tt_populate);
>   
> diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
> index 6e353df..b7eb507 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo_util.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
> @@ -376,7 +376,7 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
>   	 * TTM might be null for moves within the same region.
>   	 */
>   	if (ttm && ttm->state == tt_unpopulated) {
> -		ret = ttm->bdev->driver->ttm_tt_populate(ttm);
> +		ret = ttm->bdev->driver->ttm_tt_populate(ttm, ctx);
>   		if (ret)
>   			goto out1;
>   	}
> @@ -545,14 +545,19 @@ static int ttm_bo_kmap_ttm(struct ttm_buffer_object *bo,
>   			   unsigned long num_pages,
>   			   struct ttm_bo_kmap_obj *map)
>   {
> -	struct ttm_mem_reg *mem = &bo->mem; pgprot_t prot;
> +	struct ttm_mem_reg *mem = &bo->mem;
> +	struct ttm_operation_ctx ctx = {
> +		.interruptible = false,
> +		.no_wait_gpu = false
> +	};
>   	struct ttm_tt *ttm = bo->ttm;
> +	pgprot_t prot;
>   	int ret;
>   
>   	BUG_ON(!ttm);
>   
>   	if (ttm->state == tt_unpopulated) {
> -		ret = ttm->bdev->driver->ttm_tt_populate(ttm);
> +		ret = ttm->bdev->driver->ttm_tt_populate(ttm, &ctx);
>   		if (ret)
>   			return ret;
>   	}
> diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
> index c8ebb75..65dfcdd 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
> @@ -215,12 +215,17 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
>   		cvma.vm_page_prot = ttm_io_prot(bo->mem.placement,
>   						cvma.vm_page_prot);
>   	} else {
> +		struct ttm_operation_ctx ctx = {
> +			.interruptible = false,
> +			.no_wait_gpu = false
> +		};
> +
>   		ttm = bo->ttm;
>   		cvma.vm_page_prot = ttm_io_prot(bo->mem.placement,
>   						cvma.vm_page_prot);
>   
>   		/* Allocate all page at once, most common usage */
> -		if (ttm->bdev->driver->ttm_tt_populate(ttm)) {
> +		if (ttm->bdev->driver->ttm_tt_populate(ttm, &ctx)) {
>   			retval = VM_FAULT_OOM;
>   			goto out_io_unlock;
>   		}
> diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
> index 8f93ff3..f1a3d55 100644
> --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
> +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
> @@ -1058,13 +1058,9 @@ void ttm_page_alloc_fini(void)
>   	_manager = NULL;
>   }
>   
> -int ttm_pool_populate(struct ttm_tt *ttm)
> +int ttm_pool_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)
>   {
>   	struct ttm_mem_global *mem_glob = ttm->glob->mem_glob;
> -	struct ttm_operation_ctx ctx = {
> -		.interruptible = false,
> -		.no_wait_gpu = false
> -	};
>   	unsigned i;
>   	int ret;
>   
> @@ -1080,7 +1076,7 @@ int ttm_pool_populate(struct ttm_tt *ttm)
>   
>   	for (i = 0; i < ttm->num_pages; ++i) {
>   		ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i],
> -						PAGE_SIZE, &ctx);
> +						PAGE_SIZE, ctx);
>   		if (unlikely(ret != 0)) {
>   			ttm_pool_unpopulate(ttm);
>   			return -ENOMEM;
> @@ -1117,12 +1113,13 @@ void ttm_pool_unpopulate(struct ttm_tt *ttm)
>   }
>   EXPORT_SYMBOL(ttm_pool_unpopulate);
>   
> -int ttm_populate_and_map_pages(struct device *dev, struct ttm_dma_tt *tt)
> +int ttm_populate_and_map_pages(struct device *dev, struct ttm_dma_tt *tt,
> +					struct ttm_operation_ctx *ctx)
>   {
>   	unsigned i, j;
>   	int r;
>   
> -	r = ttm_pool_populate(&tt->ttm);
> +	r = ttm_pool_populate(&tt->ttm, ctx);
>   	if (r)
>   		return r;
>   
> diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
> index 8aac86a..3ac5391 100644
> --- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
> +++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
> @@ -923,14 +923,11 @@ static gfp_t ttm_dma_pool_gfp_flags(struct ttm_dma_tt *ttm_dma, bool huge)
>    * On success pages list will hold count number of correctly
>    * cached pages. On failure will hold the negative return value (-ENOMEM, etc).
>    */
> -int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev)
> +int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev,
> +			struct ttm_operation_ctx *ctx)
>   {
>   	struct ttm_tt *ttm = &ttm_dma->ttm;
>   	struct ttm_mem_global *mem_glob = ttm->glob->mem_glob;
> -	struct ttm_operation_ctx ctx = {
> -		.interruptible = false,
> -		.no_wait_gpu = false
> -	};
>   	unsigned long num_pages = ttm->num_pages;
>   	struct dma_pool *pool;
>   	enum pool_type type;
> @@ -966,7 +963,7 @@ int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev)
>   			break;
>   
>   		ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i],
> -						pool->size, &ctx);
> +						pool->size, ctx);
>   		if (unlikely(ret != 0)) {
>   			ttm_dma_unpopulate(ttm_dma, dev);
>   			return -ENOMEM;
> @@ -1002,7 +999,7 @@ int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev)
>   		}
>   
>   		ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i],
> -						pool->size, &ctx);
> +						pool->size, ctx);
>   		if (unlikely(ret != 0)) {
>   			ttm_dma_unpopulate(ttm_dma, dev);
>   			return -ENOMEM;
> diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
> index 8ebc8d3..b48d7a0 100644
> --- a/drivers/gpu/drm/ttm/ttm_tt.c
> +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> @@ -263,6 +263,10 @@ void ttm_tt_unbind(struct ttm_tt *ttm)
>   
>   int ttm_tt_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem)
>   {
> +	struct ttm_operation_ctx ctx = {
> +		.interruptible = false,
> +		.no_wait_gpu = false
> +	};
>   	int ret = 0;
>   
>   	if (!ttm)
> @@ -271,7 +275,7 @@ int ttm_tt_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem)
>   	if (ttm->state == tt_bound)
>   		return 0;
>   
> -	ret = ttm->bdev->driver->ttm_tt_populate(ttm);
> +	ret = ttm->bdev->driver->ttm_tt_populate(ttm, &ctx);
>   	if (ret)
>   		return ret;
>   
> diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c
> index 6f66b73..0b90cdb 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_object.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_object.c
> @@ -124,13 +124,17 @@ int virtio_gpu_object_get_sg_table(struct virtio_gpu_device *qdev,
>   	int ret;
>   	struct page **pages = bo->tbo.ttm->pages;
>   	int nr_pages = bo->tbo.num_pages;
> +	struct ttm_operation_ctx ctx = {
> +		.interruptible = false,
> +		.no_wait_gpu = false
> +	};
>   
>   	/* wtf swapping */
>   	if (bo->pages)
>   		return 0;
>   
>   	if (bo->tbo.ttm->state == tt_unpopulated)
> -		bo->tbo.ttm->bdev->driver->ttm_tt_populate(bo->tbo.ttm);
> +		bo->tbo.ttm->bdev->driver->ttm_tt_populate(bo->tbo.ttm, &ctx);
>   	bo->pages = kmalloc(sizeof(struct sg_table), GFP_KERNEL);
>   	if (!bo->pages)
>   		goto out;
> diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c
> index 488c6bd..72eb417 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_ttm.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c
> @@ -324,12 +324,13 @@ static struct ttm_backend_func virtio_gpu_backend_func = {
>   	.destroy = &virtio_gpu_ttm_backend_destroy,
>   };
>   
> -static int virtio_gpu_ttm_tt_populate(struct ttm_tt *ttm)
> +static int virtio_gpu_ttm_tt_populate(struct ttm_tt *ttm,
> +					struct ttm_operation_ctx *ctx)
>   {
>   	if (ttm->state != tt_unpopulated)
>   		return 0;
>   
> -	return ttm_pool_populate(ttm);
> +	return ttm_pool_populate(ttm, ctx);
>   }
>   
>   static void virtio_gpu_ttm_tt_unpopulate(struct ttm_tt *ttm)
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
> index ef97542..90b0d6b 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
> @@ -635,16 +635,12 @@ static void vmw_ttm_destroy(struct ttm_tt *ttm)
>   }
>   
>   
> -static int vmw_ttm_populate(struct ttm_tt *ttm)
> +static int vmw_ttm_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)
>   {
>   	struct vmw_ttm_tt *vmw_tt =
>   		container_of(ttm, struct vmw_ttm_tt, dma_ttm.ttm);
>   	struct vmw_private *dev_priv = vmw_tt->dev_priv;
>   	struct ttm_mem_global *glob = vmw_mem_glob(dev_priv);
> -	struct ttm_operation_ctx ctx = {
> -		.interruptible = true,
> -		.no_wait_gpu = false
> -	};
>   	int ret;
>   
>   	if (ttm->state != tt_unpopulated)
> @@ -653,15 +649,16 @@ static int vmw_ttm_populate(struct ttm_tt *ttm)
>   	if (dev_priv->map_mode == vmw_dma_alloc_coherent) {
>   		size_t size =
>   			ttm_round_pot(ttm->num_pages * sizeof(dma_addr_t));
> -		ret = ttm_mem_global_alloc(glob, size, &ctx);
> +		ret = ttm_mem_global_alloc(glob, size, ctx);
>   		if (unlikely(ret != 0))
>   			return ret;
>   
> -		ret = ttm_dma_populate(&vmw_tt->dma_ttm, dev_priv->dev->dev);
> +		ret = ttm_dma_populate(&vmw_tt->dma_ttm, dev_priv->dev->dev,
> +					ctx);
>   		if (unlikely(ret != 0))
>   			ttm_mem_global_free(glob, size);
>   	} else
> -		ret = ttm_pool_populate(ttm);
> +		ret = ttm_pool_populate(ttm, ctx);
>   
>   	return ret;
>   }
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c b/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c
> index b17f08f..736ca47 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c
> @@ -240,6 +240,10 @@ static int vmw_otable_batch_setup(struct vmw_private *dev_priv,
>   	unsigned long offset;
>   	unsigned long bo_size;
>   	struct vmw_otable *otables = batch->otables;
> +	struct ttm_operation_ctx ctx = {
> +		.interruptible = false,
> +		.no_wait_gpu = false
> +	};
>   	SVGAOTableType i;
>   	int ret;
>   
> @@ -264,7 +268,7 @@ static int vmw_otable_batch_setup(struct vmw_private *dev_priv,
>   
>   	ret = ttm_bo_reserve(batch->otable_bo, false, true, NULL);
>   	BUG_ON(ret != 0);
> -	ret = vmw_bo_driver.ttm_tt_populate(batch->otable_bo->ttm);
> +	ret = vmw_bo_driver.ttm_tt_populate(batch->otable_bo->ttm, &ctx);
>   	if (unlikely(ret != 0))
>   		goto out_unreserve;
>   	ret = vmw_bo_map_dma(batch->otable_bo);
> @@ -430,6 +434,11 @@ static int vmw_mob_pt_populate(struct vmw_private *dev_priv,
>   			       struct vmw_mob *mob)
>   {
>   	int ret;
> +	struct ttm_operation_ctx ctx = {
> +		.interruptible = false,
> +		.no_wait_gpu = false
> +	};
> +
>   	BUG_ON(mob->pt_bo != NULL);
>   
>   	ret = ttm_bo_create(&dev_priv->bdev, mob->num_pages * PAGE_SIZE,
> @@ -442,7 +451,7 @@ static int vmw_mob_pt_populate(struct vmw_private *dev_priv,
>   	ret = ttm_bo_reserve(mob->pt_bo, false, true, NULL);
>   
>   	BUG_ON(ret != 0);
> -	ret = vmw_bo_driver.ttm_tt_populate(mob->pt_bo->ttm);
> +	ret = vmw_bo_driver.ttm_tt_populate(mob->pt_bo->ttm, &ctx);
>   	if (unlikely(ret != 0))
>   		goto out_unreserve;
>   	ret = vmw_bo_map_dma(mob->pt_bo);
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index 934fecf..84860ec 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -352,7 +352,8 @@ struct ttm_bo_driver {
>   	 * Returns:
>   	 * -ENOMEM: Out of memory.
>   	 */
> -	int (*ttm_tt_populate)(struct ttm_tt *ttm);
> +	int (*ttm_tt_populate)(struct ttm_tt *ttm,
> +			struct ttm_operation_ctx *ctx);
>   
>   	/**
>   	 * ttm_tt_unpopulate
> @@ -1077,7 +1078,7 @@ struct ttm_tt *ttm_agp_tt_create(struct ttm_bo_device *bdev,
>   				 struct agp_bridge_data *bridge,
>   				 unsigned long size, uint32_t page_flags,
>   				 struct page *dummy_read_page);
> -int ttm_agp_tt_populate(struct ttm_tt *ttm);
> +int ttm_agp_tt_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx);
>   void ttm_agp_tt_unpopulate(struct ttm_tt *ttm);
>   #endif
>   
> diff --git a/include/drm/ttm/ttm_page_alloc.h b/include/drm/ttm/ttm_page_alloc.h
> index 5938113..f8395dd 100644
> --- a/include/drm/ttm/ttm_page_alloc.h
> +++ b/include/drm/ttm/ttm_page_alloc.h
> @@ -47,7 +47,7 @@ void ttm_page_alloc_fini(void);
>    *
>    * Add backing pages to all of @ttm
>    */
> -int ttm_pool_populate(struct ttm_tt *ttm);
> +int ttm_pool_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx);
>   
>   /**
>    * ttm_pool_unpopulate:
> @@ -61,7 +61,8 @@ void ttm_pool_unpopulate(struct ttm_tt *ttm);
>   /**
>    * Populates and DMA maps pages to fullfil a ttm_dma_populate() request
>    */
> -int ttm_populate_and_map_pages(struct device *dev, struct ttm_dma_tt *tt);
> +int ttm_populate_and_map_pages(struct device *dev, struct ttm_dma_tt *tt,
> +				struct ttm_operation_ctx *ctx);
>   
>   /**
>    * Unpopulates and DMA unmaps pages as part of a
> @@ -89,7 +90,8 @@ void ttm_dma_page_alloc_fini(void);
>    */
>   int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data);
>   
> -int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev);
> +int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev,
> +			struct ttm_operation_ctx *ctx);
>   void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev);
>   
>   #else
> @@ -106,7 +108,8 @@ static inline int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data)
>   	return 0;
>   }
>   static inline int ttm_dma_populate(struct ttm_dma_tt *ttm_dma,
> -				   struct device *dev)
> +				   struct device *dev,
> +				   struct ttm_operation_ctx *ctx)
>   {
>   	return -ENOMEM;
>   }
diff mbox

Patch

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index f1b7d98..52aab9d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -990,7 +990,8 @@  static struct ttm_tt *amdgpu_ttm_tt_create(struct ttm_bo_device *bdev,
 	return &gtt->ttm.ttm;
 }
 
-static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm)
+static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm,
+					struct ttm_operation_ctx *ctx)
 {
 	struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
 	struct amdgpu_ttm_tt *gtt = (void *)ttm;
@@ -1018,11 +1019,11 @@  static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm)
 
 #ifdef CONFIG_SWIOTLB
 	if (swiotlb_nr_tbl()) {
-		return ttm_dma_populate(&gtt->ttm, adev->dev);
+		return ttm_dma_populate(&gtt->ttm, adev->dev, ctx);
 	}
 #endif
 
-	return ttm_populate_and_map_pages(adev->dev, &gtt->ttm);
+	return ttm_populate_and_map_pages(adev->dev, &gtt->ttm, ctx);
 }
 
 static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm)
diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c
index 28da7c2..1413e94 100644
--- a/drivers/gpu/drm/ast/ast_ttm.c
+++ b/drivers/gpu/drm/ast/ast_ttm.c
@@ -216,9 +216,10 @@  static struct ttm_tt *ast_ttm_tt_create(struct ttm_bo_device *bdev,
 	return tt;
 }
 
-static int ast_ttm_tt_populate(struct ttm_tt *ttm)
+static int ast_ttm_tt_populate(struct ttm_tt *ttm,
+			struct ttm_operation_ctx *ctx)
 {
-	return ttm_pool_populate(ttm);
+	return ttm_pool_populate(ttm, ctx);
 }
 
 static void ast_ttm_tt_unpopulate(struct ttm_tt *ttm)
diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
index 2a5b54d..95e2d40 100644
--- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
+++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
@@ -216,9 +216,10 @@  static struct ttm_tt *cirrus_ttm_tt_create(struct ttm_bo_device *bdev,
 	return tt;
 }
 
-static int cirrus_ttm_tt_populate(struct ttm_tt *ttm)
+static int cirrus_ttm_tt_populate(struct ttm_tt *ttm,
+				struct ttm_operation_ctx *ctx)
 {
-	return ttm_pool_populate(ttm);
+	return ttm_pool_populate(ttm, ctx);
 }
 
 static void cirrus_ttm_tt_unpopulate(struct ttm_tt *ttm)
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 6b6fb20..b141c27 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -1547,7 +1547,7 @@  nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo)
 }
 
 static int
-nouveau_ttm_tt_populate(struct ttm_tt *ttm)
+nouveau_ttm_tt_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)
 {
 	struct ttm_dma_tt *ttm_dma = (void *)ttm;
 	struct nouveau_drm *drm;
@@ -1572,17 +1572,17 @@  nouveau_ttm_tt_populate(struct ttm_tt *ttm)
 
 #if IS_ENABLED(CONFIG_AGP)
 	if (drm->agp.bridge) {
-		return ttm_agp_tt_populate(ttm);
+		return ttm_agp_tt_populate(ttm, ctx);
 	}
 #endif
 
 #if IS_ENABLED(CONFIG_SWIOTLB) && IS_ENABLED(CONFIG_X86)
 	if (swiotlb_nr_tbl()) {
-		return ttm_dma_populate((void *)ttm, dev);
+		return ttm_dma_populate((void *)ttm, dev, ctx);
 	}
 #endif
 
-	r = ttm_pool_populate(ttm);
+	r = ttm_pool_populate(ttm, ctx);
 	if (r) {
 		return r;
 	}
diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
index 78ce118..989645c 100644
--- a/drivers/gpu/drm/qxl/qxl_ttm.c
+++ b/drivers/gpu/drm/qxl/qxl_ttm.c
@@ -291,14 +291,15 @@  static struct ttm_backend_func qxl_backend_func = {
 	.destroy = &qxl_ttm_backend_destroy,
 };
 
-static int qxl_ttm_tt_populate(struct ttm_tt *ttm)
+static int qxl_ttm_tt_populate(struct ttm_tt *ttm,
+				struct ttm_operation_ctx *ctx)
 {
 	int r;
 
 	if (ttm->state != tt_unpopulated)
 		return 0;
 
-	r = ttm_pool_populate(ttm);
+	r = ttm_pool_populate(ttm, ctx);
 	if (r)
 		return r;
 
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index 557fd79..634fc6f 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -721,7 +721,8 @@  static struct radeon_ttm_tt *radeon_ttm_tt_to_gtt(struct ttm_tt *ttm)
 	return (struct radeon_ttm_tt *)ttm;
 }
 
-static int radeon_ttm_tt_populate(struct ttm_tt *ttm)
+static int radeon_ttm_tt_populate(struct ttm_tt *ttm,
+				struct ttm_operation_ctx *ctx)
 {
 	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(ttm);
 	struct radeon_device *rdev;
@@ -750,17 +751,17 @@  static int radeon_ttm_tt_populate(struct ttm_tt *ttm)
 	rdev = radeon_get_rdev(ttm->bdev);
 #if IS_ENABLED(CONFIG_AGP)
 	if (rdev->flags & RADEON_IS_AGP) {
-		return ttm_agp_tt_populate(ttm);
+		return ttm_agp_tt_populate(ttm, ctx);
 	}
 #endif
 
 #ifdef CONFIG_SWIOTLB
 	if (swiotlb_nr_tbl()) {
-		return ttm_dma_populate(&gtt->ttm, rdev->dev);
+		return ttm_dma_populate(&gtt->ttm, rdev->dev, ctx);
 	}
 #endif
 
-	return ttm_populate_and_map_pages(rdev->dev, &gtt->ttm);
+	return ttm_populate_and_map_pages(rdev->dev, &gtt->ttm, ctx);
 }
 
 static void radeon_ttm_tt_unpopulate(struct ttm_tt *ttm)
diff --git a/drivers/gpu/drm/ttm/ttm_agp_backend.c b/drivers/gpu/drm/ttm/ttm_agp_backend.c
index 028ab60..3e795a0 100644
--- a/drivers/gpu/drm/ttm/ttm_agp_backend.c
+++ b/drivers/gpu/drm/ttm/ttm_agp_backend.c
@@ -133,12 +133,12 @@  struct ttm_tt *ttm_agp_tt_create(struct ttm_bo_device *bdev,
 }
 EXPORT_SYMBOL(ttm_agp_tt_create);
 
-int ttm_agp_tt_populate(struct ttm_tt *ttm)
+int ttm_agp_tt_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)
 {
 	if (ttm->state != tt_unpopulated)
 		return 0;
 
-	return ttm_pool_populate(ttm);
+	return ttm_pool_populate(ttm, ctx);
 }
 EXPORT_SYMBOL(ttm_agp_tt_populate);
 
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
index 6e353df..b7eb507 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -376,7 +376,7 @@  int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
 	 * TTM might be null for moves within the same region.
 	 */
 	if (ttm && ttm->state == tt_unpopulated) {
-		ret = ttm->bdev->driver->ttm_tt_populate(ttm);
+		ret = ttm->bdev->driver->ttm_tt_populate(ttm, ctx);
 		if (ret)
 			goto out1;
 	}
@@ -545,14 +545,19 @@  static int ttm_bo_kmap_ttm(struct ttm_buffer_object *bo,
 			   unsigned long num_pages,
 			   struct ttm_bo_kmap_obj *map)
 {
-	struct ttm_mem_reg *mem = &bo->mem; pgprot_t prot;
+	struct ttm_mem_reg *mem = &bo->mem;
+	struct ttm_operation_ctx ctx = {
+		.interruptible = false,
+		.no_wait_gpu = false
+	};
 	struct ttm_tt *ttm = bo->ttm;
+	pgprot_t prot;
 	int ret;
 
 	BUG_ON(!ttm);
 
 	if (ttm->state == tt_unpopulated) {
-		ret = ttm->bdev->driver->ttm_tt_populate(ttm);
+		ret = ttm->bdev->driver->ttm_tt_populate(ttm, &ctx);
 		if (ret)
 			return ret;
 	}
diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
index c8ebb75..65dfcdd 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
@@ -215,12 +215,17 @@  static int ttm_bo_vm_fault(struct vm_fault *vmf)
 		cvma.vm_page_prot = ttm_io_prot(bo->mem.placement,
 						cvma.vm_page_prot);
 	} else {
+		struct ttm_operation_ctx ctx = {
+			.interruptible = false,
+			.no_wait_gpu = false
+		};
+
 		ttm = bo->ttm;
 		cvma.vm_page_prot = ttm_io_prot(bo->mem.placement,
 						cvma.vm_page_prot);
 
 		/* Allocate all page at once, most common usage */
-		if (ttm->bdev->driver->ttm_tt_populate(ttm)) {
+		if (ttm->bdev->driver->ttm_tt_populate(ttm, &ctx)) {
 			retval = VM_FAULT_OOM;
 			goto out_io_unlock;
 		}
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index 8f93ff3..f1a3d55 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -1058,13 +1058,9 @@  void ttm_page_alloc_fini(void)
 	_manager = NULL;
 }
 
-int ttm_pool_populate(struct ttm_tt *ttm)
+int ttm_pool_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)
 {
 	struct ttm_mem_global *mem_glob = ttm->glob->mem_glob;
-	struct ttm_operation_ctx ctx = {
-		.interruptible = false,
-		.no_wait_gpu = false
-	};
 	unsigned i;
 	int ret;
 
@@ -1080,7 +1076,7 @@  int ttm_pool_populate(struct ttm_tt *ttm)
 
 	for (i = 0; i < ttm->num_pages; ++i) {
 		ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i],
-						PAGE_SIZE, &ctx);
+						PAGE_SIZE, ctx);
 		if (unlikely(ret != 0)) {
 			ttm_pool_unpopulate(ttm);
 			return -ENOMEM;
@@ -1117,12 +1113,13 @@  void ttm_pool_unpopulate(struct ttm_tt *ttm)
 }
 EXPORT_SYMBOL(ttm_pool_unpopulate);
 
-int ttm_populate_and_map_pages(struct device *dev, struct ttm_dma_tt *tt)
+int ttm_populate_and_map_pages(struct device *dev, struct ttm_dma_tt *tt,
+					struct ttm_operation_ctx *ctx)
 {
 	unsigned i, j;
 	int r;
 
-	r = ttm_pool_populate(&tt->ttm);
+	r = ttm_pool_populate(&tt->ttm, ctx);
 	if (r)
 		return r;
 
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
index 8aac86a..3ac5391 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
@@ -923,14 +923,11 @@  static gfp_t ttm_dma_pool_gfp_flags(struct ttm_dma_tt *ttm_dma, bool huge)
  * On success pages list will hold count number of correctly
  * cached pages. On failure will hold the negative return value (-ENOMEM, etc).
  */
-int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev)
+int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev,
+			struct ttm_operation_ctx *ctx)
 {
 	struct ttm_tt *ttm = &ttm_dma->ttm;
 	struct ttm_mem_global *mem_glob = ttm->glob->mem_glob;
-	struct ttm_operation_ctx ctx = {
-		.interruptible = false,
-		.no_wait_gpu = false
-	};
 	unsigned long num_pages = ttm->num_pages;
 	struct dma_pool *pool;
 	enum pool_type type;
@@ -966,7 +963,7 @@  int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev)
 			break;
 
 		ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i],
-						pool->size, &ctx);
+						pool->size, ctx);
 		if (unlikely(ret != 0)) {
 			ttm_dma_unpopulate(ttm_dma, dev);
 			return -ENOMEM;
@@ -1002,7 +999,7 @@  int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev)
 		}
 
 		ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i],
-						pool->size, &ctx);
+						pool->size, ctx);
 		if (unlikely(ret != 0)) {
 			ttm_dma_unpopulate(ttm_dma, dev);
 			return -ENOMEM;
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
index 8ebc8d3..b48d7a0 100644
--- a/drivers/gpu/drm/ttm/ttm_tt.c
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
@@ -263,6 +263,10 @@  void ttm_tt_unbind(struct ttm_tt *ttm)
 
 int ttm_tt_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem)
 {
+	struct ttm_operation_ctx ctx = {
+		.interruptible = false,
+		.no_wait_gpu = false
+	};
 	int ret = 0;
 
 	if (!ttm)
@@ -271,7 +275,7 @@  int ttm_tt_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem)
 	if (ttm->state == tt_bound)
 		return 0;
 
-	ret = ttm->bdev->driver->ttm_tt_populate(ttm);
+	ret = ttm->bdev->driver->ttm_tt_populate(ttm, &ctx);
 	if (ret)
 		return ret;
 
diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c
index 6f66b73..0b90cdb 100644
--- a/drivers/gpu/drm/virtio/virtgpu_object.c
+++ b/drivers/gpu/drm/virtio/virtgpu_object.c
@@ -124,13 +124,17 @@  int virtio_gpu_object_get_sg_table(struct virtio_gpu_device *qdev,
 	int ret;
 	struct page **pages = bo->tbo.ttm->pages;
 	int nr_pages = bo->tbo.num_pages;
+	struct ttm_operation_ctx ctx = {
+		.interruptible = false,
+		.no_wait_gpu = false
+	};
 
 	/* wtf swapping */
 	if (bo->pages)
 		return 0;
 
 	if (bo->tbo.ttm->state == tt_unpopulated)
-		bo->tbo.ttm->bdev->driver->ttm_tt_populate(bo->tbo.ttm);
+		bo->tbo.ttm->bdev->driver->ttm_tt_populate(bo->tbo.ttm, &ctx);
 	bo->pages = kmalloc(sizeof(struct sg_table), GFP_KERNEL);
 	if (!bo->pages)
 		goto out;
diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c
index 488c6bd..72eb417 100644
--- a/drivers/gpu/drm/virtio/virtgpu_ttm.c
+++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c
@@ -324,12 +324,13 @@  static struct ttm_backend_func virtio_gpu_backend_func = {
 	.destroy = &virtio_gpu_ttm_backend_destroy,
 };
 
-static int virtio_gpu_ttm_tt_populate(struct ttm_tt *ttm)
+static int virtio_gpu_ttm_tt_populate(struct ttm_tt *ttm,
+					struct ttm_operation_ctx *ctx)
 {
 	if (ttm->state != tt_unpopulated)
 		return 0;
 
-	return ttm_pool_populate(ttm);
+	return ttm_pool_populate(ttm, ctx);
 }
 
 static void virtio_gpu_ttm_tt_unpopulate(struct ttm_tt *ttm)
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
index ef97542..90b0d6b 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
@@ -635,16 +635,12 @@  static void vmw_ttm_destroy(struct ttm_tt *ttm)
 }
 
 
-static int vmw_ttm_populate(struct ttm_tt *ttm)
+static int vmw_ttm_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)
 {
 	struct vmw_ttm_tt *vmw_tt =
 		container_of(ttm, struct vmw_ttm_tt, dma_ttm.ttm);
 	struct vmw_private *dev_priv = vmw_tt->dev_priv;
 	struct ttm_mem_global *glob = vmw_mem_glob(dev_priv);
-	struct ttm_operation_ctx ctx = {
-		.interruptible = true,
-		.no_wait_gpu = false
-	};
 	int ret;
 
 	if (ttm->state != tt_unpopulated)
@@ -653,15 +649,16 @@  static int vmw_ttm_populate(struct ttm_tt *ttm)
 	if (dev_priv->map_mode == vmw_dma_alloc_coherent) {
 		size_t size =
 			ttm_round_pot(ttm->num_pages * sizeof(dma_addr_t));
-		ret = ttm_mem_global_alloc(glob, size, &ctx);
+		ret = ttm_mem_global_alloc(glob, size, ctx);
 		if (unlikely(ret != 0))
 			return ret;
 
-		ret = ttm_dma_populate(&vmw_tt->dma_ttm, dev_priv->dev->dev);
+		ret = ttm_dma_populate(&vmw_tt->dma_ttm, dev_priv->dev->dev,
+					ctx);
 		if (unlikely(ret != 0))
 			ttm_mem_global_free(glob, size);
 	} else
-		ret = ttm_pool_populate(ttm);
+		ret = ttm_pool_populate(ttm, ctx);
 
 	return ret;
 }
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c b/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c
index b17f08f..736ca47 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c
@@ -240,6 +240,10 @@  static int vmw_otable_batch_setup(struct vmw_private *dev_priv,
 	unsigned long offset;
 	unsigned long bo_size;
 	struct vmw_otable *otables = batch->otables;
+	struct ttm_operation_ctx ctx = {
+		.interruptible = false,
+		.no_wait_gpu = false
+	};
 	SVGAOTableType i;
 	int ret;
 
@@ -264,7 +268,7 @@  static int vmw_otable_batch_setup(struct vmw_private *dev_priv,
 
 	ret = ttm_bo_reserve(batch->otable_bo, false, true, NULL);
 	BUG_ON(ret != 0);
-	ret = vmw_bo_driver.ttm_tt_populate(batch->otable_bo->ttm);
+	ret = vmw_bo_driver.ttm_tt_populate(batch->otable_bo->ttm, &ctx);
 	if (unlikely(ret != 0))
 		goto out_unreserve;
 	ret = vmw_bo_map_dma(batch->otable_bo);
@@ -430,6 +434,11 @@  static int vmw_mob_pt_populate(struct vmw_private *dev_priv,
 			       struct vmw_mob *mob)
 {
 	int ret;
+	struct ttm_operation_ctx ctx = {
+		.interruptible = false,
+		.no_wait_gpu = false
+	};
+
 	BUG_ON(mob->pt_bo != NULL);
 
 	ret = ttm_bo_create(&dev_priv->bdev, mob->num_pages * PAGE_SIZE,
@@ -442,7 +451,7 @@  static int vmw_mob_pt_populate(struct vmw_private *dev_priv,
 	ret = ttm_bo_reserve(mob->pt_bo, false, true, NULL);
 
 	BUG_ON(ret != 0);
-	ret = vmw_bo_driver.ttm_tt_populate(mob->pt_bo->ttm);
+	ret = vmw_bo_driver.ttm_tt_populate(mob->pt_bo->ttm, &ctx);
 	if (unlikely(ret != 0))
 		goto out_unreserve;
 	ret = vmw_bo_map_dma(mob->pt_bo);
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
index 934fecf..84860ec 100644
--- a/include/drm/ttm/ttm_bo_driver.h
+++ b/include/drm/ttm/ttm_bo_driver.h
@@ -352,7 +352,8 @@  struct ttm_bo_driver {
 	 * Returns:
 	 * -ENOMEM: Out of memory.
 	 */
-	int (*ttm_tt_populate)(struct ttm_tt *ttm);
+	int (*ttm_tt_populate)(struct ttm_tt *ttm,
+			struct ttm_operation_ctx *ctx);
 
 	/**
 	 * ttm_tt_unpopulate
@@ -1077,7 +1078,7 @@  struct ttm_tt *ttm_agp_tt_create(struct ttm_bo_device *bdev,
 				 struct agp_bridge_data *bridge,
 				 unsigned long size, uint32_t page_flags,
 				 struct page *dummy_read_page);
-int ttm_agp_tt_populate(struct ttm_tt *ttm);
+int ttm_agp_tt_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx);
 void ttm_agp_tt_unpopulate(struct ttm_tt *ttm);
 #endif
 
diff --git a/include/drm/ttm/ttm_page_alloc.h b/include/drm/ttm/ttm_page_alloc.h
index 5938113..f8395dd 100644
--- a/include/drm/ttm/ttm_page_alloc.h
+++ b/include/drm/ttm/ttm_page_alloc.h
@@ -47,7 +47,7 @@  void ttm_page_alloc_fini(void);
  *
  * Add backing pages to all of @ttm
  */
-int ttm_pool_populate(struct ttm_tt *ttm);
+int ttm_pool_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx);
 
 /**
  * ttm_pool_unpopulate:
@@ -61,7 +61,8 @@  void ttm_pool_unpopulate(struct ttm_tt *ttm);
 /**
  * Populates and DMA maps pages to fullfil a ttm_dma_populate() request
  */
-int ttm_populate_and_map_pages(struct device *dev, struct ttm_dma_tt *tt);
+int ttm_populate_and_map_pages(struct device *dev, struct ttm_dma_tt *tt,
+				struct ttm_operation_ctx *ctx);
 
 /**
  * Unpopulates and DMA unmaps pages as part of a
@@ -89,7 +90,8 @@  void ttm_dma_page_alloc_fini(void);
  */
 int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data);
 
-int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev);
+int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev,
+			struct ttm_operation_ctx *ctx);
 void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev);
 
 #else
@@ -106,7 +108,8 @@  static inline int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data)
 	return 0;
 }
 static inline int ttm_dma_populate(struct ttm_dma_tt *ttm_dma,
-				   struct device *dev)
+				   struct device *dev,
+				   struct ttm_operation_ctx *ctx)
 {
 	return -ENOMEM;
 }