[RFC 00/17] Per-context and per-client engine busyness

Tvrtko Ursulin
2017-10-25T15:36:41Z

Lightly tested (apart from patch 13) series to start the discussion early.

Please skip patches 1-9, and probably 10-11 as well, those ones are the current
PMU effort which is yet unmerged but needed as a basis for patches 12-17.

Customer ask is to allow clients to query how much GPU engine time they are
using per context.

In patch 12 I add this, and then patch 13 I expose it via the context get param.
(It feels like a slight misuse of get param though.)

Patches 14-17 are not a customer ask as far as I know, but something I thought
would be pretty cool. Basically bringing the ability to write a CPU top-like
utility for GPU tasks.

I've prototyped a quick demo of intel-client-top which produces output like:

neverball[ 6011]: rcs0: 41.01% bcs0: 0.00% vcs0: 0.00% vecs0: 0.00%
Xorg[ 5664]: rcs0: 31.16% bcs0: 0.00% vcs0: 0.00% vecs0: 0.00%
xfwm4[ 5727]: rcs0: 0.00% bcs0: 0.00% vcs0: 0.00% vecs0: 0.00%

As I say in the commit we could also extend this to show the overall engine
busyness (via PMU), and also average load as queue-depth (also PMU), in the top
header.

Another potential use for the per-client infrastructure is tieing it up with
perf PMU. At the moment our perf PMU are global counters only. With the per-
client infrastructure it should be possible to make it work in the task mode as
well and so enable GPU busyness profiling of single tasks.

But this last part is not in this series, at least not yet.

Tvrtko Ursulin (17):
drm/i915: Extract intel_get_cagf
drm/i915/pmu: Expose a PMU interface for perf queries
drm/i915/pmu: Suspend sampling when GPU is idle
drm/i915: Wrap context schedule notification
drm/i915: Engine busy time tracking
drm/i915/pmu: Wire up engine busy stats to PMU
drm/i915/pmu: Add interrupt count metric
drm/i915: Convert intel_rc6_residency_us to ns
drm/i915/pmu: Add RC6 residency metrics
drm/i915: Keep a count of requests waiting for a slot on GPU
drm/i915/pmu: Add queued counter
drm/i915: Track per-context engine busyness
drm/i915: Allow clients to query own per-engine busyness
drm/i915: Expose list of clients in sysfs
drm/i915: Update client name on context create
drm/i915: Expose per-engine client busyness
drm/i915: Add sysfs toggle to enable per-client engine stats

drivers/gpu/drm/i915/Makefile | 1 +
drivers/gpu/drm/i915/i915_debugfs.c | 9 +-
drivers/gpu/drm/i915/i915_drv.c | 3 +
drivers/gpu/drm/i915/i915_drv.h | 39 +-
drivers/gpu/drm/i915/i915_gem.c | 178 ++++++-
drivers/gpu/drm/i915/i915_gem_context.c | 49 +-
drivers/gpu/drm/i915/i915_gem_context.h | 5 +
drivers/gpu/drm/i915/i915_gem_request.c | 6 +
drivers/gpu/drm/i915/i915_pmu.c | 904 ++++++++++++++++++++++++++++++++
drivers/gpu/drm/i915/i915_pmu.h | 112 ++++
drivers/gpu/drm/i915/i915_reg.h | 3 +
drivers/gpu/drm/i915/i915_sysfs.c | 99 +++-
drivers/gpu/drm/i915/intel_engine_cs.c | 128 ++++-
drivers/gpu/drm/i915/intel_lrc.c | 25 +-
drivers/gpu/drm/i915/intel_pm.c | 41 +-
drivers/gpu/drm/i915/intel_ringbuffer.h | 167 ++++++
include/uapi/drm/i915_drm.h | 69 ++-
17 files changed, 1788 insertions(+), 50 deletions(-)
create mode 100644 drivers/gpu/drm/i915/i915_pmu.c
create mode 100644 drivers/gpu/drm/i915/i915_pmu.h