[Intel-gfx] [PATCH 04/28] drm/i915/selftests: Remove live_suppress_wait_preempt
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Thu Jun 11 11:38:22 UTC 2020
On 07/06/2020 23:20, Chris Wilson wrote:
> With the removal of the internal wait-priority boosting, we can also
> remove the selftest to ensure that those waits were being suppressed
> from causing preemptions.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Regards,
Tvrtko
> ---
> drivers/gpu/drm/i915/gt/selftest_lrc.c | 178 -------------------------
> 1 file changed, 178 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/selftest_lrc.c b/drivers/gpu/drm/i915/gt/selftest_lrc.c
> index 67d74e6432a8..e838e38a262c 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_lrc.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_lrc.c
> @@ -2379,183 +2379,6 @@ static int live_suppress_self_preempt(void *arg)
> goto err_client_b;
> }
>
> -static int __i915_sw_fence_call
> -dummy_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state)
> -{
> - return NOTIFY_DONE;
> -}
> -
> -static struct i915_request *dummy_request(struct intel_engine_cs *engine)
> -{
> - struct i915_request *rq;
> -
> - rq = kzalloc(sizeof(*rq), GFP_KERNEL);
> - if (!rq)
> - return NULL;
> -
> - rq->engine = engine;
> -
> - spin_lock_init(&rq->lock);
> - INIT_LIST_HEAD(&rq->fence.cb_list);
> - rq->fence.lock = &rq->lock;
> - rq->fence.ops = &i915_fence_ops;
> -
> - i915_sched_node_init(&rq->sched);
> -
> - /* mark this request as permanently incomplete */
> - rq->fence.seqno = 1;
> - BUILD_BUG_ON(sizeof(rq->fence.seqno) != 8); /* upper 32b == 0 */
> - rq->hwsp_seqno = (u32 *)&rq->fence.seqno + 1;
> - GEM_BUG_ON(i915_request_completed(rq));
> -
> - i915_sw_fence_init(&rq->submit, dummy_notify);
> - set_bit(I915_FENCE_FLAG_ACTIVE, &rq->fence.flags);
> -
> - spin_lock_init(&rq->lock);
> - rq->fence.lock = &rq->lock;
> - INIT_LIST_HEAD(&rq->fence.cb_list);
> -
> - return rq;
> -}
> -
> -static void dummy_request_free(struct i915_request *dummy)
> -{
> - /* We have to fake the CS interrupt to kick the next request */
> - i915_sw_fence_commit(&dummy->submit);
> -
> - i915_request_mark_complete(dummy);
> - dma_fence_signal(&dummy->fence);
> -
> - i915_sched_node_fini(&dummy->sched);
> - i915_sw_fence_fini(&dummy->submit);
> -
> - dma_fence_free(&dummy->fence);
> -}
> -
> -static int live_suppress_wait_preempt(void *arg)
> -{
> - struct intel_gt *gt = arg;
> - struct preempt_client client[4];
> - struct i915_request *rq[ARRAY_SIZE(client)] = {};
> - struct intel_engine_cs *engine;
> - enum intel_engine_id id;
> - int err = -ENOMEM;
> - int i;
> -
> - /*
> - * Waiters are given a little priority nudge, but not enough
> - * to actually cause any preemption. Double check that we do
> - * not needlessly generate preempt-to-idle cycles.
> - */
> -
> - if (!HAS_LOGICAL_RING_PREEMPTION(gt->i915))
> - return 0;
> -
> - if (preempt_client_init(gt, &client[0])) /* ELSP[0] */
> - return -ENOMEM;
> - if (preempt_client_init(gt, &client[1])) /* ELSP[1] */
> - goto err_client_0;
> - if (preempt_client_init(gt, &client[2])) /* head of queue */
> - goto err_client_1;
> - if (preempt_client_init(gt, &client[3])) /* bystander */
> - goto err_client_2;
> -
> - for_each_engine(engine, gt, id) {
> - int depth;
> -
> - if (!intel_engine_has_preemption(engine))
> - continue;
> -
> - if (!engine->emit_init_breadcrumb)
> - continue;
> -
> - for (depth = 0; depth < ARRAY_SIZE(client); depth++) {
> - struct i915_request *dummy;
> -
> - engine->execlists.preempt_hang.count = 0;
> -
> - dummy = dummy_request(engine);
> - if (!dummy)
> - goto err_client_3;
> -
> - for (i = 0; i < ARRAY_SIZE(client); i++) {
> - struct i915_request *this;
> -
> - this = spinner_create_request(&client[i].spin,
> - client[i].ctx, engine,
> - MI_NOOP);
> - if (IS_ERR(this)) {
> - err = PTR_ERR(this);
> - goto err_wedged;
> - }
> -
> - /* Disable NEWCLIENT promotion */
> - __i915_active_fence_set(&i915_request_timeline(this)->last_request,
> - &dummy->fence);
> -
> - rq[i] = i915_request_get(this);
> - i915_request_add(this);
> - }
> -
> - dummy_request_free(dummy);
> -
> - GEM_BUG_ON(i915_request_completed(rq[0]));
> - if (!igt_wait_for_spinner(&client[0].spin, rq[0])) {
> - pr_err("%s: First client failed to start\n",
> - engine->name);
> - goto err_wedged;
> - }
> - GEM_BUG_ON(!i915_request_started(rq[0]));
> -
> - if (i915_request_wait(rq[depth],
> - I915_WAIT_PRIORITY,
> - 1) != -ETIME) {
> - pr_err("%s: Waiter depth:%d completed!\n",
> - engine->name, depth);
> - goto err_wedged;
> - }
> -
> - for (i = 0; i < ARRAY_SIZE(client); i++) {
> - igt_spinner_end(&client[i].spin);
> - i915_request_put(rq[i]);
> - rq[i] = NULL;
> - }
> -
> - if (igt_flush_test(gt->i915))
> - goto err_wedged;
> -
> - if (engine->execlists.preempt_hang.count) {
> - pr_err("%s: Preemption recorded x%d, depth %d; should have been suppressed!\n",
> - engine->name,
> - engine->execlists.preempt_hang.count,
> - depth);
> - err = -EINVAL;
> - goto err_client_3;
> - }
> - }
> - }
> -
> - err = 0;
> -err_client_3:
> - preempt_client_fini(&client[3]);
> -err_client_2:
> - preempt_client_fini(&client[2]);
> -err_client_1:
> - preempt_client_fini(&client[1]);
> -err_client_0:
> - preempt_client_fini(&client[0]);
> - return err;
> -
> -err_wedged:
> - for (i = 0; i < ARRAY_SIZE(client); i++) {
> - igt_spinner_end(&client[i].spin);
> - i915_request_put(rq[i]);
> - }
> - intel_gt_set_wedged(gt);
> - err = -EIO;
> - goto err_client_3;
> -}
> -
> static int live_chain_preempt(void *arg)
> {
> struct intel_gt *gt = arg;
> @@ -4592,7 +4415,6 @@ int intel_execlists_live_selftests(struct drm_i915_private *i915)
> SUBTEST(live_nopreempt),
> SUBTEST(live_preempt_cancel),
> SUBTEST(live_suppress_self_preempt),
> - SUBTEST(live_suppress_wait_preempt),
> SUBTEST(live_chain_preempt),
> SUBTEST(live_preempt_gang),
> SUBTEST(live_preempt_timeout),
>
More information about the Intel-gfx
mailing list