If we change the wait_queue_t from using the autoremove_wake_function to
the default_wake_function, we no longer have to restore the wait_queue_t
entry on the wait_queue_head_t list after being woken up by it, as we
are unusual in sleeping multiple times on the same wait_queue_t.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_gem_request.c | 28 ++++++----------------------
 1 file changed, 6 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_request.c 
b/drivers/gpu/drm/i915/i915_gem_request.c
index f70a2c3d26cd..6cf1210984d7 100644
--- a/drivers/gpu/drm/i915/i915_gem_request.c
+++ b/drivers/gpu/drm/i915/i915_gem_request.c
@@ -938,16 +938,6 @@ void __i915_add_request(struct drm_i915_gem_request 
*request, bool flush_caches)
        local_bh_enable(); /* Kick the execlists tasklet if just scheduled */
 }
 
-static void reset_wait_queue(wait_queue_head_t *q, wait_queue_t *wait)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&q->lock, flags);
-       if (list_empty(&wait->task_list))
-               __add_wait_queue(q, wait);
-       spin_unlock_irqrestore(&q->lock, flags);
-}
-
 static unsigned long local_clock_us(unsigned int *cpu)
 {
        unsigned long t;
@@ -1042,8 +1032,8 @@ long i915_wait_request(struct drm_i915_gem_request *req,
        const int state = flags & I915_WAIT_INTERRUPTIBLE ?
                TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE;
        wait_queue_head_t *errq = &req->i915->gpu_error.wait_queue;
-       DEFINE_WAIT(reset);
-       DEFINE_WAIT(exec);
+       DEFINE_WAIT_FUNC(reset, default_wake_function);
+       DEFINE_WAIT_FUNC(exec, default_wake_function);
        struct intel_wait wait;
 
        might_sleep();
@@ -1062,13 +1052,13 @@ long i915_wait_request(struct drm_i915_gem_request *req,
 
        trace_i915_gem_request_wait_begin(req);
 
+       add_wait_queue(&req->execute, &exec);
        if (flags & I915_WAIT_LOCKED)
                add_wait_queue(errq, &reset);
 
        wait.tsk = current;
 
 restart:
-       reset_wait_queue(&req->execute, &exec);
        wait.seqno = i915_gem_request_global_seqno(req);
        if (!wait.seqno) {
                do {
@@ -1082,21 +1072,16 @@ long i915_wait_request(struct drm_i915_gem_request *req,
                            i915_reset_in_progress(&req->i915->gpu_error)) {
                                __set_current_state(TASK_RUNNING);
                                i915_reset(req->i915);
-                               reset_wait_queue(errq, &reset);
                                continue;
                        }
 
                        if (signal_pending_state(state, current)) {
                                timeout = -ERESTARTSYS;
-                               break;
+                               goto complete;
                        }
 
                        timeout = io_schedule_timeout(timeout);
                } while (timeout);
-               finish_wait(&req->execute, &exec);
-
-               if (timeout < 0)
-                       goto complete;
 
                GEM_BUG_ON(!wait.seqno);
        }
@@ -1156,7 +1141,6 @@ long i915_wait_request(struct drm_i915_gem_request *req,
                    i915_reset_in_progress(&req->i915->gpu_error)) {
                        __set_current_state(TASK_RUNNING);
                        i915_reset(req->i915);
-                       reset_wait_queue(errq, &reset);
                        continue;
                }
 
@@ -1171,11 +1155,11 @@ long i915_wait_request(struct drm_i915_gem_request *req,
        }
 
        intel_engine_remove_wait(req->engine, &wait);
-       __set_current_state(TASK_RUNNING);
-
 complete:
+       __set_current_state(TASK_RUNNING);
        if (flags & I915_WAIT_LOCKED)
                remove_wait_queue(errq, &reset);
+       remove_wait_queue(&req->execute, &exec);
        trace_i915_gem_request_wait_end(req);
 
        return timeout;
-- 
2.11.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to