[PATCH] drm/i915/gt: Delete the live_hearbeat_fast selftest

Tvrtko Ursulin tursulin at ursulin.net
Mon Jun 10 11:42:31 UTC 2024


On 03/06/2024 17:20, Niemiec, Krzysztof wrote:
> The test is trying to push the heartbeat frequency to the limit, which
> might sometimes fail. Such a failure does not provide valuable
> information, because it does not indicate that there is something
> necessarily wrong with either the driver or the hardware.
> 
> Remove the test to prevent random, unnecessary failures from appearing
> in CI.
> 
> Suggested-by: Chris Wilson <chris.p.wilson at intel.com>
> Signed-off-by: Niemiec, Krzysztof <krzysztof.niemiec at intel.com>

Just a note in passing that comma in the email display name is I believe 
not RFC 5322 compliant and there might be tools which barf on it(*). If 
you can put it in double quotes, it would be advisable.

Regards,

Tvrtko

*) Such as my internal pull request generator which uses CPAN's 
Email::Address::XS. :)

> ---
>   .../drm/i915/gt/selftest_engine_heartbeat.c   | 110 ------------------
>   1 file changed, 110 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.c b/drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.c
> index ef014df4c4fc..9e4f0e417b3b 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.c
> @@ -193,115 +193,6 @@ static int live_idle_pulse(void *arg)
>   	return err;
>   }
>   
> -static int cmp_u32(const void *_a, const void *_b)
> -{
> -	const u32 *a = _a, *b = _b;
> -
> -	return *a - *b;
> -}
> -
> -static int __live_heartbeat_fast(struct intel_engine_cs *engine)
> -{
> -	const unsigned int error_threshold = max(20000u, jiffies_to_usecs(6));
> -	struct intel_context *ce;
> -	struct i915_request *rq;
> -	ktime_t t0, t1;
> -	u32 times[5];
> -	int err;
> -	int i;
> -
> -	ce = intel_context_create(engine);
> -	if (IS_ERR(ce))
> -		return PTR_ERR(ce);
> -
> -	intel_engine_pm_get(engine);
> -
> -	err = intel_engine_set_heartbeat(engine, 1);
> -	if (err)
> -		goto err_pm;
> -
> -	for (i = 0; i < ARRAY_SIZE(times); i++) {
> -		do {
> -			/* Manufacture a tick */
> -			intel_engine_park_heartbeat(engine);
> -			GEM_BUG_ON(engine->heartbeat.systole);
> -			engine->serial++; /*  pretend we are not idle! */
> -			intel_engine_unpark_heartbeat(engine);
> -
> -			flush_delayed_work(&engine->heartbeat.work);
> -			if (!delayed_work_pending(&engine->heartbeat.work)) {
> -				pr_err("%s: heartbeat %d did not start\n",
> -				       engine->name, i);
> -				err = -EINVAL;
> -				goto err_pm;
> -			}
> -
> -			rcu_read_lock();
> -			rq = READ_ONCE(engine->heartbeat.systole);
> -			if (rq)
> -				rq = i915_request_get_rcu(rq);
> -			rcu_read_unlock();
> -		} while (!rq);
> -
> -		t0 = ktime_get();
> -		while (rq == READ_ONCE(engine->heartbeat.systole))
> -			yield(); /* work is on the local cpu! */
> -		t1 = ktime_get();
> -
> -		i915_request_put(rq);
> -		times[i] = ktime_us_delta(t1, t0);
> -	}
> -
> -	sort(times, ARRAY_SIZE(times), sizeof(times[0]), cmp_u32, NULL);
> -
> -	pr_info("%s: Heartbeat delay: %uus [%u, %u]\n",
> -		engine->name,
> -		times[ARRAY_SIZE(times) / 2],
> -		times[0],
> -		times[ARRAY_SIZE(times) - 1]);
> -
> -	/*
> -	 * Ideally, the upper bound on min work delay would be something like
> -	 * 2 * 2 (worst), +1 for scheduling, +1 for slack. In practice, we
> -	 * are, even with system_wq_highpri, at the mercy of the CPU scheduler
> -	 * and may be stuck behind some slow work for many millisecond. Such
> -	 * as our very own display workers.
> -	 */
> -	if (times[ARRAY_SIZE(times) / 2] > error_threshold) {
> -		pr_err("%s: Heartbeat delay was %uus, expected less than %dus\n",
> -		       engine->name,
> -		       times[ARRAY_SIZE(times) / 2],
> -		       error_threshold);
> -		err = -EINVAL;
> -	}
> -
> -	reset_heartbeat(engine);
> -err_pm:
> -	intel_engine_pm_put(engine);
> -	intel_context_put(ce);
> -	return err;
> -}
> -
> -static int live_heartbeat_fast(void *arg)
> -{
> -	struct intel_gt *gt = arg;
> -	struct intel_engine_cs *engine;
> -	enum intel_engine_id id;
> -	int err = 0;
> -
> -	/* Check that the heartbeat ticks at the desired rate. */
> -	if (!CONFIG_DRM_I915_HEARTBEAT_INTERVAL)
> -		return 0;
> -
> -	for_each_engine(engine, gt, id) {
> -		err = __live_heartbeat_fast(engine);
> -		if (err)
> -			break;
> -	}
> -
> -	return err;
> -}
> -
>   static int __live_heartbeat_off(struct intel_engine_cs *engine)
>   {
>   	int err;
> @@ -372,7 +263,6 @@ int intel_heartbeat_live_selftests(struct drm_i915_private *i915)
>   	static const struct i915_subtest tests[] = {
>   		SUBTEST(live_idle_flush),
>   		SUBTEST(live_idle_pulse),
> -		SUBTEST(live_heartbeat_fast),
>   		SUBTEST(live_heartbeat_off),
>   	};
>   	int saved_hangcheck;


More information about the dri-devel mailing list