diff options
-rw-r--r-- | drivers/gpu/drm/i915/selftests/i915_gem_object.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_object.c b/drivers/gpu/drm/i915/selftests/i915_gem_object.c index f4a5099c75b5..d77acf4cc439 100644 --- a/drivers/gpu/drm/i915/selftests/i915_gem_object.c +++ b/drivers/gpu/drm/i915/selftests/i915_gem_object.c | |||
@@ -507,6 +507,15 @@ static int igt_mmap_offset_exhaustion(void *arg) | |||
507 | u64 hole_start, hole_end; | 507 | u64 hole_start, hole_end; |
508 | int loop, err; | 508 | int loop, err; |
509 | 509 | ||
510 | /* Disable background reaper */ | ||
511 | mutex_lock(&i915->drm.struct_mutex); | ||
512 | if (!i915->gt.active_requests++) | ||
513 | i915_gem_unpark(i915); | ||
514 | mutex_unlock(&i915->drm.struct_mutex); | ||
515 | cancel_delayed_work_sync(&i915->gt.retire_work); | ||
516 | cancel_delayed_work_sync(&i915->gt.idle_work); | ||
517 | GEM_BUG_ON(!i915->gt.awake); | ||
518 | |||
510 | /* Trim the device mmap space to only a page */ | 519 | /* Trim the device mmap space to only a page */ |
511 | memset(&resv, 0, sizeof(resv)); | 520 | memset(&resv, 0, sizeof(resv)); |
512 | drm_mm_for_each_hole(hole, mm, hole_start, hole_end) { | 521 | drm_mm_for_each_hole(hole, mm, hole_start, hole_end) { |
@@ -515,7 +524,7 @@ static int igt_mmap_offset_exhaustion(void *arg) | |||
515 | err = drm_mm_reserve_node(mm, &resv); | 524 | err = drm_mm_reserve_node(mm, &resv); |
516 | if (err) { | 525 | if (err) { |
517 | pr_err("Failed to trim VMA manager, err=%d\n", err); | 526 | pr_err("Failed to trim VMA manager, err=%d\n", err); |
518 | return err; | 527 | goto out_park; |
519 | } | 528 | } |
520 | break; | 529 | break; |
521 | } | 530 | } |
@@ -576,6 +585,7 @@ static int igt_mmap_offset_exhaustion(void *arg) | |||
576 | goto err_obj; | 585 | goto err_obj; |
577 | } | 586 | } |
578 | 587 | ||
588 | /* NB we rely on the _active_ reference to access obj now */ | ||
579 | GEM_BUG_ON(!i915_gem_object_is_active(obj)); | 589 | GEM_BUG_ON(!i915_gem_object_is_active(obj)); |
580 | err = i915_gem_object_create_mmap_offset(obj); | 590 | err = i915_gem_object_create_mmap_offset(obj); |
581 | if (err) { | 591 | if (err) { |
@@ -587,6 +597,13 @@ static int igt_mmap_offset_exhaustion(void *arg) | |||
587 | 597 | ||
588 | out: | 598 | out: |
589 | drm_mm_remove_node(&resv); | 599 | drm_mm_remove_node(&resv); |
600 | out_park: | ||
601 | mutex_lock(&i915->drm.struct_mutex); | ||
602 | if (--i915->gt.active_requests) | ||
603 | queue_delayed_work(i915->wq, &i915->gt.retire_work, 0); | ||
604 | else | ||
605 | queue_delayed_work(i915->wq, &i915->gt.idle_work, 0); | ||
606 | mutex_unlock(&i915->drm.struct_mutex); | ||
590 | return err; | 607 | return err; |
591 | err_obj: | 608 | err_obj: |
592 | i915_gem_object_put(obj); | 609 | i915_gem_object_put(obj); |