Skip to content

Commit 2835f4f

Browse files
committed
drm/i915/selftests: Improve switch-to-kernel-context checking
We can reduce the switch-to-kernel-context selftest to operate as a loop and so trivially test another state transition (that of idle->busy). Signed-off-by: Chris Wilson <[email protected]> Reviewed-by: Tvrtko Ursulin <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent b185a35 commit 2835f4f

File tree

1 file changed

+35
-45
lines changed

1 file changed

+35
-45
lines changed

drivers/gpu/drm/i915/selftests/i915_gem_context.c

Lines changed: 35 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1493,63 +1493,55 @@ static int __igt_switch_to_kernel_context(struct drm_i915_private *i915,
14931493
{
14941494
struct intel_engine_cs *engine;
14951495
unsigned int tmp;
1496-
int err;
1496+
int pass;
14971497

14981498
GEM_TRACE("Testing %s\n", __engine_name(i915, engines));
1499-
for_each_engine_masked(engine, i915, engines, tmp) {
1500-
struct i915_request *rq;
1499+
for (pass = 0; pass < 4; pass++) { /* Once busy; once idle; repeat */
1500+
bool from_idle = pass & 1;
1501+
int err;
15011502

1502-
rq = i915_request_alloc(engine, ctx);
1503-
if (IS_ERR(rq))
1504-
return PTR_ERR(rq);
1503+
if (!from_idle) {
1504+
for_each_engine_masked(engine, i915, engines, tmp) {
1505+
struct i915_request *rq;
15051506

1506-
i915_request_add(rq);
1507-
}
1507+
rq = i915_request_alloc(engine, ctx);
1508+
if (IS_ERR(rq))
1509+
return PTR_ERR(rq);
15081510

1509-
err = i915_gem_switch_to_kernel_context(i915);
1510-
if (err)
1511-
return err;
1512-
1513-
for_each_engine_masked(engine, i915, engines, tmp) {
1514-
if (!engine_has_kernel_context_barrier(engine)) {
1515-
pr_err("kernel context not last on engine %s!\n",
1516-
engine->name);
1517-
return -EINVAL;
1511+
i915_request_add(rq);
1512+
}
15181513
}
1519-
}
15201514

1521-
err = i915_gem_wait_for_idle(i915,
1522-
I915_WAIT_LOCKED,
1523-
MAX_SCHEDULE_TIMEOUT);
1524-
if (err)
1525-
return err;
1515+
err = i915_gem_switch_to_kernel_context(i915);
1516+
if (err)
1517+
return err;
15261518

1527-
GEM_BUG_ON(i915->gt.active_requests);
1528-
for_each_engine_masked(engine, i915, engines, tmp) {
1529-
if (engine->last_retired_context->gem_context != i915->kernel_context) {
1530-
pr_err("engine %s not idling in kernel context!\n",
1531-
engine->name);
1519+
if (!from_idle) {
1520+
err = i915_gem_wait_for_idle(i915,
1521+
I915_WAIT_LOCKED,
1522+
MAX_SCHEDULE_TIMEOUT);
1523+
if (err)
1524+
return err;
1525+
}
1526+
1527+
if (i915->gt.active_requests) {
1528+
pr_err("%d active requests remain after switching to kernel context, pass %d (%s) on %s engine%s\n",
1529+
i915->gt.active_requests,
1530+
pass, from_idle ? "idle" : "busy",
1531+
__engine_name(i915, engines),
1532+
is_power_of_2(engines) ? "" : "s");
15321533
return -EINVAL;
15331534
}
1534-
}
15351535

1536-
err = i915_gem_switch_to_kernel_context(i915);
1537-
if (err)
1538-
return err;
1536+
/* XXX Bonus points for proving we are the kernel context! */
15391537

1540-
if (i915->gt.active_requests) {
1541-
pr_err("switch-to-kernel-context emitted %d requests even though it should already be idling in the kernel context\n",
1542-
i915->gt.active_requests);
1543-
return -EINVAL;
1538+
mutex_unlock(&i915->drm.struct_mutex);
1539+
drain_delayed_work(&i915->gt.idle_work);
1540+
mutex_lock(&i915->drm.struct_mutex);
15441541
}
15451542

1546-
for_each_engine_masked(engine, i915, engines, tmp) {
1547-
if (!intel_engine_has_kernel_context(engine)) {
1548-
pr_err("kernel context not last on engine %s!\n",
1549-
engine->name);
1550-
return -EINVAL;
1551-
}
1552-
}
1543+
if (igt_flush_test(i915, I915_WAIT_LOCKED))
1544+
return -EIO;
15531545

15541546
return 0;
15551547
}
@@ -1593,8 +1585,6 @@ static int igt_switch_to_kernel_context(void *arg)
15931585

15941586
out_unlock:
15951587
GEM_TRACE_DUMP_ON(err);
1596-
if (igt_flush_test(i915, I915_WAIT_LOCKED))
1597-
err = -EIO;
15981588

15991589
intel_runtime_pm_put(i915, wakeref);
16001590
mutex_unlock(&i915->drm.struct_mutex);

0 commit comments

Comments
 (0)