We don't need to hold struct_mutex now for retiring requests, so drop it
from i915_retire_requests() and i915_gem_wait_for_idle(), finally
removing I915_WAIT_LOCKED for good.

Signed-off-by: Chris Wilson <[email protected]>
---
 .../gpu/drm/i915/gem/i915_gem_client_blt.c    |  7 +--
 drivers/gpu/drm/i915/gem/i915_gem_context.c   | 20 +--------
 drivers/gpu/drm/i915/gem/i915_gem_pm.c        | 45 +++++++------------
 .../drm/i915/gem/selftests/i915_gem_context.c |  4 +-
 .../drm/i915/gem/selftests/i915_gem_mman.c    |  6 +--
 .../i915/gem/selftests/i915_gem_object_blt.c  |  2 -
 drivers/gpu/drm/i915/gt/selftest_context.c    |  4 +-
 drivers/gpu/drm/i915/gt/selftest_hangcheck.c  | 28 ++++--------
 drivers/gpu/drm/i915/gt/selftest_lrc.c        | 21 +++++----
 drivers/gpu/drm/i915/gt/selftest_timeline.c   |  6 +--
 .../gpu/drm/i915/gt/selftest_workarounds.c    |  6 +--
 drivers/gpu/drm/i915/i915_debugfs.c           | 42 +++++------------
 drivers/gpu/drm/i915/i915_gem.c               | 19 ++++----
 drivers/gpu/drm/i915/i915_request.h           |  7 ++-
 drivers/gpu/drm/i915/selftests/i915_active.c  |  8 +---
 .../gpu/drm/i915/selftests/i915_gem_evict.c   |  2 +-
 .../gpu/drm/i915/selftests/i915_selftest.c    |  8 +---
 .../gpu/drm/i915/selftests/igt_flush_test.c   | 30 +++++--------
 .../gpu/drm/i915/selftests/igt_flush_test.h   |  2 +-
 .../gpu/drm/i915/selftests/igt_live_test.c    |  9 +---
 .../gpu/drm/i915/selftests/mock_gem_device.c  |  4 --
 21 files changed, 91 insertions(+), 189 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_client_blt.c 
