[Intel-gfx] [PATCH v3] drm/i915/pmu: Reconstruct active state on starting busy-stats

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Fri Jan 12 08:16:19 UTC 2018


On 11/01/2018 07:30, Chris Wilson wrote:
> We have a hole in our busy-stat accounting if the pmu is enabled during
> a long running batch, the pmu will not start accumulating busy-time
> until the next context switch. This then fails tests that are only
> sampling a single batch.
> 
> v2: Count each active port just once (context in/out events are only on
> the first and last assigment to a port).
> v3: Avoid hardcoding knowlege of 2 submission ports
> 
> Fixes: 30e17b7847f5 ("drm/i915: Engine busy time tracking")
> Testcase: igt/perf_pmu/busy-start
> Testcase: igt/perf_pmu/busy-double-start
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
>   drivers/gpu/drm/i915/intel_engine_cs.c | 16 +++++++++++++++-
>   1 file changed, 15 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
> index 6bb51a502b8b..d790bdc227ff 100644
> --- a/drivers/gpu/drm/i915/intel_engine_cs.c
> +++ b/drivers/gpu/drm/i915/intel_engine_cs.c
> @@ -1951,8 +1951,22 @@ int intel_enable_engine_stats(struct intel_engine_cs *engine)
>   	spin_lock_irqsave(&engine->stats.lock, flags);
>   	if (engine->stats.enabled == ~0)
>   		goto busy;
> -	if (engine->stats.enabled++ == 0)
> +	if (engine->stats.enabled++ == 0) {
> +		struct intel_engine_execlists *execlists = &engine->execlists;
> +		const struct execlist_port *port = execlists->port;
> +		unsigned int num_ports = execlists_num_ports(execlists);
> +
>   		engine->stats.enabled_at = ktime_get();
> +
> +		/* XXX submission method oblivious? */
> +		while (num_ports-- && port_isset(port)) {
> +			engine->stats.active++;
> +			port++;
> +		}

Argh, engine->timeline->lock is required to safely to this. But it needs 
to be outside the engine->stats.lock. I can't think of any problems 
doing it at the moment. What do you think?

Regards,

Tvrtko

> +
> +		if (engine->stats.active)
> +			engine->stats.start = engine->stats.enabled_at;
> +	}
>   	spin_unlock_irqrestore(&engine->stats.lock, flags);
>   
>   	return 0;
> 


More information about the Intel-gfx mailing list