Skip to content

Commit

Permalink
drm/i915: Track runtime spent in closed and unreachable GEM contexts
Browse files Browse the repository at this point in the history
As contexts are abandoned we want to remember how much GPU time they used
(per class) so later we can used it for smarter purposes.

As GEM contexts are closed we want to have the DRM client remember how
much GPU time they used (per class) so later we can used it for smarter
purposes.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Aravind Iddamsetty <aravind.iddamsetty@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20210123153733.18139-5-chris@chris-wilson.co.uk
Link: https://patchwork.freedesktop.org/patch/msgid/20210124153136.19124-5-chris@chris-wilson.co.uk
  • Loading branch information
Tvrtko Ursulin authored and Chris Wilson committed Jan 24, 2021
1 parent d8b049b commit b6b77d7
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 2 deletions.
24 changes: 22 additions & 2 deletions drivers/gpu/drm/i915/gem/i915_gem_context.c
Original file line number Diff line number Diff line change
Expand Up @@ -260,23 +260,43 @@ static void free_engines_rcu(struct rcu_head *rcu)
free_engines(engines);
}

static void accumulate_runtime(struct i915_drm_client *client,
struct i915_gem_engines *engines)
{
struct i915_gem_engines_iter it;
struct intel_context *ce;

if (!client)
return;

/* Transfer accumulated runtime to the parent GEM context. */
for_each_gem_engine(ce, engines, it) {
unsigned int class = ce->engine->uabi_class;

GEM_BUG_ON(class >= ARRAY_SIZE(client->past_runtime));
atomic64_add(intel_context_get_total_runtime_ns(ce),
&client->past_runtime[class]);
}
}

static int __i915_sw_fence_call
engines_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state)
{
struct i915_gem_engines *engines =
container_of(fence, typeof(*engines), fence);
struct i915_gem_context *ctx = engines->ctx;

switch (state) {
case FENCE_COMPLETE:
if (!list_empty(&engines->link)) {
struct i915_gem_context *ctx = engines->ctx;
unsigned long flags;

spin_lock_irqsave(&ctx->stale.lock, flags);
list_del(&engines->link);
spin_unlock_irqrestore(&ctx->stale.lock, flags);
}
i915_gem_context_put(engines->ctx);
accumulate_runtime(ctx->client, engines);
i915_gem_context_put(ctx);
break;

case FENCE_FREE:
Expand Down
7 changes: 7 additions & 0 deletions drivers/gpu/drm/i915/i915_drm_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
#include <linux/sched.h>
#include <linux/xarray.h>

#include "gt/intel_engine_types.h"

struct drm_i915_private;

struct i915_drm_clients {
Expand Down Expand Up @@ -51,6 +53,11 @@ struct i915_drm_client {
struct device_attribute pid;
struct device_attribute name;
} attr;

/**
* @past_runtime: Accumulation of pphwsp runtimes from closed contexts.
*/
atomic64_t past_runtime[MAX_ENGINE_CLASS + 1];
};

void i915_drm_clients_init(struct i915_drm_clients *clients,
Expand Down

0 comments on commit b6b77d7

Please sign in to comment.