b/drivers/gpu/drm/i915/gem/i915_gem_client_blt.c
index c345d3d62df1..3502071e1391 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_client_blt.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_client_blt.c
@@ -155,7 +155,6 @@ static void clear_pages_dma_fence_cb(struct dma_fence 
*fence,
 static void clear_pages_worker(struct work_struct *work)
 {
        struct clear_pages_work *w = container_of(work, typeof(*w), work);
-       struct drm_i915_private *i915 = w->ce->engine->i915;
        struct drm_i915_gem_object *obj = w->sleeve->vma->obj;
        struct i915_vma *vma = w->sleeve->vma;
        struct i915_request *rq;
@@ -173,11 +172,9 @@ static void clear_pages_worker(struct work_struct *work)
        obj->read_domains = I915_GEM_GPU_DOMAINS;
        obj->write_domain = 0;
 
-       /* XXX: we need to kill this */
-       mutex_lock(&i915->drm.struct_mutex);
        err = i915_vma_pin(vma, 0, 0, PIN_USER);
        if (unlikely(err))
-               goto out_unlock;
+               goto out_signal;
 
        batch = intel_emit_vma_fill_blt(w->ce, vma, w->value);
        if (IS_ERR(batch)) {
@@ -229,8 +226,6 @@ static void clear_pages_worker(struct work_struct *work)
        intel_emit_vma_release(w->ce, batch);
 out_unpin:
        i915_vma_unpin(vma);
-out_unlock:
-       mutex_unlock(&i915->drm.struct_mutex);
 out_signal:
        if (unlikely(err)) {
                dma_fence_set_error(&w->dma, err);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c 
b/drivers/gpu/drm/i915/gem/i915_gem_context.c
index 095ea647c862..dc2113767603 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
@@ -1164,8 +1164,7 @@ gen8_modify_rpcs(struct intel_context *ce, struct 
intel_sseu sseu)
 }
 
 static int
-__intel_context_reconfigure_sseu(struct intel_context *ce,
-                                struct intel_sseu sseu)
+intel_context_reconfigure_sseu(struct intel_context *ce, struct intel_sseu 
sseu)
 {
        int ret;
 
@@ -1188,23 +1187,6 @@ __intel_context_reconfigure_sseu(struct intel_context 
*ce,
        return ret;
 }
 
-static int
-intel_context_reconfigure_sseu(struct intel_context *ce, struct intel_sseu 
sseu)
-{
-       struct drm_i915_private *i915 = ce->engine->i915;
-       int ret;
-
-       ret = mutex_lock_interruptible(&i915->drm.struct_mutex);
-       if (ret)
-               return ret;
-
-       ret = __intel_context_reconfigure_sseu(ce, sseu);
-
-       mutex_unlock(&i915->drm.struct_mutex);
-
-       return ret;
-}
-
 static int
 user_to_context_sseu(struct drm_i915_private *i915,
                     const struct drm_i915_gem_context_param_sseu *user,
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pm.c 
b/drivers/gpu/drm/i915/gem/i915_gem_pm.c
index 6e4cc177cc7a..fec0b410d1d9 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pm.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pm.c
@@ -48,11 +48,7 @@ static void retire_work_handler(struct work_struct *work)
        struct drm_i915_private *i915 =
                container_of(work, typeof(*i915), gem.retire_work.work);
 
-       /* Come back later if the device is busy... */
-       if (mutex_trylock(&i915->drm.struct_mutex)) {
-               i915_retire_requests(i915);
-               mutex_unlock(&i915->drm.struct_mutex);
-       }
+       i915_retire_requests(i915);
 
        queue_delayed_work(i915->wq,
                           &i915->gem.retire_work,
@@ -86,26 +82,23 @@ static bool switch_to_kernel_context_sync(struct intel_gt 
*gt)
 {
        bool result = !intel_gt_is_wedged(gt);
 
-       do {
-               if (i915_gem_wait_for_idle(gt->i915,
-                                          I915_WAIT_LOCKED |
-                                          I915_WAIT_FOR_IDLE_BOOST,
-                                          I915_GEM_IDLE_TIMEOUT) == -ETIME) {
-                       /* XXX hide warning from gem_eio */
-                       if (i915_modparams.reset) {
-                               dev_err(gt->i915->drm.dev,
-                                       "Failed to idle engines, declaring 
wedged!\n");
-                               GEM_TRACE_DUMP();
-                       }
-
-                       /*
-                        * Forcibly cancel outstanding work and leave
-                        * the gpu quiet.
-                        */
-                       intel_gt_set_wedged(gt);
-                       result = false;
+       if (i915_gem_wait_for_idle(gt->i915,
+                                  I915_WAIT_FOR_IDLE_BOOST,
+                                  I915_GEM_IDLE_TIMEOUT) == -ETIME) {
+               /* XXX hide warning from gem_eio */
+               if (i915_modparams.reset) {
+                       dev_err(gt->i915->drm.dev,
+                               "Failed to idle engines, declaring wedged!\n");
+                       GEM_TRACE_DUMP();
                }
-       } while (i915_retire_requests(gt->i915) && result);
+
+               /*
+                * Forcibly cancel outstanding work and leave
+                * the gpu quiet.
+                */
+               intel_gt_set_wedged(gt);
+               result = false;
+       }
 
        if (intel_gt_pm_wait_for_idle(gt))
                result = false;
@@ -125,8 +118,6 @@ void i915_gem_suspend(struct drm_i915_private *i915)
        intel_wakeref_auto(&i915->ggtt.userfault_wakeref, 0);
        flush_workqueue(i915->wq);
 
-       mutex_lock(&i915->drm.struct_mutex);
-
        /*
         * We have to flush all the executing contexts to main memory so
         * that they can saved in the hibernation image. To ensure the last
@@ -138,8 +129,6 @@ void i915_gem_suspend(struct drm_i915_private *i915)
         */
        switch_to_kernel_context_sync(&i915->gt);
 
-       mutex_unlock(&i915->drm.struct_mutex);
-
        cancel_delayed_work_sync(&i915->gt.hangcheck.work);
 
        i915_gem_drain_freed_objects(i915);
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c 
b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
index 3adb60c2fd1f..1d0a2ec3307a 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
@@ -893,7 +893,7 @@ __sseu_test(const char *name,
        if (ret)
                return ret;
 
-       ret = __intel_context_reconfigure_sseu(ce, sseu);
+       ret = intel_context_reconfigure_sseu(ce, sseu);
        if (ret)
                goto out_spin;
 
@@ -997,7 +997,7 @@ __igt_ctx_sseu(struct drm_i915_private *i915,
                goto out_fail;
 
 out_fail:
-       if (igt_flush_test(i915, I915_WAIT_LOCKED))
+       if (igt_flush_test(i915))
                ret = -EIO;
 
        intel_context_unpin(ce);
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c 
b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
index 9c217dfe96a9..39c01bc4eb51 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
@@ -393,12 +393,8 @@ static void disable_retire_worker(struct drm_i915_private 
*i915)
 
 static void restore_retire_worker(struct drm_i915_private *i915)
 {
+       igt_flush_test(i915);
        intel_gt_pm_put(&i915->gt);
-
-       mutex_lock(&i915->drm.struct_mutex);
-       igt_flush_test(i915, I915_WAIT_LOCKED);
-       mutex_unlock(&i915->drm.struct_mutex);
-
        i915_gem_driver_register__shrinker(i915);
 }
 
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_object_blt.c 
b/drivers/gpu/drm/i915/gem/selftests/i915_gem_object_blt.c
index c21d747e7d05..5a351998a98d 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_object_blt.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_object_blt.c
@@ -166,9 +166,7 @@ static int igt_copy_blt(void *arg)
                if (!(dst->cache_coherent & I915_BO_CACHE_COHERENT_FOR_WRITE))
                        dst->cache_dirty = true;
 
-               mutex_lock(&i915->drm.struct_mutex);
                err = i915_gem_object_copy_blt(src, dst, ce);
-               mutex_unlock(&i915->drm.struct_mutex);
                if (err)
                        goto err_unpin;
 
diff --git a/drivers/gpu/drm/i915/gt/selftest_context.c 
b/drivers/gpu/drm/i915/gt/selftest_context.c
index 1420533e8fd5..883739354b07 100644
--- a/drivers/gpu/drm/i915/gt/selftest_context.c
+++ b/drivers/gpu/drm/i915/gt/selftest_context.c
@@ -312,7 +312,7 @@ static int live_active_context(void *arg)
                if (err)
                        break;
 
-               err = igt_flush_test(gt->i915, I915_WAIT_LOCKED);
+               err = igt_flush_test(gt->i915);
                if (err)
                        break;
        }
@@ -425,7 +425,7 @@ static int live_remote_context(void *arg)
                if (err)
                        break;
 
-               err = igt_flush_test(gt->i915, I915_WAIT_LOCKED);
+               err = igt_flush_test(gt->i915);
                if (err)
                        break;
        }
diff --git a/drivers/gpu/drm/i915/gt/selftest_hangcheck.c 
b/drivers/gpu/drm/i915/gt/selftest_hangcheck.c
index e53eea1050f8..35ab703dac34 100644
--- a/drivers/gpu/drm/i915/gt/selftest_hangcheck.c
+++ b/drivers/gpu/drm/i915/gt/selftest_hangcheck.c
@@ -285,7 +285,7 @@ static void hang_fini(struct hang *h)
 
        kernel_context_close(h->ctx);
 
-       igt_flush_test(h->gt->i915, I915_WAIT_LOCKED);
+       igt_flush_test(h->gt->i915);
 }
 
 static bool wait_until_running(struct hang *h, struct i915_request *rq)
@@ -429,16 +429,13 @@ static int igt_reset_nop(void *arg)
                        break;
                }
 
-               err = igt_flush_test(gt->i915, 0);
+               err = igt_flush_test(gt->i915);
                if (err)
                        break;
        } while (time_before(jiffies, end_time));
        pr_info("%s: %d resets\n", __func__, count);
 
-       mutex_lock(&gt->i915->drm.struct_mutex);
-       err = igt_flush_test(gt->i915, I915_WAIT_LOCKED);
-       mutex_unlock(&gt->i915->drm.struct_mutex);
-
+       err = igt_flush_test(gt->i915);
 out:
        mock_file_free(gt->i915, file);
        if (intel_gt_is_wedged(gt))
@@ -533,15 +530,12 @@ static int igt_reset_nop_engine(void *arg)
                if (err)
                        break;
 
-               err = igt_flush_test(gt->i915, 0);
+               err = igt_flush_test(gt->i915);
                if (err)
                        break;
        }
 
-       mutex_lock(&gt->i915->drm.struct_mutex);
-       err = igt_flush_test(gt->i915, I915_WAIT_LOCKED);
-       mutex_unlock(&gt->i915->drm.struct_mutex);
-
+       err = igt_flush_test(gt->i915);
 out:
        mock_file_free(gt->i915, file);
        if (intel_gt_is_wedged(gt))
@@ -647,7 +641,7 @@ static int __igt_reset_engine(struct intel_gt *gt, bool 
active)
                if (err)
                        break;
 
-               err = igt_flush_test(gt->i915, 0);
+               err = igt_flush_test(gt->i915);
                if (err)
                        break;
        }
@@ -977,9 +971,7 @@ static int __igt_reset_engines(struct intel_gt *gt,
                if (err)
                        break;
 
-               mutex_lock(&gt->i915->drm.struct_mutex);
-               err = igt_flush_test(gt->i915, I915_WAIT_LOCKED);
-               mutex_unlock(&gt->i915->drm.struct_mutex);
+               err = igt_flush_test(gt->i915);
                if (err)
                        break;
        }
@@ -1511,7 +1503,7 @@ static int igt_reset_queue(void *arg)
 
                i915_request_put(prev);
 
-               err = igt_flush_test(gt->i915, I915_WAIT_LOCKED);
+               err = igt_flush_test(gt->i915);
                if (err)
                        break;
        }
@@ -1751,10 +1743,6 @@ int intel_hangcheck_live_selftests(struct 
drm_i915_private *i915)
 
        err = intel_gt_live_subtests(tests, gt);
 
-       mutex_lock(&gt->i915->drm.struct_mutex);
-       igt_flush_test(gt->i915, I915_WAIT_LOCKED);
-       mutex_unlock(&gt->i915->drm.struct_mutex);
-
        i915_modparams.enable_hangcheck = saved_hangcheck;
        intel_runtime_pm_put(&gt->i915->runtime_pm, wakeref);
 
diff --git a/drivers/gpu/drm/i915/gt/selftest_lrc.c 
b/drivers/gpu/drm/i915/gt/selftest_lrc.c
index aca1b3a9c5de..222a7375c787 100644
--- a/drivers/gpu/drm/i915/gt/selftest_lrc.c
+++ b/drivers/gpu/drm/i915/gt/selftest_lrc.c
@@ -61,7 +61,7 @@ static int live_sanitycheck(void *arg)
                }
 
                igt_spinner_end(&spin);
-               if (igt_flush_test(i915, I915_WAIT_LOCKED)) {
+               if (igt_flush_test(i915)) {
                        err = -EIO;
                        goto err_ctx;
                }
@@ -206,8 +206,7 @@ slice_semaphore_queue(struct intel_engine_cs *outer,
        if (err)
                goto out;
 
-       if (i915_request_wait(head,
-                             I915_WAIT_LOCKED,
+       if (i915_request_wait(head, 0,
                              2 * RUNTIME_INFO(outer->i915)->num_engines * 
(count + 2) * (count + 3)) < 0) {
                pr_err("Failed to slice along semaphore chain of length (%d, 
%d)!\n",
                       count, n);
@@ -279,7 +278,7 @@ static int live_timeslice_preempt(void *arg)
                        if (err)
                                goto err_pin;
 
-                       if (igt_flush_test(i915, I915_WAIT_LOCKED)) {
+                       if (igt_flush_test(i915)) {
                                err = -EIO;
                                goto err_pin;
                        }
@@ -832,7 +831,7 @@ static int live_nopreempt(void *arg)
                        goto err_wedged;
                }
 
-               if (igt_flush_test(i915, I915_WAIT_LOCKED))
+               if (igt_flush_test(i915))
                        goto err_wedged;
        }
 
@@ -948,7 +947,7 @@ static int live_suppress_self_preempt(void *arg)
                        goto err_client_b;
                }
 
-               if (igt_flush_test(i915, I915_WAIT_LOCKED))
+               if (igt_flush_test(i915))
                        goto err_wedged;
        }
 
@@ -1109,7 +1108,7 @@ static int live_suppress_wait_preempt(void *arg)
                        for (i = 0; i < ARRAY_SIZE(client); i++)
                                igt_spinner_end(&client[i].spin);
 
-                       if (igt_flush_test(i915, I915_WAIT_LOCKED))
+                       if (igt_flush_test(i915))
                                goto err_wedged;
 
                        if (engine->execlists.preempt_hang.count) {
@@ -1388,7 +1387,7 @@ static int live_preempt_hang(void *arg)
 
                igt_spinner_end(&spin_hi);
                igt_spinner_end(&spin_lo);
-               if (igt_flush_test(i915, I915_WAIT_LOCKED)) {
+               if (igt_flush_test(i915)) {
                        err = -EIO;
                        goto err_ctx_lo;
                }
@@ -1785,7 +1784,7 @@ static int nop_virtual_engine(struct drm_i915_private 
*i915,
                prime, div64_u64(ktime_to_ns(times[1]), prime));
 
 out:
-       if (igt_flush_test(i915, I915_WAIT_LOCKED))
+       if (igt_flush_test(i915))
                err = -EIO;
 
        for (nc = 0; nc < nctx; nc++) {
@@ -1930,7 +1929,7 @@ static int mask_virtual_engine(struct drm_i915_private 
*i915,
                goto out;
 
 out:
-       if (igt_flush_test(i915, I915_WAIT_LOCKED))
+       if (igt_flush_test(i915))
                err = -EIO;
 
        for (n = 0; n < nsibling; n++)
@@ -2108,7 +2107,7 @@ static int bond_virtual_engine(struct drm_i915_private 
*i915,
 out:
        for (n = 0; !IS_ERR(rq[n]); n++)
                i915_request_put(rq[n]);
-       if (igt_flush_test(i915, I915_WAIT_LOCKED))
+       if (igt_flush_test(i915))
                err = -EIO;
 
        kernel_context_close(ctx);
diff --git a/drivers/gpu/drm/i915/gt/selftest_timeline.c 
b/drivers/gpu/drm/i915/gt/selftest_timeline.c
index 321481403165..42d0bbbbc7ea 100644
--- a/drivers/gpu/drm/i915/gt/selftest_timeline.c
+++ b/drivers/gpu/drm/i915/gt/selftest_timeline.c
@@ -545,7 +545,7 @@ static int live_hwsp_engine(void *arg)
        }
 
 out:
-       if (igt_flush_test(i915, I915_WAIT_LOCKED))
+       if (igt_flush_test(i915))
                err = -EIO;
 
        for (n = 0; n < count; n++) {
@@ -621,7 +621,7 @@ static int live_hwsp_alternate(void *arg)
        }
 
 out:
-       if (igt_flush_test(i915, I915_WAIT_LOCKED))
+       if (igt_flush_test(i915))
                err = -EIO;
 
        for (n = 0; n < count; n++) {
@@ -747,7 +747,7 @@ static int live_hwsp_wrap(void *arg)
        }
 
 out:
-       if (igt_flush_test(i915, I915_WAIT_LOCKED))
+       if (igt_flush_test(i915))
                err = -EIO;
 
        intel_timeline_unpin(tl);
diff --git a/drivers/gpu/drm/i915/gt/selftest_workarounds.c 
b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
index d06d68ac2a3b..173df5507525 100644
--- a/drivers/gpu/drm/i915/gt/selftest_workarounds.c
+++ b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
@@ -668,7 +668,7 @@ static int check_dirty_whitelist(struct i915_gem_context 
*ctx,
                        break;
        }
 
-       if (igt_flush_test(ctx->i915, I915_WAIT_LOCKED))
+       if (igt_flush_test(ctx->i915))
                err = -EIO;
 out_batch:
        i915_vma_unpin_and_release(&batch, 0);
@@ -1074,7 +1074,7 @@ static int live_isolated_whitelist(void *arg)
                kernel_context_close(client[i].ctx);
        }
 
-       if (igt_flush_test(i915, I915_WAIT_LOCKED))
+       if (igt_flush_test(i915))
                err = -EIO;
 
        return err;
@@ -1232,7 +1232,7 @@ live_engine_reset_workarounds(void *arg)
        igt_global_reset_unlock(&i915->gt);
        kernel_context_close(ctx);
 
-       igt_flush_test(i915, I915_WAIT_LOCKED);
+       igt_flush_test(i915);
 
        return ret;
 }
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index c36538f1b36c..32168b9a3f4e 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -3607,6 +3607,7 @@ static int
 i915_drop_caches_set(void *data, u64 val)
 {
        struct drm_i915_private *i915 = data;
+       int ret;
 
        DRM_DEBUG("Dropping caches: 0x%08llx [0x%08llx]\n",
                  val, val & DROP_ALL);
@@ -3616,40 +3617,21 @@ i915_drop_caches_set(void *data, u64 val)
                     I915_IDLE_ENGINES_TIMEOUT))
                intel_gt_set_wedged(&i915->gt);
 
-       /* No need to check and wait for gpu resets, only libdrm auto-restarts
-        * on ioctls on -EAGAIN. */
-       if (val & (DROP_ACTIVE | DROP_IDLE | DROP_RETIRE | DROP_RESET_SEQNO)) {
-               int ret;
+       if (val & DROP_RETIRE)
+               i915_retire_requests(i915);
 
-               ret = mutex_lock_interruptible(&i915->drm.struct_mutex);
+       if (val & (DROP_IDLE | DROP_ACTIVE)) {
+               ret = i915_gem_wait_for_idle(i915,
+                                            I915_WAIT_INTERRUPTIBLE,
+                                            MAX_SCHEDULE_TIMEOUT);
                if (ret)
                        return ret;
+       }
 
-               /*
-                * To finish the flush of the idle_worker, we must complete
-                * the switch-to-kernel-context, which requires a double
-                * pass through wait_for_idle: first queues the switch,
-                * second waits for the switch.
-                */
-               if (ret == 0 && val & (DROP_IDLE | DROP_ACTIVE))
-                       ret = i915_gem_wait_for_idle(i915,
-                                                    I915_WAIT_INTERRUPTIBLE |
-                                                    I915_WAIT_LOCKED,
-                                                    MAX_SCHEDULE_TIMEOUT);
-
-               if (ret == 0 && val & DROP_IDLE)
-                       ret = i915_gem_wait_for_idle(i915,
-                                                    I915_WAIT_INTERRUPTIBLE |
-                                                    I915_WAIT_LOCKED,
-                                                    MAX_SCHEDULE_TIMEOUT);
-
-               if (val & DROP_RETIRE)
-                       i915_retire_requests(i915);
-
-               mutex_unlock(&i915->drm.struct_mutex);
-
-               if (ret == 0 && val & DROP_IDLE)
-                       ret = intel_gt_pm_wait_for_idle(&i915->gt);
+       if (val & DROP_IDLE) {
+               ret = intel_gt_pm_wait_for_idle(&i915->gt);
+               if (ret)
+                       return ret;
        }
 
        if (val & DROP_RESET_ACTIVE && intel_gt_terminally_wedged(&i915->gt))
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 8f4c8c29cab8..a14b2ad13cd5 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -943,19 +943,16 @@ int i915_gem_wait_for_idle(struct drm_i915_private *i915,
        if (!intel_gt_pm_is_awake(&i915->gt))
                return 0;
 
-       GEM_TRACE("flags=%x (%s), timeout=%ld%s\n",
-                 flags, flags & I915_WAIT_LOCKED ? "locked" : "unlocked",
-                 timeout, timeout == MAX_SCHEDULE_TIMEOUT ? " (forever)" : "");
-
-       timeout = wait_for_timelines(i915, flags, timeout);
-       if (timeout < 0)
-               return timeout;
+       do {
+               timeout = wait_for_timelines(i915, flags, timeout);
+               if (timeout < 0)
+                       return timeout;
 
-       if (flags & I915_WAIT_LOCKED) {
-               lockdep_assert_held(&i915->drm.struct_mutex);
+               cond_resched();
+               if (signal_pending(current))
+                       return -EINTR;
 
-               i915_retire_requests(i915);
-       }
+       } while (i915_retire_requests(i915));
 
        return 0;
 }
diff --git a/drivers/gpu/drm/i915/i915_request.h 
b/drivers/gpu/drm/i915/i915_request.h
index 3251d2bdbeea..57a2193c64d1 100644
--- a/drivers/gpu/drm/i915/i915_request.h
+++ b/drivers/gpu/drm/i915/i915_request.h
@@ -308,10 +308,9 @@ long i915_request_wait(struct i915_request *rq,
                       long timeout)
        __attribute__((nonnull(1)));
 #define I915_WAIT_INTERRUPTIBLE        BIT(0)
-#define I915_WAIT_LOCKED       BIT(1) /* struct_mutex held, handle GPU reset */
-#define I915_WAIT_PRIORITY     BIT(2) /* small priority bump for the request */
-#define I915_WAIT_ALL          BIT(3) /* used by i915_gem_object_wait() */
-#define I915_WAIT_FOR_IDLE_BOOST BIT(4)
+#define I915_WAIT_PRIORITY     BIT(1) /* small priority bump for the request */
+#define I915_WAIT_ALL          BIT(2) /* used by i915_gem_object_wait() */
+#define I915_WAIT_FOR_IDLE_BOOST BIT(3)
 
 static inline bool i915_request_signaled(const struct i915_request *rq)
 {
diff --git a/drivers/gpu/drm/i915/selftests/i915_active.c 
b/drivers/gpu/drm/i915/selftests/i915_active.c
index af5827aac7b2..ff1337e34522 100644
--- a/drivers/gpu/drm/i915/selftests/i915_active.c
+++ b/drivers/gpu/drm/i915/selftests/i915_active.c
@@ -164,10 +164,8 @@ static int live_active_wait(void *arg)
 
        __live_put(active);
 
-       mutex_lock(&i915->drm.struct_mutex);
-       if (igt_flush_test(i915, I915_WAIT_LOCKED))
+       if (igt_flush_test(i915))
                err = -EIO;
-       mutex_unlock(&i915->drm.struct_mutex);
 
        return err;
 }
@@ -185,10 +183,8 @@ static int live_active_retire(void *arg)
                return PTR_ERR(active);
 
        /* waits for & retires all requests */
-       mutex_lock(&i915->drm.struct_mutex);
-       if (igt_flush_test(i915, I915_WAIT_LOCKED))
+       if (igt_flush_test(i915))
                err = -EIO;
-       mutex_unlock(&i915->drm.struct_mutex);
 
        if (!READ_ONCE(active->retired)) {
                pr_err("i915_active not retired after flushing!\n");
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c 
b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
index ba6064147173..42139db0d69c 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
@@ -521,7 +521,7 @@ static int igt_evict_contexts(void *arg)
 
        mutex_lock(&i915->ggtt.vm.mutex);
 out_locked:
-       if (igt_flush_test(i915, I915_WAIT_LOCKED))
+       if (igt_flush_test(i915))
                err = -EIO;
        while (reserved) {
                struct reserved *next = reserved->next;
diff --git a/drivers/gpu/drm/i915/selftests/i915_selftest.c 
b/drivers/gpu/drm/i915/selftests/i915_selftest.c
index 438ea0eaa416..825a8286cbe8 100644
--- a/drivers/gpu/drm/i915/selftests/i915_selftest.c
+++ b/drivers/gpu/drm/i915/selftests/i915_selftest.c
@@ -263,10 +263,8 @@ int __i915_live_teardown(int err, void *data)
 {
        struct drm_i915_private *i915 = data;
 
-       mutex_lock(&i915->drm.struct_mutex);
-       if (igt_flush_test(i915, I915_WAIT_LOCKED))
+       if (igt_flush_test(i915))
                err = -EIO;
-       mutex_unlock(&i915->drm.struct_mutex);
 
        i915_gem_drain_freed_objects(i915);
 
@@ -284,10 +282,8 @@ int __intel_gt_live_teardown(int err, void *data)
 {
        struct intel_gt *gt = data;
 
-       mutex_lock(&gt->i915->drm.struct_mutex);
-       if (igt_flush_test(gt->i915, I915_WAIT_LOCKED))
+       if (igt_flush_test(gt->i915))
                err = -EIO;
-       mutex_unlock(&gt->i915->drm.struct_mutex);
 
        i915_gem_drain_freed_objects(gt->i915);
 
diff --git a/drivers/gpu/drm/i915/selftests/igt_flush_test.c 
b/drivers/gpu/drm/i915/selftests/igt_flush_test.c
index d3b5eb402d33..2a5fbe46ea9f 100644
--- a/drivers/gpu/drm/i915/selftests/igt_flush_test.c
+++ b/drivers/gpu/drm/i915/selftests/igt_flush_test.c
@@ -12,31 +12,25 @@
 
 #include "igt_flush_test.h"
 
-int igt_flush_test(struct drm_i915_private *i915, unsigned int flags)
+int igt_flush_test(struct drm_i915_private *i915)
 {
        int ret = intel_gt_is_wedged(&i915->gt) ? -EIO : 0;
-       int repeat = !!(flags & I915_WAIT_LOCKED);
 
        cond_resched();
 
-       do {
-               if (i915_gem_wait_for_idle(i915, flags, HZ / 5) == -ETIME) {
-                       pr_err("%pS timed out, cancelling all further 
testing.\n",
-                              __builtin_return_address(0));
+       i915_retire_requests(i915);
+       if (i915_gem_wait_for_idle(i915, 0, HZ / 5) == -ETIME) {
+               pr_err("%pS timed out, cancelling all further testing.\n",
+                      __builtin_return_address(0));
 
-                       GEM_TRACE("%pS timed out.\n",
-                                 __builtin_return_address(0));
-                       GEM_TRACE_DUMP();
+               GEM_TRACE("%pS timed out.\n",
+                         __builtin_return_address(0));
+               GEM_TRACE_DUMP();
 
-                       intel_gt_set_wedged(&i915->gt);
-                       repeat = 0;
-                       ret = -EIO;
-               }
-
-               /* Ensure we also flush after wedging. */
-               if (flags & I915_WAIT_LOCKED)
-                       i915_retire_requests(i915);
-       } while (repeat--);
+               intel_gt_set_wedged(&i915->gt);
+               ret = -EIO;
+       }
+       i915_retire_requests(i915);
 
        return ret;
 }
diff --git a/drivers/gpu/drm/i915/selftests/igt_flush_test.h 
b/drivers/gpu/drm/i915/selftests/igt_flush_test.h
index 63e009927c43..7541fa74e641 100644
--- a/drivers/gpu/drm/i915/selftests/igt_flush_test.h
+++ b/drivers/gpu/drm/i915/selftests/igt_flush_test.h
@@ -9,6 +9,6 @@
 
 struct drm_i915_private;
 
-int igt_flush_test(struct drm_i915_private *i915, unsigned int flags);
+int igt_flush_test(struct drm_i915_private *i915);
 
 #endif /* IGT_FLUSH_TEST_H */
diff --git a/drivers/gpu/drm/i915/selftests/igt_live_test.c 
b/drivers/gpu/drm/i915/selftests/igt_live_test.c
index 3e902761cd16..04a6f88fdf64 100644
--- a/drivers/gpu/drm/i915/selftests/igt_live_test.c
+++ b/drivers/gpu/drm/i915/selftests/igt_live_test.c
@@ -19,15 +19,12 @@ int igt_live_test_begin(struct igt_live_test *t,
        enum intel_engine_id id;
        int err;
 
-       lockdep_assert_held(&i915->drm.struct_mutex);
-
        t->i915 = i915;
        t->func = func;
        t->name = name;
 
        err = i915_gem_wait_for_idle(i915,
-                                    I915_WAIT_INTERRUPTIBLE |
-                                    I915_WAIT_LOCKED,
+                                    I915_WAIT_INTERRUPTIBLE,
                                     MAX_SCHEDULE_TIMEOUT);
        if (err) {
                pr_err("%s(%s): failed to idle before, with err=%d!",
@@ -50,9 +47,7 @@ int igt_live_test_end(struct igt_live_test *t)
        struct intel_engine_cs *engine;
        enum intel_engine_id id;
 
-       lockdep_assert_held(&i915->drm.struct_mutex);
-
-       if (igt_flush_test(i915, I915_WAIT_LOCKED))
+       if (igt_flush_test(i915))
                return -EIO;
 
        if (t->reset_global != i915_reset_count(&i915->gpu_error)) {
diff --git a/drivers/gpu/drm/i915/selftests/mock_gem_device.c 
b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
index 01a89c071bf5..1956006a0d5b 100644
--- a/drivers/gpu/drm/i915/selftests/mock_gem_device.c
+++ b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
@@ -41,8 +41,6 @@ void mock_device_flush(struct drm_i915_private *i915)
        struct intel_engine_cs *engine;
        enum intel_engine_id id;
 
-       lockdep_assert_held(&i915->drm.struct_mutex);
-
        do {
                for_each_engine(engine, i915, id)
                        mock_engine_flush(engine);
@@ -55,9 +53,7 @@ static void mock_device_release(struct drm_device *dev)
        struct intel_engine_cs *engine;
        enum intel_engine_id id;
 
-       mutex_lock(&i915->drm.struct_mutex);
        mock_device_flush(i915);
-       mutex_unlock(&i915->drm.struct_mutex);
 
        flush_work(&i915->gem.idle_work);
        i915_gem_drain_workqueue(i915);
-- 
2.23.0

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to