Message ID | 20200318121138.909-7-tvrtko.ursulin@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Per client engine busyness | expand |
Quoting Tvrtko Ursulin (2020-03-18 12:11:35) > From: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > > 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> > --- > drivers/gpu/drm/i915/gem/i915_gem_context.c | 12 +++++++++++- > drivers/gpu/drm/i915/i915_drm_client.h | 7 +++++++ > 2 files changed, 18 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c > index 5edf79ed6247..912375fb8a3b 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c > @@ -355,8 +355,18 @@ static void i915_gem_context_free(struct i915_gem_context *ctx) > > GEM_BUG_ON(!i915_gem_context_is_closed(ctx)); > > - if (client) > + if (client) { > + unsigned int i; > + > + /* Transfer accumulated runtime to the parent drm client. */ > + BUILD_BUG_ON(ARRAY_SIZE(client->past_runtime) != > + ARRAY_SIZE(ctx->past_runtime)); > + for (i = 0; i < ARRAY_SIZE(client->past_runtime); i++) > + atomic64_add(atomic64_read(&ctx->past_runtime[i]), > + &client->past_runtime[i]); > + > i915_drm_client_put(client); > + } Ok, order looks good. -Chris
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c index 5edf79ed6247..912375fb8a3b 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c @@ -355,8 +355,18 @@ static void i915_gem_context_free(struct i915_gem_context *ctx) GEM_BUG_ON(!i915_gem_context_is_closed(ctx)); - if (client) + if (client) { + unsigned int i; + + /* Transfer accumulated runtime to the parent drm client. */ + BUILD_BUG_ON(ARRAY_SIZE(client->past_runtime) != + ARRAY_SIZE(ctx->past_runtime)); + for (i = 0; i < ARRAY_SIZE(client->past_runtime); i++) + atomic64_add(atomic64_read(&ctx->past_runtime[i]), + &client->past_runtime[i]); + i915_drm_client_put(client); + } spin_lock(&ctx->i915->gem.contexts.lock); list_del(&ctx->link); diff --git a/drivers/gpu/drm/i915/i915_drm_client.h b/drivers/gpu/drm/i915/i915_drm_client.h index 11b48383881d..29b116606596 100644 --- a/drivers/gpu/drm/i915/i915_drm_client.h +++ b/drivers/gpu/drm/i915/i915_drm_client.h @@ -15,6 +15,8 @@ #include <linux/sched.h> #include <linux/xarray.h> +#include "gt/intel_engine_types.h" + struct i915_drm_clients { struct xarray xarray; u32 next_id; @@ -41,6 +43,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);