Message ID | 20230707130220.3966836-5-tvrtko.ursulin@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | fdinfo memory stats | expand |
On 07-07-2023 18:32, Tvrtko Ursulin wrote: > From: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > > Account ring buffers and logical context space against the owning client > memory usage stats. > > Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > --- > 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@intel.com> Thanks, Aravind.
On 11/07/2023 10:29, Iddamsetty, Aravind wrote: > > > On 07-07-2023 18:32, Tvrtko Ursulin wrote: >> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com> >> >> Account ring buffers and logical context space against the owning client >> memory usage stats. >> >> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> >> --- >> 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? I like it, will do, thanks! Regards, Tvrtko > >> +{ >> + 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@intel.com> > > Thanks, > Aravind.
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) +{ + 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__ */