Instead of trying to create a timer with zero delay (i.e. with expires
set to the current jiffies and not the future, an already expired
timer), execute that request immediately.

v2: Refactor list_del_init+signal into its own little function.
v3: Reorder testing so as not to immediately signal a delayed request.

Signed-off-by: Chris Wilson <[email protected]>
Link: 
https://patchwork.freedesktop.org/patch/msgid/[email protected]
Cc: Joonas Lahtinen <[email protected]>
---
 drivers/gpu/drm/i915/selftests/mock_engine.c | 37 +++++++++++++++++++++-------
 1 file changed, 28 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/i915/selftests/mock_engine.c 
b/drivers/gpu/drm/i915/selftests/mock_engine.c
index 331c2b09869e..0aafa8a105b8 100644
--- a/drivers/gpu/drm/i915/selftests/mock_engine.c
+++ b/drivers/gpu/drm/i915/selftests/mock_engine.c
@@ -32,6 +32,13 @@ static struct mock_request *first_request(struct mock_engine 
*engine)
                                        link);
 }
 
+static void advance(struct mock_engine *engine,
+                   struct mock_request *request)
+{
+       list_del_init(&request->link);
+       mock_seqno_advance(&engine->base, request->base.global_seqno);
+}
+
 static void hw_delay_complete(struct timer_list *t)
 {
        struct mock_engine *engine = from_timer(engine, t, hw_delay);
@@ -39,15 +46,23 @@ static void hw_delay_complete(struct timer_list *t)
 
        spin_lock(&engine->hw_lock);
 
-       request = first_request(engine);
-       if (request) {
-               list_del_init(&request->link);
-               mock_seqno_advance(&engine->base, request->base.global_seqno);
-       }
-
+       /* Timer fired, first request is complete */
        request = first_request(engine);
        if (request)
-               mod_timer(&engine->hw_delay, jiffies + request->delay);
+               advance(engine, request);
+
+       /*
+        * Also immediately signal any subsequent 0-delay requests, but
+        * requeue the timer for the next delayed request.
+        */
+       while ((request = first_request(engine))) {
+               if (request->delay) {
+                       mod_timer(&engine->hw_delay, jiffies + request->delay);
+                       break;
+               }
+
+               advance(engine, request);
+       }
 
        spin_unlock(&engine->hw_lock);
 }
@@ -98,8 +113,12 @@ static void mock_submit_request(struct drm_i915_gem_request 
*request)
 
        spin_lock_irq(&engine->hw_lock);
        list_add_tail(&mock->link, &engine->hw_queue);
-       if (mock->link.prev == &engine->hw_queue)
-               mod_timer(&engine->hw_delay, jiffies + mock->delay);
+       if (mock->link.prev == &engine->hw_queue) {
+               if (mock->delay)
+                       mod_timer(&engine->hw_delay, jiffies + mock->delay);
+               else
+                       advance(engine, mock);
+       }
        spin_unlock_irq(&engine->hw_lock);
 }
 
-- 
2.15.0.rc2

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

Reply via email to