Commit b1f9107e authored by Chris Wilson's avatar Chris Wilson

drm/i915/selftests: Don't try to queue a request with zero delay

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: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20171024220855.30155-1-chris@chris-wilson.co.uk
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
parent 753bdbd0
...@@ -32,6 +32,13 @@ static struct mock_request *first_request(struct mock_engine *engine) ...@@ -32,6 +32,13 @@ static struct mock_request *first_request(struct mock_engine *engine)
link); 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) static void hw_delay_complete(struct timer_list *t)
{ {
struct mock_engine *engine = from_timer(engine, t, hw_delay); struct mock_engine *engine = from_timer(engine, t, hw_delay);
...@@ -39,15 +46,23 @@ static void hw_delay_complete(struct timer_list *t) ...@@ -39,15 +46,23 @@ static void hw_delay_complete(struct timer_list *t)
spin_lock(&engine->hw_lock); spin_lock(&engine->hw_lock);
request = first_request(engine); /* Timer fired, first request is complete */
if (request) {
list_del_init(&request->link);
mock_seqno_advance(&engine->base, request->base.global_seqno);
}
request = first_request(engine); request = first_request(engine);
if (request) 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); spin_unlock(&engine->hw_lock);
} }
...@@ -98,8 +113,12 @@ static void mock_submit_request(struct drm_i915_gem_request *request) ...@@ -98,8 +113,12 @@ static void mock_submit_request(struct drm_i915_gem_request *request)
spin_lock_irq(&engine->hw_lock); spin_lock_irq(&engine->hw_lock);
list_add_tail(&mock->link, &engine->hw_queue); list_add_tail(&mock->link, &engine->hw_queue);
if (mock->link.prev == &engine->hw_queue) if (mock->link.prev == &engine->hw_queue) {
mod_timer(&engine->hw_delay, jiffies + mock->delay); if (mock->delay)
mod_timer(&engine->hw_delay, jiffies + mock->delay);
else
advance(engine, mock);
}
spin_unlock_irq(&engine->hw_lock); spin_unlock_irq(&engine->hw_lock);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment