>-----Original Message----- >From: Intel-gfx <intel-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of Chris >Wilson >Sent: Friday, March 27, 2020 7:22 AM >To: intel-gfx@xxxxxxxxxxxxxxxxxxxxx >Subject: [PATCH 2/3] drm/i915: Wrap i915_active in a simple >kreffed struct > >For conveniences of callers that just want to use an i915_active to >track a wide array of concurrent timelines, wrap the base i915_active >struct inside a kref. This i915_active will self-destruct after use. > >Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> >Cc: Mika Kuoppala <mika.kuoppala@xxxxxxxxxxxxxxx> >Reviewed-by: Mika Kuoppala <mika.kuoppala@xxxxxxxxxxxxxxx> >--- > drivers/gpu/drm/i915/i915_active.c | 53 >++++++++++++++++++++++++++++++ > drivers/gpu/drm/i915/i915_active.h | 4 +++ > 2 files changed, 57 insertions(+) > >diff --git a/drivers/gpu/drm/i915/i915_active.c >b/drivers/gpu/drm/i915/i915_active.c >index 7b685032cc1e..5df7704369fd 100644 >--- a/drivers/gpu/drm/i915/i915_active.c >+++ b/drivers/gpu/drm/i915/i915_active.c >@@ -939,6 +939,59 @@ void i915_active_noop(struct dma_fence *fence, >struct dma_fence_cb *cb) > active_fence_cb(fence, cb); > } > >+struct auto_active { >+ struct i915_active base; >+ struct kref ref; >+}; >+ >+struct i915_active *i915_active_get(struct i915_active *ref) >+{ >+ struct auto_active *aa = container_of(ref, typeof(*aa), base); >+ >+ kref_get(&aa->ref); Should this be kref_get_unless_zero()? Mike >+ return &aa->base; >+} >+ >+static void auto_release(struct kref *ref) >+{ >+ struct auto_active *aa = container_of(ref, typeof(*aa), ref); >+ >+ i915_active_fini(&aa->base); >+ kfree(aa); >+} >+ >+void i915_active_put(struct i915_active *ref) >+{ >+ struct auto_active *aa = container_of(ref, typeof(*aa), base); >+ >+ kref_put(&aa->ref, auto_release); >+} >+ >+static int auto_active(struct i915_active *ref) >+{ >+ i915_active_get(ref); >+ return 0; >+} >+ >+static void auto_retire(struct i915_active *ref) >+{ >+ i915_active_put(ref); >+} >+ >+struct i915_active *i915_active_create(void) >+{ >+ struct auto_active *aa; >+ >+ aa = kmalloc(sizeof(*aa), GFP_KERNEL); >+ if (!aa) >+ return NULL; >+ >+ kref_init(&aa->ref); >+ i915_active_init(&aa->base, auto_active, auto_retire); >+ >+ return &aa->base; >+} >+ > #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) > #include "selftests/i915_active.c" > #endif >diff --git a/drivers/gpu/drm/i915/i915_active.h >b/drivers/gpu/drm/i915/i915_active.h >index 4f9aa7bab514..b526d310a585 100644 >--- a/drivers/gpu/drm/i915/i915_active.h >+++ b/drivers/gpu/drm/i915/i915_active.h >@@ -225,4 +225,8 @@ void i915_request_add_active_barriers(struct >i915_request *rq); > void i915_active_print(struct i915_active *ref, struct drm_printer *m); > void i915_active_unlock_wait(struct i915_active *ref); > >+struct i915_active *i915_active_create(void); >+struct i915_active *i915_active_get(struct i915_active *ref); >+void i915_active_put(struct i915_active *ref); >+ > #endif /* _I915_ACTIVE_H_ */ >-- >2.20.1 > >_______________________________________________ >Intel-gfx mailing list >Intel-gfx@xxxxxxxxxxxxxxxxxxxxx >https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx