mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 06:31:49 +00:00
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@chris-wilson.co.uk> Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200327112212.16046-2-chris@chris-wilson.co.uk
This commit is contained in:
parent
d75a92a814
commit
229007e02d
@ -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);
|
||||
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
|
||||
|
@ -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_ */
|
||||
|
Loading…
Reference in New Issue
Block a user