On 07-07-2023 18:32, Tvrtko Ursulin wrote: > From: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> > > Account ring buffers and logical context space against the owning client > memory usage stats. > > Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> > --- > drivers/gpu/drm/i915/gt/intel_context.c | 13 +++++++++++++ > drivers/gpu/drm/i915/i915_drm_client.c | 10 ++++++++++ > drivers/gpu/drm/i915/i915_drm_client.h | 8 ++++++++ > 3 files changed, 31 insertions(+) > > diff --git a/drivers/gpu/drm/i915/gt/intel_context.c b/drivers/gpu/drm/i915/gt/intel_context.c > index a53b26178f0a..8a395b9201e9 100644 > --- a/drivers/gpu/drm/i915/gt/intel_context.c > +++ b/drivers/gpu/drm/i915/gt/intel_context.c > @@ -6,6 +6,7 @@ > #include "gem/i915_gem_context.h" > #include "gem/i915_gem_pm.h" > > +#include "i915_drm_client.h" > #include "i915_drv.h" > #include "i915_trace.h" > > @@ -50,6 +51,7 @@ intel_context_create(struct intel_engine_cs *engine) > > int intel_context_alloc_state(struct intel_context *ce) > { > + struct i915_gem_context *ctx; > int err = 0; > > if (mutex_lock_interruptible(&ce->pin_mutex)) > @@ -66,6 +68,17 @@ int intel_context_alloc_state(struct intel_context *ce) > goto unlock; > > set_bit(CONTEXT_ALLOC_BIT, &ce->flags); > + > + rcu_read_lock(); > + ctx = rcu_dereference(ce->gem_context); > + if (ctx && !kref_get_unless_zero(&ctx->ref)) > + ctx = NULL; > + rcu_read_unlock(); > + if (ctx) { > + if (ctx->client) > + i915_drm_client_add_context(ctx->client, ce); > + i915_gem_context_put(ctx); > + } > } > > unlock: > diff --git a/drivers/gpu/drm/i915/i915_drm_client.c b/drivers/gpu/drm/i915/i915_drm_client.c > index 2e5e69edc0f9..ffccb6239789 100644 > --- a/drivers/gpu/drm/i915/i915_drm_client.c > +++ b/drivers/gpu/drm/i915/i915_drm_client.c > @@ -144,4 +144,14 @@ bool i915_drm_client_remove_object(struct drm_i915_gem_object *obj) > > return true; > } > + > +void i915_drm_client_add_context(struct i915_drm_client *client, > + struct intel_context *ce) do you think we can rename to i915_drm_client_add_context_objects? > +{ > + if (ce->state) > + i915_drm_client_add_object(client, ce->state->obj); > + > + if (ce->ring != ce->engine->legacy.ring && ce->ring->vma) > + i915_drm_client_add_object(client, ce->ring->vma->obj); > +} > #endif > diff --git a/drivers/gpu/drm/i915/i915_drm_client.h b/drivers/gpu/drm/i915/i915_drm_client.h > index 5f58fdf7dcb8..39616b10a51f 100644 > --- a/drivers/gpu/drm/i915/i915_drm_client.h > +++ b/drivers/gpu/drm/i915/i915_drm_client.h > @@ -14,6 +14,7 @@ > > #include "i915_file_private.h" > #include "gem/i915_gem_object_types.h" > +#include "gt/intel_context_types.h" > > #define I915_LAST_UABI_ENGINE_CLASS I915_ENGINE_CLASS_COMPUTE > > @@ -70,6 +71,8 @@ void i915_drm_client_fdinfo(struct drm_printer *p, struct drm_file *file); > void i915_drm_client_add_object(struct i915_drm_client *client, > struct drm_i915_gem_object *obj); > bool i915_drm_client_remove_object(struct drm_i915_gem_object *obj); > +void i915_drm_client_add_context(struct i915_drm_client *client, > + struct intel_context *ce); > #else > static inline void i915_drm_client_add_object(struct i915_drm_client *client, > struct drm_i915_gem_object *obj) > @@ -79,6 +82,11 @@ static inline void i915_drm_client_add_object(struct i915_drm_client *client, > static inline bool i915_drm_client_remove_object(struct drm_i915_gem_object *obj) > { > } > + > +static inline void i915_drm_client_add_context(struct i915_drm_client *client, > + struct intel_context *ce) > +{ > +} > #endif > > #endif /* !__I915_DRM_CLIENT_H__ */ Reviewed-by: Aravind Iddamsetty <aravind.iddamsetty@xxxxxxxxx> Thanks, Aravind.