Skip to content

Commit 631a658

Browse files
icklejlahtine-intel
authored andcommitted
drm/i915/gt: Do not schedule normal requests immediately along virtual
When we push a virtual request onto the HW, we update the rq->engine to point to the physical engine. A request that is then submitted by the user that waits upon the virtual engine, but along the physical engine in use, will then see that it is due to be submitted to the same engine and take a shortcut (and be queued without waiting for the completion fence). However, the virtual request may be preempted (either by higher priority users, or by timeslicing) and removed from the physical engine to be migrated over to one of its siblings. The dependent normal request however is oblivious to the removal of the virtual request and remains queued to execute on HW, believing that once it reaches the head of its queue all of its predecessors will have completed executing! v2: Beware restriction of signal->execution_mask prior to submission. Fixes: 6d06779 ("drm/i915: Load balancing across a virtual engine") Testcase: igt/gem_exec_balancer/sliced Signed-off-by: Chris Wilson <[email protected]> Cc: Tvrtko Ursulin <[email protected]> Cc: <[email protected]> # v5.3+ Reviewed-by: Tvrtko Ursulin <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] (cherry picked from commit 511b6d9) Signed-off-by: Joonas Lahtinen <[email protected]>
1 parent dd873dd commit 631a658

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

drivers/gpu/drm/i915/i915_request.c

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1237,6 +1237,25 @@ i915_request_await_execution(struct i915_request *rq,
12371237
return 0;
12381238
}
12391239

1240+
static int
1241+
await_request_submit(struct i915_request *to, struct i915_request *from)
1242+
{
1243+
/*
1244+
* If we are waiting on a virtual engine, then it may be
1245+
* constrained to execute on a single engine *prior* to submission.
1246+
* When it is submitted, it will be first submitted to the virtual
1247+
* engine and then passed to the physical engine. We cannot allow
1248+
* the waiter to be submitted immediately to the physical engine
1249+
* as it may then bypass the virtual request.
1250+
*/
1251+
if (to->engine == READ_ONCE(from->engine))
1252+
return i915_sw_fence_await_sw_fence_gfp(&to->submit,
1253+
&from->submit,
1254+
I915_FENCE_GFP);
1255+
else
1256+
return __i915_request_await_execution(to, from, NULL);
1257+
}
1258+
12401259
static int
12411260
i915_request_await_request(struct i915_request *to, struct i915_request *from)
12421261
{
@@ -1258,10 +1277,8 @@ i915_request_await_request(struct i915_request *to, struct i915_request *from)
12581277
return ret;
12591278
}
12601279

1261-
if (to->engine == READ_ONCE(from->engine))
1262-
ret = i915_sw_fence_await_sw_fence_gfp(&to->submit,
1263-
&from->submit,
1264-
I915_FENCE_GFP);
1280+
if (is_power_of_2(to->execution_mask | READ_ONCE(from->execution_mask)))
1281+
ret = await_request_submit(to, from);
12651282
else
12661283
ret = emit_semaphore_wait(to, from, I915_FENCE_GFP);
12671284
if (ret < 0)

0 commit comments

Comments
 (0)