aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2017-04-12 08:24:39 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-12-06 12:48:01 -0500
commit19be5570107108fba772bc2e3a1eb22ec32fb021 (patch)
tree86b971706ea8fce92b58cac4ea73e8799564a6ef /drivers/gpu/drm
parent750a25037cac56afeb48ab807ce80fa2cd518b8d (diff)
drm/ttm: add operation ctx to ttm_bo_validate v2
Give moving a BO into place an operation context to work with. v2: rebased Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Michel Dänzer <michel.daenzer@amd.com> Reviewed-by: Chunming Zhou <david1.zhou@amd.com> Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de> Tested-by: Michel Dänzer <michel.daenzer@amd.com> Acked-by: Felix Kuehling <Felix.Kuehling@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c14
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c12
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c3
-rw-r--r--drivers/gpu/drm/ast/ast_ttm.c9
-rw-r--r--drivers/gpu/drm/bochs/bochs_mm.c6
-rw-r--r--drivers/gpu/drm/cirrus/cirrus_ttm.c6
-rw-r--r--drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c6
-rw-r--r--drivers/gpu/drm/mgag200/mgag200_ttm.c9
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_bo.c4
-rw-r--r--drivers/gpu/drm/qxl/qxl_ioctl.c4
-rw-r--r--drivers/gpu/drm/qxl/qxl_object.c6
-rw-r--r--drivers/gpu/drm/qxl/qxl_release.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_gem.c3
-rw-r--r--drivers/gpu/drm/radeon/radeon_mn.c3
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.c14
-rw-r--r--drivers/gpu/drm/radeon/radeon_vm.c3
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo.c16
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_ioctl.c11
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c3
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c21
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c9
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_resource.c6
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_shader.c3
26 files changed, 115 insertions, 72 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 743875ad4404..faab662ce680 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -343,6 +343,7 @@ static int amdgpu_cs_bo_validate(struct amdgpu_cs_parser *p,
343 struct amdgpu_bo *bo) 343 struct amdgpu_bo *bo)
344{ 344{
345 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 345 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
346 struct ttm_operation_ctx ctx = { true, false };
346 u64 initial_bytes_moved, bytes_moved; 347 u64 initial_bytes_moved, bytes_moved;
347 uint32_t domain; 348 uint32_t domain;
348 int r; 349 int r;
@@ -374,7 +375,7 @@ static int amdgpu_cs_bo_validate(struct amdgpu_cs_parser *p,
374retry: 375retry:
375 amdgpu_ttm_placement_from_domain(bo, domain); 376 amdgpu_ttm_placement_from_domain(bo, domain);
376 initial_bytes_moved = atomic64_read(&adev->num_bytes_moved); 377 initial_bytes_moved = atomic64_read(&adev->num_bytes_moved);
377 r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false); 378 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
378 bytes_moved = atomic64_read(&adev->num_bytes_moved) - 379 bytes_moved = atomic64_read(&adev->num_bytes_moved) -
379 initial_bytes_moved; 380 initial_bytes_moved;
380 p->bytes_moved += bytes_moved; 381 p->bytes_moved += bytes_moved;
@@ -396,6 +397,7 @@ static bool amdgpu_cs_try_evict(struct amdgpu_cs_parser *p,
396 struct amdgpu_bo *validated) 397 struct amdgpu_bo *validated)
397{ 398{
398 uint32_t domain = validated->allowed_domains; 399 uint32_t domain = validated->allowed_domains;
400 struct ttm_operation_ctx ctx = { true, false };
399 int r; 401 int r;
400 402
401 if (!p->evictable) 403 if (!p->evictable)
@@ -437,7 +439,7 @@ static bool amdgpu_cs_try_evict(struct amdgpu_cs_parser *p,
437 bo->tbo.mem.mem_type == TTM_PL_VRAM && 439 bo->tbo.mem.mem_type == TTM_PL_VRAM &&
438 bo->tbo.mem.start < adev->mc.visible_vram_size >> PAGE_SHIFT; 440 bo->tbo.mem.start < adev->mc.visible_vram_size >> PAGE_SHIFT;
439 initial_bytes_moved = atomic64_read(&adev->num_bytes_moved); 441 initial_bytes_moved = atomic64_read(&adev->num_bytes_moved);
440 r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false); 442 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
441 bytes_moved = atomic64_read(&adev->num_bytes_moved) - 443 bytes_moved = atomic64_read(&adev->num_bytes_moved) -
442 initial_bytes_moved; 444 initial_bytes_moved;
443 p->bytes_moved += bytes_moved; 445 p->bytes_moved += bytes_moved;
@@ -476,6 +478,7 @@ static int amdgpu_cs_validate(void *param, struct amdgpu_bo *bo)
476static int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p, 478static int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p,
477 struct list_head *validated) 479 struct list_head *validated)
478{ 480{
481 struct ttm_operation_ctx ctx = { true, false };
479 struct amdgpu_bo_list_entry *lobj; 482 struct amdgpu_bo_list_entry *lobj;
480 int r; 483 int r;
481 484
@@ -493,8 +496,7 @@ static int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p,
493 lobj->user_pages) { 496 lobj->user_pages) {
494 amdgpu_ttm_placement_from_domain(bo, 497 amdgpu_ttm_placement_from_domain(bo,
495 AMDGPU_GEM_DOMAIN_CPU); 498 AMDGPU_GEM_DOMAIN_CPU);
496 r = ttm_bo_validate(&bo->tbo, &bo->placement, true, 499 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
497 false);
498 if (r) 500 if (r)
499 return r; 501 return r;
500 amdgpu_ttm_tt_set_user_pages(bo->tbo.ttm, 502 amdgpu_ttm_tt_set_user_pages(bo->tbo.ttm,
@@ -1575,6 +1577,7 @@ int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
1575 struct amdgpu_bo_va_mapping **map) 1577 struct amdgpu_bo_va_mapping **map)
1576{ 1578{
1577 struct amdgpu_fpriv *fpriv = parser->filp->driver_priv; 1579 struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
1580 struct ttm_operation_ctx ctx = { false, false };
1578 struct amdgpu_vm *vm = &fpriv->vm; 1581 struct amdgpu_vm *vm = &fpriv->vm;
1579 struct amdgpu_bo_va_mapping *mapping; 1582 struct amdgpu_bo_va_mapping *mapping;
1580 int r; 1583 int r;
@@ -1595,8 +1598,7 @@ int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
1595 if (!((*bo)->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS)) { 1598 if (!((*bo)->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS)) {
1596 (*bo)->flags |= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS; 1599 (*bo)->flags |= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
1597 amdgpu_ttm_placement_from_domain(*bo, (*bo)->allowed_domains); 1600 amdgpu_ttm_placement_from_domain(*bo, (*bo)->allowed_domains);
1598 r = ttm_bo_validate(&(*bo)->tbo, &(*bo)->placement, false, 1601 r = ttm_bo_validate(&(*bo)->tbo, &(*bo)->placement, &ctx);
1599 false);
1600 if (r) 1602 if (r)
1601 return r; 1603 return r;
1602 } 1604 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index 3ad4cf0f22f8..c16579287aee 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -282,6 +282,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
282int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data, 282int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
283 struct drm_file *filp) 283 struct drm_file *filp)
284{ 284{
285 struct ttm_operation_ctx ctx = { true, false };
285 struct amdgpu_device *adev = dev->dev_private; 286 struct amdgpu_device *adev = dev->dev_private;
286 struct drm_amdgpu_gem_userptr *args = data; 287 struct drm_amdgpu_gem_userptr *args = data;
287 struct drm_gem_object *gobj; 288 struct drm_gem_object *gobj;
@@ -335,7 +336,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
335 goto free_pages; 336 goto free_pages;
336 337
337 amdgpu_ttm_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_GTT); 338 amdgpu_ttm_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_GTT);
338 r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false); 339 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
339 amdgpu_bo_unreserve(bo); 340 amdgpu_bo_unreserve(bo);
340 if (r) 341 if (r)
341 goto free_pages; 342 goto free_pages;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index 3233d5988f66..c2419bc6b3df 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -552,6 +552,7 @@ err:
552 552
553int amdgpu_bo_validate(struct amdgpu_bo *bo) 553int amdgpu_bo_validate(struct amdgpu_bo *bo)
554{ 554{
555 struct ttm_operation_ctx ctx = { false, false };
555 uint32_t domain; 556 uint32_t domain;
556 int r; 557 int r;
557 558
@@ -562,7 +563,7 @@ int amdgpu_bo_validate(struct amdgpu_bo *bo)
562 563
563retry: 564retry:
564 amdgpu_ttm_placement_from_domain(bo, domain); 565 amdgpu_ttm_placement_from_domain(bo, domain);
565 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 566 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
566 if (unlikely(r == -ENOMEM) && domain != bo->allowed_domains) { 567 if (unlikely(r == -ENOMEM) && domain != bo->allowed_domains) {
567 domain = bo->allowed_domains; 568 domain = bo->allowed_domains;
568 goto retry; 569 goto retry;
@@ -673,6 +674,7 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
673 u64 *gpu_addr) 674 u64 *gpu_addr)
674{ 675{
675 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 676 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
677 struct ttm_operation_ctx ctx = { false, false };
676 int r, i; 678 int r, i;
677 679
678 if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm)) 680 if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm))
@@ -723,7 +725,7 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
723 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; 725 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
724 } 726 }
725 727
726 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 728 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
727 if (unlikely(r)) { 729 if (unlikely(r)) {
728 dev_err(adev->dev, "%p pin failed\n", bo); 730 dev_err(adev->dev, "%p pin failed\n", bo);
729 goto error; 731 goto error;
@@ -760,6 +762,7 @@ int amdgpu_bo_pin(struct amdgpu_bo *bo, u32 domain, u64 *gpu_addr)
760int amdgpu_bo_unpin(struct amdgpu_bo *bo) 762int amdgpu_bo_unpin(struct amdgpu_bo *bo)
761{ 763{
762 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 764 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
765 struct ttm_operation_ctx ctx = { false, false };
763 int r, i; 766 int r, i;
764 767
765 if (!bo->pin_count) { 768 if (!bo->pin_count) {
@@ -773,7 +776,7 @@ int amdgpu_bo_unpin(struct amdgpu_bo *bo)
773 bo->placements[i].lpfn = 0; 776 bo->placements[i].lpfn = 0;
774 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT; 777 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
775 } 778 }
776 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 779 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
777 if (unlikely(r)) { 780 if (unlikely(r)) {
778 dev_err(adev->dev, "%p validate failed for unpin\n", bo); 781 dev_err(adev->dev, "%p validate failed for unpin\n", bo);
779 goto error; 782 goto error;
@@ -945,6 +948,7 @@ void amdgpu_bo_move_notify(struct ttm_buffer_object *bo,
945int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo) 948int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
946{ 949{
947 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev); 950 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
951 struct ttm_operation_ctx ctx = { false, false };
948 struct amdgpu_bo *abo; 952 struct amdgpu_bo *abo;
949 unsigned long offset, size; 953 unsigned long offset, size;
950 int r; 954 int r;
@@ -978,7 +982,7 @@ int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
978 abo->placement.num_busy_placement = 1; 982 abo->placement.num_busy_placement = 1;
979 abo->placement.busy_placement = &abo->placements[1]; 983 abo->placement.busy_placement = &abo->placements[1];
980 984
981 r = ttm_bo_validate(bo, &abo->placement, false, false); 985 r = ttm_bo_validate(bo, &abo->placement, &ctx);
982 if (unlikely(r != 0)) 986 if (unlikely(r != 0))
983 return r; 987 return r;
984 988
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index be607b2be4e9..2f2a9e17fdb4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -408,6 +408,7 @@ static u64 amdgpu_uvd_get_addr_from_ctx(struct amdgpu_uvd_cs_ctx *ctx)
408 */ 408 */
409static int amdgpu_uvd_cs_pass1(struct amdgpu_uvd_cs_ctx *ctx) 409static int amdgpu_uvd_cs_pass1(struct amdgpu_uvd_cs_ctx *ctx)
410{ 410{
411 struct ttm_operation_ctx tctx = { false, false };
411 struct amdgpu_bo_va_mapping *mapping; 412 struct amdgpu_bo_va_mapping *mapping;
412 struct amdgpu_bo *bo; 413 struct amdgpu_bo *bo;
413 uint32_t cmd; 414 uint32_t cmd;
@@ -430,7 +431,7 @@ static int amdgpu_uvd_cs_pass1(struct amdgpu_uvd_cs_ctx *ctx)
430 } 431 }
431 amdgpu_uvd_force_into_uvd_segment(bo); 432 amdgpu_uvd_force_into_uvd_segment(bo);
432 433
433 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 434 r = ttm_bo_validate(&bo->tbo, &bo->placement, &tctx);
434 } 435 }
435 436
436 return r; 437 return r;
@@ -949,6 +950,7 @@ int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx)
949static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo, 950static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo,
950 bool direct, struct dma_fence **fence) 951 bool direct, struct dma_fence **fence)
951{ 952{
953 struct ttm_operation_ctx ctx = { true, false };
952 struct ttm_validate_buffer tv; 954 struct ttm_validate_buffer tv;
953 struct ww_acquire_ctx ticket; 955 struct ww_acquire_ctx ticket;
954 struct list_head head; 956 struct list_head head;
@@ -975,7 +977,7 @@ static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo,
975 amdgpu_uvd_force_into_uvd_segment(bo); 977 amdgpu_uvd_force_into_uvd_segment(bo);
976 } 978 }
977 979
978 r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false); 980 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
979 if (r) 981 if (r)
980 goto err; 982 goto err;
981 983
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index a91abfb32746..ba6d846b08ff 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -558,6 +558,7 @@ static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p, uint32_t ib_idx,
558 int lo, int hi, unsigned size, int32_t index) 558 int lo, int hi, unsigned size, int32_t index)
559{ 559{
560 int64_t offset = ((uint64_t)size) * ((int64_t)index); 560 int64_t offset = ((uint64_t)size) * ((int64_t)index);
561 struct ttm_operation_ctx ctx = { false, false };
561 struct amdgpu_bo_va_mapping *mapping; 562 struct amdgpu_bo_va_mapping *mapping;
562 unsigned i, fpfn, lpfn; 563 unsigned i, fpfn, lpfn;
563 struct amdgpu_bo *bo; 564 struct amdgpu_bo *bo;
@@ -587,7 +588,7 @@ static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p, uint32_t ib_idx,
587 bo->placements[i].lpfn = bo->placements[i].fpfn ? 588 bo->placements[i].lpfn = bo->placements[i].fpfn ?
588 min(bo->placements[i].fpfn, lpfn) : lpfn; 589 min(bo->placements[i].fpfn, lpfn) : lpfn;
589 } 590 }
590 return ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 591 return ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
591} 592}
592 593
593 594
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index dabaca4da7f2..df218df332b3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -274,6 +274,7 @@ int amdgpu_vcn_dec_ring_test_ring(struct amdgpu_ring *ring)
274static int amdgpu_vcn_dec_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo, 274static int amdgpu_vcn_dec_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo,
275 bool direct, struct dma_fence **fence) 275 bool direct, struct dma_fence **fence)
276{ 276{
277 struct ttm_operation_ctx ctx = { true, false };
277 struct ttm_validate_buffer tv; 278 struct ttm_validate_buffer tv;
278 struct ww_acquire_ctx ticket; 279 struct ww_acquire_ctx ticket;
279 struct list_head head; 280 struct list_head head;
@@ -294,7 +295,7 @@ static int amdgpu_vcn_dec_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *b
294 if (r) 295 if (r)
295 return r; 296 return r;
296 297
297 r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false); 298 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
298 if (r) 299 if (r)
299 goto err; 300 goto err;
300 301
diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c
index 696a15dc2f3f..28da7c2b7ed9 100644
--- a/drivers/gpu/drm/ast/ast_ttm.c
+++ b/drivers/gpu/drm/ast/ast_ttm.c
@@ -354,6 +354,7 @@ static inline u64 ast_bo_gpu_offset(struct ast_bo *bo)
354 354
355int ast_bo_pin(struct ast_bo *bo, u32 pl_flag, u64 *gpu_addr) 355int ast_bo_pin(struct ast_bo *bo, u32 pl_flag, u64 *gpu_addr)
356{ 356{
357 struct ttm_operation_ctx ctx = { false, false };
357 int i, ret; 358 int i, ret;
358 359
359 if (bo->pin_count) { 360 if (bo->pin_count) {
@@ -365,7 +366,7 @@ int ast_bo_pin(struct ast_bo *bo, u32 pl_flag, u64 *gpu_addr)
365 ast_ttm_placement(bo, pl_flag); 366 ast_ttm_placement(bo, pl_flag);
366 for (i = 0; i < bo->placement.num_placement; i++) 367 for (i = 0; i < bo->placement.num_placement; i++)
367 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; 368 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
368 ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false); 369 ret = ttm_bo_validate(&bo->bo, &bo->placement, &ctx);
369 if (ret) 370 if (ret)
370 return ret; 371 return ret;
371 372
@@ -377,6 +378,7 @@ int ast_bo_pin(struct ast_bo *bo, u32 pl_flag, u64 *gpu_addr)
377 378
378int ast_bo_unpin(struct ast_bo *bo) 379int ast_bo_unpin(struct ast_bo *bo)
379{ 380{
381 struct ttm_operation_ctx ctx = { false, false };
380 int i; 382 int i;
381 if (!bo->pin_count) { 383 if (!bo->pin_count) {
382 DRM_ERROR("unpin bad %p\n", bo); 384 DRM_ERROR("unpin bad %p\n", bo);
@@ -388,11 +390,12 @@ int ast_bo_unpin(struct ast_bo *bo)
388 390
389 for (i = 0; i < bo->placement.num_placement ; i++) 391 for (i = 0; i < bo->placement.num_placement ; i++)
390 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT; 392 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
391 return ttm_bo_validate(&bo->bo, &bo->placement, false, false); 393 return ttm_bo_validate(&bo->bo, &bo->placement, &ctx);
392} 394}
393 395
394int ast_bo_push_sysram(struct ast_bo *bo) 396int ast_bo_push_sysram(struct ast_bo *bo)
395{ 397{
398 struct ttm_operation_ctx ctx = { false, false };
396 int i, ret; 399 int i, ret;
397 if (!bo->pin_count) { 400 if (!bo->pin_count) {
398 DRM_ERROR("unpin bad %p\n", bo); 401 DRM_ERROR("unpin bad %p\n", bo);
@@ -409,7 +412,7 @@ int ast_bo_push_sysram(struct ast_bo *bo)
409 for (i = 0; i < bo->placement.num_placement ; i++) 412 for (i = 0; i < bo->placement.num_placement ; i++)
410 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; 413 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
411 414
412 ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false); 415 ret = ttm_bo_validate(&bo->bo, &bo->placement, &ctx);
413 if (ret) { 416 if (ret) {
414 DRM_ERROR("pushing to VRAM failed\n"); 417 DRM_ERROR("pushing to VRAM failed\n");
415 return ret; 418 return ret;
diff --git a/drivers/gpu/drm/bochs/bochs_mm.c b/drivers/gpu/drm/bochs/bochs_mm.c
index c4cadb638460..8250b5e612d2 100644
--- a/drivers/gpu/drm/bochs/bochs_mm.c
+++ b/drivers/gpu/drm/bochs/bochs_mm.c
@@ -283,6 +283,7 @@ static inline u64 bochs_bo_gpu_offset(struct bochs_bo *bo)
283 283
284int bochs_bo_pin(struct bochs_bo *bo, u32 pl_flag, u64 *gpu_addr) 284int bochs_bo_pin(struct bochs_bo *bo, u32 pl_flag, u64 *gpu_addr)
285{ 285{
286 struct ttm_operation_ctx ctx = { false, false };
286 int i, ret; 287 int i, ret;
287 288
288 if (bo->pin_count) { 289 if (bo->pin_count) {
@@ -295,7 +296,7 @@ int bochs_bo_pin(struct bochs_bo *bo, u32 pl_flag, u64 *gpu_addr)
295 bochs_ttm_placement(bo, pl_flag); 296 bochs_ttm_placement(bo, pl_flag);
296 for (i = 0; i < bo->placement.num_placement; i++) 297 for (i = 0; i < bo->placement.num_placement; i++)
297 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; 298 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
298 ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false); 299 ret = ttm_bo_validate(&bo->bo, &bo->placement, &ctx);
299 if (ret) 300 if (ret)
300 return ret; 301 return ret;
301 302
@@ -307,6 +308,7 @@ int bochs_bo_pin(struct bochs_bo *bo, u32 pl_flag, u64 *gpu_addr)
307 308
308int bochs_bo_unpin(struct bochs_bo *bo) 309int bochs_bo_unpin(struct bochs_bo *bo)
309{ 310{
311 struct ttm_operation_ctx ctx = { false, false };
310 int i, ret; 312 int i, ret;
311 313
312 if (!bo->pin_count) { 314 if (!bo->pin_count) {
@@ -320,7 +322,7 @@ int bochs_bo_unpin(struct bochs_bo *bo)
320 322
321 for (i = 0; i < bo->placement.num_placement; i++) 323 for (i = 0; i < bo->placement.num_placement; i++)
322 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT; 324 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
323 ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false); 325 ret = ttm_bo_validate(&bo->bo, &bo->placement, &ctx);
324 if (ret) 326 if (ret)
325 return ret; 327 return ret;
326 328
diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
index 1ff1838c0d44..2a5b54d3a03a 100644
--- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
+++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
@@ -358,6 +358,7 @@ static inline u64 cirrus_bo_gpu_offset(struct cirrus_bo *bo)
358 358
359int cirrus_bo_pin(struct cirrus_bo *bo, u32 pl_flag, u64 *gpu_addr) 359int cirrus_bo_pin(struct cirrus_bo *bo, u32 pl_flag, u64 *gpu_addr)
360{ 360{
361 struct ttm_operation_ctx ctx = { false, false };
361 int i, ret; 362 int i, ret;
362 363
363 if (bo->pin_count) { 364 if (bo->pin_count) {
@@ -369,7 +370,7 @@ int cirrus_bo_pin(struct cirrus_bo *bo, u32 pl_flag, u64 *gpu_addr)
369 cirrus_ttm_placement(bo, pl_flag); 370 cirrus_ttm_placement(bo, pl_flag);
370 for (i = 0; i < bo->placement.num_placement; i++) 371 for (i = 0; i < bo->placement.num_placement; i++)
371 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; 372 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
372 ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false); 373 ret = ttm_bo_validate(&bo->bo, &bo->placement, &ctx);
373 if (ret) 374 if (ret)
374 return ret; 375 return ret;
375 376
@@ -381,6 +382,7 @@ int cirrus_bo_pin(struct cirrus_bo *bo, u32 pl_flag, u64 *gpu_addr)
381 382
382int cirrus_bo_push_sysram(struct cirrus_bo *bo) 383int cirrus_bo_push_sysram(struct cirrus_bo *bo)
383{ 384{
385 struct ttm_operation_ctx ctx = { false, false };
384 int i, ret; 386 int i, ret;
385 if (!bo->pin_count) { 387 if (!bo->pin_count) {
386 DRM_ERROR("unpin bad %p\n", bo); 388 DRM_ERROR("unpin bad %p\n", bo);
@@ -397,7 +399,7 @@ int cirrus_bo_push_sysram(struct cirrus_bo *bo)
397 for (i = 0; i < bo->placement.num_placement ; i++) 399 for (i = 0; i < bo->placement.num_placement ; i++)
398 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; 400 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
399 401
400 ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false); 402 ret = ttm_bo_validate(&bo->bo, &bo->placement, &ctx);
401 if (ret) { 403 if (ret) {
402 DRM_ERROR("pushing to VRAM failed\n"); 404 DRM_ERROR("pushing to VRAM failed\n");
403 return ret; 405 return ret;
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
index 3518167a7dc4..ab4ee5953615 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
@@ -344,6 +344,7 @@ int hibmc_bo_create(struct drm_device *dev, int size, int align,
344 344
345int hibmc_bo_pin(struct hibmc_bo *bo, u32 pl_flag, u64 *gpu_addr) 345int hibmc_bo_pin(struct hibmc_bo *bo, u32 pl_flag, u64 *gpu_addr)
346{ 346{
347 struct ttm_operation_ctx ctx = { false, false };
347 int i, ret; 348 int i, ret;
348 349
349 if (bo->pin_count) { 350 if (bo->pin_count) {
@@ -356,7 +357,7 @@ int hibmc_bo_pin(struct hibmc_bo *bo, u32 pl_flag, u64 *gpu_addr)
356 hibmc_ttm_placement(bo, pl_flag); 357 hibmc_ttm_placement(bo, pl_flag);
357 for (i = 0; i < bo->placement.num_placement; i++) 358 for (i = 0; i < bo->placement.num_placement; i++)
358 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; 359 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
359 ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false); 360 ret = ttm_bo_validate(&bo->bo, &bo->placement, &ctx);
360 if (ret) 361 if (ret)
361 return ret; 362 return ret;
362 363
@@ -368,6 +369,7 @@ int hibmc_bo_pin(struct hibmc_bo *bo, u32 pl_flag, u64 *gpu_addr)
368 369
369int hibmc_bo_unpin(struct hibmc_bo *bo) 370int hibmc_bo_unpin(struct hibmc_bo *bo)
370{ 371{
372 struct ttm_operation_ctx ctx = { false, false };
371 int i, ret; 373 int i, ret;
372 374
373 if (!bo->pin_count) { 375 if (!bo->pin_count) {
@@ -380,7 +382,7 @@ int hibmc_bo_unpin(struct hibmc_bo *bo)
380 382
381 for (i = 0; i < bo->placement.num_placement ; i++) 383 for (i = 0; i < bo->placement.num_placement ; i++)
382 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT; 384 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
383 ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false); 385 ret = ttm_bo_validate(&bo->bo, &bo->placement, &ctx);
384 if (ret) { 386 if (ret) {
385 DRM_ERROR("validate failed for unpin: %d\n", ret); 387 DRM_ERROR("validate failed for unpin: %d\n", ret);
386 return ret; 388 return ret;
diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c
index 3e7e1cd31395..f03da63abc7b 100644
--- a/drivers/gpu/drm/mgag200/mgag200_ttm.c
+++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c
@@ -354,6 +354,7 @@ static inline u64 mgag200_bo_gpu_offset(struct mgag200_bo *bo)
354 354
355int mgag200_bo_pin(struct mgag200_bo *bo, u32 pl_flag, u64 *gpu_addr) 355int mgag200_bo_pin(struct mgag200_bo *bo, u32 pl_flag, u64 *gpu_addr)
356{ 356{
357 struct ttm_operation_ctx ctx = { false, false };
357 int i, ret; 358 int i, ret;
358 359
359 if (bo->pin_count) { 360 if (bo->pin_count) {
@@ -366,7 +367,7 @@ int mgag200_bo_pin(struct mgag200_bo *bo, u32 pl_flag, u64 *gpu_addr)
366 mgag200_ttm_placement(bo, pl_flag); 367 mgag200_ttm_placement(bo, pl_flag);
367 for (i = 0; i < bo->placement.num_placement; i++) 368 for (i = 0; i < bo->placement.num_placement; i++)
368 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; 369 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
369 ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false); 370 ret = ttm_bo_validate(&bo->bo, &bo->placement, &ctx);
370 if (ret) 371 if (ret)
371 return ret; 372 return ret;
372 373
@@ -378,6 +379,7 @@ int mgag200_bo_pin(struct mgag200_bo *bo, u32 pl_flag, u64 *gpu_addr)
378 379
379int mgag200_bo_unpin(struct mgag200_bo *bo) 380int mgag200_bo_unpin(struct mgag200_bo *bo)
380{ 381{
382 struct ttm_operation_ctx ctx = { false, false };
381 int i; 383 int i;
382 if (!bo->pin_count) { 384 if (!bo->pin_count) {
383 DRM_ERROR("unpin bad %p\n", bo); 385 DRM_ERROR("unpin bad %p\n", bo);
@@ -389,11 +391,12 @@ int mgag200_bo_unpin(struct mgag200_bo *bo)
389 391
390 for (i = 0; i < bo->placement.num_placement ; i++) 392 for (i = 0; i < bo->placement.num_placement ; i++)
391 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT; 393 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
392 return ttm_bo_validate(&bo->bo, &bo->placement, false, false); 394 return ttm_bo_validate(&bo->bo, &bo->placement, &ctx);
393} 395}
394 396
395int mgag200_bo_push_sysram(struct mgag200_bo *bo) 397int mgag200_bo_push_sysram(struct mgag200_bo *bo)
396{ 398{
399 struct ttm_operation_ctx ctx = { false, false };
397 int i, ret; 400 int i, ret;
398 if (!bo->pin_count) { 401 if (!bo->pin_count) {
399 DRM_ERROR("unpin bad %p\n", bo); 402 DRM_ERROR("unpin bad %p\n", bo);
@@ -410,7 +413,7 @@ int mgag200_bo_push_sysram(struct mgag200_bo *bo)
410 for (i = 0; i < bo->placement.num_placement ; i++) 413 for (i = 0; i < bo->placement.num_placement ; i++)
411 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; 414 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
412 415
413 ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false); 416 ret = ttm_bo_validate(&bo->bo, &bo->placement, &ctx);
414 if (ret) { 417 if (ret) {
415 DRM_ERROR("pushing to VRAM failed\n"); 418 DRM_ERROR("pushing to VRAM failed\n");
416 return ret; 419 return ret;
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 2615912430cc..1cf3da3d7bea 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -548,10 +548,10 @@ int
548nouveau_bo_validate(struct nouveau_bo *nvbo, bool interruptible, 548nouveau_bo_validate(struct nouveau_bo *nvbo, bool interruptible,
549 bool no_wait_gpu) 549 bool no_wait_gpu)
550{ 550{
551 struct ttm_operation_ctx ctx = { interruptible, no_wait_gpu };
551 int ret; 552 int ret;
552 553
553 ret = ttm_bo_validate(&nvbo->bo, &nvbo->placement, 554 ret = ttm_bo_validate(&nvbo->bo, &nvbo->placement, &ctx);
554 interruptible, no_wait_gpu);
555 if (ret) 555 if (ret)
556 return ret; 556 return ret;
557 557
diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c
index 31effed4a3c8..e8c0b1037230 100644
--- a/drivers/gpu/drm/qxl/qxl_ioctl.c
+++ b/drivers/gpu/drm/qxl/qxl_ioctl.c
@@ -309,6 +309,7 @@ static int qxl_update_area_ioctl(struct drm_device *dev, void *data,
309 int ret; 309 int ret;
310 struct drm_gem_object *gobj = NULL; 310 struct drm_gem_object *gobj = NULL;
311 struct qxl_bo *qobj = NULL; 311 struct qxl_bo *qobj = NULL;
312 struct ttm_operation_ctx ctx = { true, false };
312 313
313 if (update_area->left >= update_area->right || 314 if (update_area->left >= update_area->right ||
314 update_area->top >= update_area->bottom) 315 update_area->top >= update_area->bottom)
@@ -326,8 +327,7 @@ static int qxl_update_area_ioctl(struct drm_device *dev, void *data,
326 327
327 if (!qobj->pin_count) { 328 if (!qobj->pin_count) {
328 qxl_ttm_placement_from_domain(qobj, qobj->type, false); 329 qxl_ttm_placement_from_domain(qobj, qobj->type, false);
329 ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, 330 ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, &ctx);
330 true, false);
331 if (unlikely(ret)) 331 if (unlikely(ret))
332 goto out; 332 goto out;
333 } 333 }
diff --git a/drivers/gpu/drm/qxl/qxl_object.c b/drivers/gpu/drm/qxl/qxl_object.c
index 0a67ddf19c3d..f6b80fe47d1f 100644
--- a/drivers/gpu/drm/qxl/qxl_object.c
+++ b/drivers/gpu/drm/qxl/qxl_object.c
@@ -223,6 +223,7 @@ struct qxl_bo *qxl_bo_ref(struct qxl_bo *bo)
223 223
224static int __qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr) 224static int __qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr)
225{ 225{
226 struct ttm_operation_ctx ctx = { false, false };
226 struct drm_device *ddev = bo->gem_base.dev; 227 struct drm_device *ddev = bo->gem_base.dev;
227 int r; 228 int r;
228 229
@@ -233,7 +234,7 @@ static int __qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr)
233 return 0; 234 return 0;
234 } 235 }
235 qxl_ttm_placement_from_domain(bo, domain, true); 236 qxl_ttm_placement_from_domain(bo, domain, true);
236 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 237 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
237 if (likely(r == 0)) { 238 if (likely(r == 0)) {
238 bo->pin_count = 1; 239 bo->pin_count = 1;
239 if (gpu_addr != NULL) 240 if (gpu_addr != NULL)
@@ -246,6 +247,7 @@ static int __qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr)
246 247
247static int __qxl_bo_unpin(struct qxl_bo *bo) 248static int __qxl_bo_unpin(struct qxl_bo *bo)
248{ 249{
250 struct ttm_operation_ctx ctx = { false, false };
249 struct drm_device *ddev = bo->gem_base.dev; 251 struct drm_device *ddev = bo->gem_base.dev;
250 int r, i; 252 int r, i;
251 253
@@ -258,7 +260,7 @@ static int __qxl_bo_unpin(struct qxl_bo *bo)
258 return 0; 260 return 0;
259 for (i = 0; i < bo->placement.num_placement; i++) 261 for (i = 0; i < bo->placement.num_placement; i++)
260 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT; 262 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
261 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 263 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
262 if (unlikely(r != 0)) 264 if (unlikely(r != 0))
263 dev_err(ddev->dev, "%p validate failed for unpin\n", bo); 265 dev_err(ddev->dev, "%p validate failed for unpin\n", bo);
264 return r; 266 return r;
diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c
index f27777daae63..b223c8d0a491 100644
--- a/drivers/gpu/drm/qxl/qxl_release.c
+++ b/drivers/gpu/drm/qxl/qxl_release.c
@@ -230,12 +230,12 @@ int qxl_release_list_add(struct qxl_release *release, struct qxl_bo *bo)
230 230
231static int qxl_release_validate_bo(struct qxl_bo *bo) 231static int qxl_release_validate_bo(struct qxl_bo *bo)
232{ 232{
233 struct ttm_operation_ctx ctx = { true, false };
233 int ret; 234 int ret;
234 235
235 if (!bo->pin_count) { 236 if (!bo->pin_count) {
236 qxl_ttm_placement_from_domain(bo, bo->type, false); 237 qxl_ttm_placement_from_domain(bo, bo->type, false);
237 ret = ttm_bo_validate(&bo->tbo, &bo->placement, 238 ret = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
238 true, false);
239 if (ret) 239 if (ret)
240 return ret; 240 return ret;
241 } 241 }
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
index cf3deb283da5..a9962ffba720 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -285,6 +285,7 @@ int radeon_gem_create_ioctl(struct drm_device *dev, void *data,
285int radeon_gem_userptr_ioctl(struct drm_device *dev, void *data, 285int radeon_gem_userptr_ioctl(struct drm_device *dev, void *data,
286 struct drm_file *filp) 286 struct drm_file *filp)
287{ 287{
288 struct ttm_operation_ctx ctx = { true, false };
288 struct radeon_device *rdev = dev->dev_private; 289 struct radeon_device *rdev = dev->dev_private;
289 struct drm_radeon_gem_userptr *args = data; 290 struct drm_radeon_gem_userptr *args = data;
290 struct drm_gem_object *gobj; 291 struct drm_gem_object *gobj;
@@ -343,7 +344,7 @@ int radeon_gem_userptr_ioctl(struct drm_device *dev, void *data,
343 } 344 }
344 345
345 radeon_ttm_placement_from_domain(bo, RADEON_GEM_DOMAIN_GTT); 346 radeon_ttm_placement_from_domain(bo, RADEON_GEM_DOMAIN_GTT);
346 r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false); 347 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
347 radeon_bo_unreserve(bo); 348 radeon_bo_unreserve(bo);
348 up_read(&current->mm->mmap_sem); 349 up_read(&current->mm->mmap_sem);
349 if (r) 350 if (r)
diff --git a/drivers/gpu/drm/radeon/radeon_mn.c b/drivers/gpu/drm/radeon/radeon_mn.c
index 1d62288b7ee3..abd24975c9b1 100644
--- a/drivers/gpu/drm/radeon/radeon_mn.c
+++ b/drivers/gpu/drm/radeon/radeon_mn.c
@@ -124,6 +124,7 @@ static void radeon_mn_invalidate_range_start(struct mmu_notifier *mn,
124 unsigned long end) 124 unsigned long end)
125{ 125{
126 struct radeon_mn *rmn = container_of(mn, struct radeon_mn, mn); 126 struct radeon_mn *rmn = container_of(mn, struct radeon_mn, mn);
127 struct ttm_operation_ctx ctx = { false, false };
127 struct interval_tree_node *it; 128 struct interval_tree_node *it;
128 129
129 /* notification is exclusive, but interval is inclusive */ 130 /* notification is exclusive, but interval is inclusive */
@@ -157,7 +158,7 @@ static void radeon_mn_invalidate_range_start(struct mmu_notifier *mn,
157 DRM_ERROR("(%ld) failed to wait for user bo\n", r); 158 DRM_ERROR("(%ld) failed to wait for user bo\n", r);
158 159
159 radeon_ttm_placement_from_domain(bo, RADEON_GEM_DOMAIN_CPU); 160 radeon_ttm_placement_from_domain(bo, RADEON_GEM_DOMAIN_CPU);
160 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 161 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
161 if (r) 162 if (r)
162 DRM_ERROR("(%ld) failed to validate user bo\n", r); 163 DRM_ERROR("(%ld) failed to validate user bo\n", r);
163 164
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 093594976126..15404af9d740 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -329,6 +329,7 @@ void radeon_bo_unref(struct radeon_bo **bo)
329int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset, 329int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
330 u64 *gpu_addr) 330 u64 *gpu_addr)
331{ 331{
332 struct ttm_operation_ctx ctx = { false, false };
332 int r, i; 333 int r, i;
333 334
334 if (radeon_ttm_tt_has_userptr(bo->tbo.ttm)) 335 if (radeon_ttm_tt_has_userptr(bo->tbo.ttm))
@@ -371,7 +372,7 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
371 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; 372 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
372 } 373 }
373 374
374 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 375 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
375 if (likely(r == 0)) { 376 if (likely(r == 0)) {
376 bo->pin_count = 1; 377 bo->pin_count = 1;
377 if (gpu_addr != NULL) 378 if (gpu_addr != NULL)
@@ -393,6 +394,7 @@ int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr)
393 394
394int radeon_bo_unpin(struct radeon_bo *bo) 395int radeon_bo_unpin(struct radeon_bo *bo)
395{ 396{
397 struct ttm_operation_ctx ctx = { false, false };
396 int r, i; 398 int r, i;
397 399
398 if (!bo->pin_count) { 400 if (!bo->pin_count) {
@@ -406,7 +408,7 @@ int radeon_bo_unpin(struct radeon_bo *bo)
406 bo->placements[i].lpfn = 0; 408 bo->placements[i].lpfn = 0;
407 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT; 409 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
408 } 410 }
409 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 411 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
410 if (likely(r == 0)) { 412 if (likely(r == 0)) {
411 if (bo->tbo.mem.mem_type == TTM_PL_VRAM) 413 if (bo->tbo.mem.mem_type == TTM_PL_VRAM)
412 bo->rdev->vram_pin_size -= radeon_bo_size(bo); 414 bo->rdev->vram_pin_size -= radeon_bo_size(bo);
@@ -531,6 +533,7 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
531 struct ww_acquire_ctx *ticket, 533 struct ww_acquire_ctx *ticket,
532 struct list_head *head, int ring) 534 struct list_head *head, int ring)
533{ 535{
536 struct ttm_operation_ctx ctx = { true, false };
534 struct radeon_bo_list *lobj; 537 struct radeon_bo_list *lobj;
535 struct list_head duplicates; 538 struct list_head duplicates;
536 int r; 539 int r;
@@ -572,7 +575,7 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
572 radeon_uvd_force_into_uvd_segment(bo, allowed); 575 radeon_uvd_force_into_uvd_segment(bo, allowed);
573 576
574 initial_bytes_moved = atomic64_read(&rdev->num_bytes_moved); 577 initial_bytes_moved = atomic64_read(&rdev->num_bytes_moved);
575 r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false); 578 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
576 bytes_moved += atomic64_read(&rdev->num_bytes_moved) - 579 bytes_moved += atomic64_read(&rdev->num_bytes_moved) -
577 initial_bytes_moved; 580 initial_bytes_moved;
578 581
@@ -792,6 +795,7 @@ void radeon_bo_move_notify(struct ttm_buffer_object *bo,
792 795
793int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo) 796int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
794{ 797{
798 struct ttm_operation_ctx ctx = { false, false };
795 struct radeon_device *rdev; 799 struct radeon_device *rdev;
796 struct radeon_bo *rbo; 800 struct radeon_bo *rbo;
797 unsigned long offset, size, lpfn; 801 unsigned long offset, size, lpfn;
@@ -823,10 +827,10 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
823 (!rbo->placements[i].lpfn || rbo->placements[i].lpfn > lpfn)) 827 (!rbo->placements[i].lpfn || rbo->placements[i].lpfn > lpfn))
824 rbo->placements[i].lpfn = lpfn; 828 rbo->placements[i].lpfn = lpfn;
825 } 829 }
826 r = ttm_bo_validate(bo, &rbo->placement, false, false); 830 r = ttm_bo_validate(bo, &rbo->placement, &ctx);
827 if (unlikely(r == -ENOMEM)) { 831 if (unlikely(r == -ENOMEM)) {
828 radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT); 832 radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT);
829 return ttm_bo_validate(bo, &rbo->placement, false, false); 833 return ttm_bo_validate(bo, &rbo->placement, &ctx);
830 } else if (unlikely(r != 0)) { 834 } else if (unlikely(r != 0)) {
831 return r; 835 return r;
832 } 836 }
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index e5c0e635e371..7f1a9c787bd1 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -387,6 +387,7 @@ static void radeon_vm_set_pages(struct radeon_device *rdev,
387static int radeon_vm_clear_bo(struct radeon_device *rdev, 387static int radeon_vm_clear_bo(struct radeon_device *rdev,
388 struct radeon_bo *bo) 388 struct radeon_bo *bo)
389{ 389{
390 struct ttm_operation_ctx ctx = { true, false };
390 struct radeon_ib ib; 391 struct radeon_ib ib;
391 unsigned entries; 392 unsigned entries;
392 uint64_t addr; 393 uint64_t addr;
@@ -396,7 +397,7 @@ static int radeon_vm_clear_bo(struct radeon_device *rdev,
396 if (r) 397 if (r)
397 return r; 398 return r;
398 399
399 r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false); 400 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
400 if (r) 401 if (r)
401 goto error_unreserve; 402 goto error_unreserve;
402 403
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 77a0fd22e5ba..5347c3f3e2f4 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -1091,9 +1091,8 @@ bool ttm_bo_mem_compat(struct ttm_placement *placement,
1091EXPORT_SYMBOL(ttm_bo_mem_compat); 1091EXPORT_SYMBOL(ttm_bo_mem_compat);
1092 1092
1093int ttm_bo_validate(struct ttm_buffer_object *bo, 1093int ttm_bo_validate(struct ttm_buffer_object *bo,
1094 struct ttm_placement *placement, 1094 struct ttm_placement *placement,
1095 bool interruptible, 1095 struct ttm_operation_ctx *ctx)
1096 bool no_wait_gpu)
1097{ 1096{
1098 int ret; 1097 int ret;
1099 uint32_t new_flags; 1098 uint32_t new_flags;
@@ -1103,8 +1102,8 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
1103 * Check whether we need to move buffer. 1102 * Check whether we need to move buffer.
1104 */ 1103 */
1105 if (!ttm_bo_mem_compat(placement, &bo->mem, &new_flags)) { 1104 if (!ttm_bo_mem_compat(placement, &bo->mem, &new_flags)) {
1106 ret = ttm_bo_move_buffer(bo, placement, interruptible, 1105 ret = ttm_bo_move_buffer(bo, placement, ctx->interruptible,
1107 no_wait_gpu); 1106 ctx->no_wait_gpu);
1108 if (ret) 1107 if (ret)
1109 return ret; 1108 return ret;
1110 } else { 1109 } else {
@@ -1219,8 +1218,11 @@ int ttm_bo_init_reserved(struct ttm_bo_device *bdev,
1219 WARN_ON(!locked); 1218 WARN_ON(!locked);
1220 } 1219 }
1221 1220
1222 if (likely(!ret)) 1221 if (likely(!ret)) {
1223 ret = ttm_bo_validate(bo, placement, interruptible, false); 1222 struct ttm_operation_ctx ctx = { interruptible, false };
1223
1224 ret = ttm_bo_validate(bo, placement, &ctx);
1225 }
1224 1226
1225 if (unlikely(ret)) { 1227 if (unlikely(ret)) {
1226 if (!resv) 1228 if (!resv)
diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
index 461f81aa1bbe..5720a0d4ac0a 100644
--- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
+++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
@@ -56,6 +56,7 @@ static int virtio_gpu_map_ioctl(struct drm_device *dev, void *data,
56static int virtio_gpu_object_list_validate(struct ww_acquire_ctx *ticket, 56static int virtio_gpu_object_list_validate(struct ww_acquire_ctx *ticket,
57 struct list_head *head) 57 struct list_head *head)
58{ 58{
59 struct ttm_operation_ctx ctx = { false, false };
59 struct ttm_validate_buffer *buf; 60 struct ttm_validate_buffer *buf;
60 struct ttm_buffer_object *bo; 61 struct ttm_buffer_object *bo;
61 struct virtio_gpu_object *qobj; 62 struct virtio_gpu_object *qobj;
@@ -68,7 +69,7 @@ static int virtio_gpu_object_list_validate(struct ww_acquire_ctx *ticket,
68 list_for_each_entry(buf, head, head) { 69 list_for_each_entry(buf, head, head) {
69 bo = buf->bo; 70 bo = buf->bo;
70 qobj = container_of(bo, struct virtio_gpu_object, tbo); 71 qobj = container_of(bo, struct virtio_gpu_object, tbo);
71 ret = ttm_bo_validate(bo, &qobj->placement, false, false); 72 ret = ttm_bo_validate(bo, &qobj->placement, &ctx);
72 if (ret) { 73 if (ret) {
73 ttm_eu_backoff_reservation(ticket, head); 74 ttm_eu_backoff_reservation(ticket, head);
74 return ret; 75 return ret;
@@ -352,6 +353,7 @@ static int virtio_gpu_transfer_from_host_ioctl(struct drm_device *dev,
352 struct virtio_gpu_device *vgdev = dev->dev_private; 353 struct virtio_gpu_device *vgdev = dev->dev_private;
353 struct virtio_gpu_fpriv *vfpriv = file->driver_priv; 354 struct virtio_gpu_fpriv *vfpriv = file->driver_priv;
354 struct drm_virtgpu_3d_transfer_from_host *args = data; 355 struct drm_virtgpu_3d_transfer_from_host *args = data;
356 struct ttm_operation_ctx ctx = { true, false };
355 struct drm_gem_object *gobj = NULL; 357 struct drm_gem_object *gobj = NULL;
356 struct virtio_gpu_object *qobj = NULL; 358 struct virtio_gpu_object *qobj = NULL;
357 struct virtio_gpu_fence *fence; 359 struct virtio_gpu_fence *fence;
@@ -372,8 +374,7 @@ static int virtio_gpu_transfer_from_host_ioctl(struct drm_device *dev,
372 if (ret) 374 if (ret)
373 goto out; 375 goto out;
374 376
375 ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, 377 ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, &ctx);
376 true, false);
377 if (unlikely(ret)) 378 if (unlikely(ret))
378 goto out_unres; 379 goto out_unres;
379 380
@@ -399,6 +400,7 @@ static int virtio_gpu_transfer_to_host_ioctl(struct drm_device *dev, void *data,
399 struct virtio_gpu_device *vgdev = dev->dev_private; 400 struct virtio_gpu_device *vgdev = dev->dev_private;
400 struct virtio_gpu_fpriv *vfpriv = file->driver_priv; 401 struct virtio_gpu_fpriv *vfpriv = file->driver_priv;
401 struct drm_virtgpu_3d_transfer_to_host *args = data; 402 struct drm_virtgpu_3d_transfer_to_host *args = data;
403 struct ttm_operation_ctx ctx = { true, false };
402 struct drm_gem_object *gobj = NULL; 404 struct drm_gem_object *gobj = NULL;
403 struct virtio_gpu_object *qobj = NULL; 405 struct virtio_gpu_object *qobj = NULL;
404 struct virtio_gpu_fence *fence; 406 struct virtio_gpu_fence *fence;
@@ -416,8 +418,7 @@ static int virtio_gpu_transfer_to_host_ioctl(struct drm_device *dev, void *data,
416 if (ret) 418 if (ret)
417 goto out; 419 goto out;
418 420
419 ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, 421 ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, &ctx);
420 true, false);
421 if (unlikely(ret)) 422 if (unlikely(ret))
422 goto out_unres; 423 goto out_unres;
423 424
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
index d87861bbe971..92df0b08c194 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
@@ -387,6 +387,7 @@ static int vmw_cotable_readback(struct vmw_resource *res)
387 */ 387 */
388static int vmw_cotable_resize(struct vmw_resource *res, size_t new_size) 388static int vmw_cotable_resize(struct vmw_resource *res, size_t new_size)
389{ 389{
390 struct ttm_operation_ctx ctx = { false, false };
390 struct vmw_private *dev_priv = res->dev_priv; 391 struct vmw_private *dev_priv = res->dev_priv;
391 struct vmw_cotable *vcotbl = vmw_cotable(res); 392 struct vmw_cotable *vcotbl = vmw_cotable(res);
392 struct vmw_dma_buffer *buf, *old_buf = res->backup; 393 struct vmw_dma_buffer *buf, *old_buf = res->backup;
@@ -455,7 +456,7 @@ static int vmw_cotable_resize(struct vmw_resource *res, size_t new_size)
455 } 456 }
456 457
457 /* Unpin new buffer, and switch backup buffers. */ 458 /* Unpin new buffer, and switch backup buffers. */
458 ret = ttm_bo_validate(bo, &vmw_mob_placement, false, false); 459 ret = ttm_bo_validate(bo, &vmw_mob_placement, &ctx);
459 if (unlikely(ret != 0)) { 460 if (unlikely(ret != 0)) {
460 DRM_ERROR("Failed validating new COTable backup buffer.\n"); 461 DRM_ERROR("Failed validating new COTable backup buffer.\n");
461 goto out_wait; 462 goto out_wait;
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
index 0cd889015dc5..d45d2caffa5a 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
@@ -47,6 +47,7 @@ int vmw_dmabuf_pin_in_placement(struct vmw_private *dev_priv,
47 struct ttm_placement *placement, 47 struct ttm_placement *placement,
48 bool interruptible) 48 bool interruptible)
49{ 49{
50 struct ttm_operation_ctx ctx = {interruptible, false };
50 struct ttm_buffer_object *bo = &buf->base; 51 struct ttm_buffer_object *bo = &buf->base;
51 int ret; 52 int ret;
52 uint32_t new_flags; 53 uint32_t new_flags;
@@ -65,7 +66,7 @@ int vmw_dmabuf_pin_in_placement(struct vmw_private *dev_priv,
65 ret = ttm_bo_mem_compat(placement, &bo->mem, 66 ret = ttm_bo_mem_compat(placement, &bo->mem,
66 &new_flags) == true ? 0 : -EINVAL; 67 &new_flags) == true ? 0 : -EINVAL;
67 else 68 else
68 ret = ttm_bo_validate(bo, placement, interruptible, false); 69 ret = ttm_bo_validate(bo, placement, &ctx);
69 70
70 if (!ret) 71 if (!ret)
71 vmw_bo_pin_reserved(buf, true); 72 vmw_bo_pin_reserved(buf, true);
@@ -95,6 +96,7 @@ int vmw_dmabuf_pin_in_vram_or_gmr(struct vmw_private *dev_priv,
95 struct vmw_dma_buffer *buf, 96 struct vmw_dma_buffer *buf,
96 bool interruptible) 97 bool interruptible)
97{ 98{
99 struct ttm_operation_ctx ctx = {interruptible, false };
98 struct ttm_buffer_object *bo = &buf->base; 100 struct ttm_buffer_object *bo = &buf->base;
99 int ret; 101 int ret;
100 uint32_t new_flags; 102 uint32_t new_flags;
@@ -115,12 +117,11 @@ int vmw_dmabuf_pin_in_vram_or_gmr(struct vmw_private *dev_priv,
115 goto out_unreserve; 117 goto out_unreserve;
116 } 118 }
117 119
118 ret = ttm_bo_validate(bo, &vmw_vram_gmr_placement, interruptible, 120 ret = ttm_bo_validate(bo, &vmw_vram_gmr_placement, &ctx);
119 false);
120 if (likely(ret == 0) || ret == -ERESTARTSYS) 121 if (likely(ret == 0) || ret == -ERESTARTSYS)
121 goto out_unreserve; 122 goto out_unreserve;
122 123
123 ret = ttm_bo_validate(bo, &vmw_vram_placement, interruptible, false); 124 ret = ttm_bo_validate(bo, &vmw_vram_placement, &ctx);
124 125
125out_unreserve: 126out_unreserve:
126 if (!ret) 127 if (!ret)
@@ -170,6 +171,7 @@ int vmw_dmabuf_pin_in_start_of_vram(struct vmw_private *dev_priv,
170 struct vmw_dma_buffer *buf, 171 struct vmw_dma_buffer *buf,
171 bool interruptible) 172 bool interruptible)
172{ 173{
174 struct ttm_operation_ctx ctx = {interruptible, false };
173 struct ttm_buffer_object *bo = &buf->base; 175 struct ttm_buffer_object *bo = &buf->base;
174 struct ttm_placement placement; 176 struct ttm_placement placement;
175 struct ttm_place place; 177 struct ttm_place place;
@@ -200,14 +202,16 @@ int vmw_dmabuf_pin_in_start_of_vram(struct vmw_private *dev_priv,
200 if (bo->mem.mem_type == TTM_PL_VRAM && 202 if (bo->mem.mem_type == TTM_PL_VRAM &&
201 bo->mem.start < bo->num_pages && 203 bo->mem.start < bo->num_pages &&
202 bo->mem.start > 0 && 204 bo->mem.start > 0 &&
203 buf->pin_count == 0) 205 buf->pin_count == 0) {
204 (void) ttm_bo_validate(bo, &vmw_sys_placement, false, false); 206 ctx.interruptible = false;
207 (void) ttm_bo_validate(bo, &vmw_sys_placement, &ctx);
208 }
205 209
206 if (buf->pin_count > 0) 210 if (buf->pin_count > 0)
207 ret = ttm_bo_mem_compat(&placement, &bo->mem, 211 ret = ttm_bo_mem_compat(&placement, &bo->mem,
208 &new_flags) == true ? 0 : -EINVAL; 212 &new_flags) == true ? 0 : -EINVAL;
209 else 213 else
210 ret = ttm_bo_validate(bo, &placement, interruptible, false); 214 ret = ttm_bo_validate(bo, &placement, &ctx);
211 215
212 /* For some reason we didn't end up at the start of vram */ 216 /* For some reason we didn't end up at the start of vram */
213 WARN_ON(ret == 0 && bo->offset != 0); 217 WARN_ON(ret == 0 && bo->offset != 0);
@@ -286,6 +290,7 @@ void vmw_bo_get_guest_ptr(const struct ttm_buffer_object *bo,
286 */ 290 */
287void vmw_bo_pin_reserved(struct vmw_dma_buffer *vbo, bool pin) 291void vmw_bo_pin_reserved(struct vmw_dma_buffer *vbo, bool pin)
288{ 292{
293 struct ttm_operation_ctx ctx = { false, true };
289 struct ttm_place pl; 294 struct ttm_place pl;
290 struct ttm_placement placement; 295 struct ttm_placement placement;
291 struct ttm_buffer_object *bo = &vbo->base; 296 struct ttm_buffer_object *bo = &vbo->base;
@@ -314,7 +319,7 @@ void vmw_bo_pin_reserved(struct vmw_dma_buffer *vbo, bool pin)
314 placement.num_placement = 1; 319 placement.num_placement = 1;
315 placement.placement = &pl; 320 placement.placement = &pl;
316 321
317 ret = ttm_bo_validate(bo, &placement, false, true); 322 ret = ttm_bo_validate(bo, &placement, &ctx);
318 323
319 BUG_ON(ret != 0 || bo->mem.mem_type != old_mem_type); 324 BUG_ON(ret != 0 || bo->mem.mem_type != old_mem_type);
320} 325}
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
index 21c62a34e558..b700667f6f0b 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
@@ -3701,14 +3701,14 @@ int vmw_validate_single_buffer(struct vmw_private *dev_priv,
3701{ 3701{
3702 struct vmw_dma_buffer *vbo = container_of(bo, struct vmw_dma_buffer, 3702 struct vmw_dma_buffer *vbo = container_of(bo, struct vmw_dma_buffer,
3703 base); 3703 base);
3704 struct ttm_operation_ctx ctx = { interruptible, true };
3704 int ret; 3705 int ret;
3705 3706
3706 if (vbo->pin_count > 0) 3707 if (vbo->pin_count > 0)
3707 return 0; 3708 return 0;
3708 3709
3709 if (validate_as_mob) 3710 if (validate_as_mob)
3710 return ttm_bo_validate(bo, &vmw_mob_placement, interruptible, 3711 return ttm_bo_validate(bo, &vmw_mob_placement, &ctx);
3711 false);
3712 3712
3713 /** 3713 /**
3714 * Put BO in VRAM if there is space, otherwise as a GMR. 3714 * Put BO in VRAM if there is space, otherwise as a GMR.
@@ -3717,8 +3717,7 @@ int vmw_validate_single_buffer(struct vmw_private *dev_priv,
3717 * used as a GMR, this will return -ENOMEM. 3717 * used as a GMR, this will return -ENOMEM.
3718 */ 3718 */
3719 3719
3720 ret = ttm_bo_validate(bo, &vmw_vram_gmr_placement, interruptible, 3720 ret = ttm_bo_validate(bo, &vmw_vram_gmr_placement, &ctx);
3721 false);
3722 if (likely(ret == 0 || ret == -ERESTARTSYS)) 3721 if (likely(ret == 0 || ret == -ERESTARTSYS))
3723 return ret; 3722 return ret;
3724 3723
@@ -3727,7 +3726,7 @@ int vmw_validate_single_buffer(struct vmw_private *dev_priv,
3727 * previous contents. 3726 * previous contents.
3728 */ 3727 */
3729 3728
3730 ret = ttm_bo_validate(bo, &vmw_vram_placement, interruptible, false); 3729 ret = ttm_bo_validate(bo, &vmw_vram_placement, &ctx);
3731 return ret; 3730 return ret;
3732} 3731}
3733 3732
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
index a96f90f017d1..200904ff9a22 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
@@ -968,6 +968,7 @@ vmw_resource_check_buffer(struct vmw_resource *res,
968 bool interruptible, 968 bool interruptible,
969 struct ttm_validate_buffer *val_buf) 969 struct ttm_validate_buffer *val_buf)
970{ 970{
971 struct ttm_operation_ctx ctx = { true, false };
971 struct list_head val_list; 972 struct list_head val_list;
972 bool backup_dirty = false; 973 bool backup_dirty = false;
973 int ret; 974 int ret;
@@ -992,7 +993,7 @@ vmw_resource_check_buffer(struct vmw_resource *res,
992 backup_dirty = res->backup_dirty; 993 backup_dirty = res->backup_dirty;
993 ret = ttm_bo_validate(&res->backup->base, 994 ret = ttm_bo_validate(&res->backup->base,
994 res->func->backup_placement, 995 res->func->backup_placement,
995 true, false); 996 &ctx);
996 997
997 if (unlikely(ret != 0)) 998 if (unlikely(ret != 0))
998 goto out_no_validate; 999 goto out_no_validate;
@@ -1446,6 +1447,7 @@ void vmw_resource_evict_all(struct vmw_private *dev_priv)
1446 */ 1447 */
1447int vmw_resource_pin(struct vmw_resource *res, bool interruptible) 1448int vmw_resource_pin(struct vmw_resource *res, bool interruptible)
1448{ 1449{
1450 struct ttm_operation_ctx ctx = { interruptible, false };
1449 struct vmw_private *dev_priv = res->dev_priv; 1451 struct vmw_private *dev_priv = res->dev_priv;
1450 int ret; 1452 int ret;
1451 1453
@@ -1466,7 +1468,7 @@ int vmw_resource_pin(struct vmw_resource *res, bool interruptible)
1466 ret = ttm_bo_validate 1468 ret = ttm_bo_validate
1467 (&vbo->base, 1469 (&vbo->base,
1468 res->func->backup_placement, 1470 res->func->backup_placement,
1469 interruptible, false); 1471 &ctx);
1470 if (ret) { 1472 if (ret) {
1471 ttm_bo_unreserve(&vbo->base); 1473 ttm_bo_unreserve(&vbo->base);
1472 goto out_no_validate; 1474 goto out_no_validate;
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
index 9b832f136813..004e18b8832c 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
@@ -970,6 +970,7 @@ int vmw_compat_shader_add(struct vmw_private *dev_priv,
970 size_t size, 970 size_t size,
971 struct list_head *list) 971 struct list_head *list)
972{ 972{
973 struct ttm_operation_ctx ctx = { false, true };
973 struct vmw_dma_buffer *buf; 974 struct vmw_dma_buffer *buf;
974 struct ttm_bo_kmap_obj map; 975 struct ttm_bo_kmap_obj map;
975 bool is_iomem; 976 bool is_iomem;
@@ -1005,7 +1006,7 @@ int vmw_compat_shader_add(struct vmw_private *dev_priv,
1005 WARN_ON(is_iomem); 1006 WARN_ON(is_iomem);
1006 1007
1007 ttm_bo_kunmap(&map); 1008 ttm_bo_kunmap(&map);
1008 ret = ttm_bo_validate(&buf->base, &vmw_sys_placement, false, true); 1009 ret = ttm_bo_validate(&buf->base, &vmw_sys_placement, &ctx);
1009 WARN_ON(ret != 0); 1010 WARN_ON(ret != 0);
1010 ttm_bo_unreserve(&buf->base); 1011 ttm_bo_unreserve(&buf->base);
1011 1012