Skip to content

Commit

Permalink
drm/i915: Wrap i915_active in a simple kreffed struct
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Chris Wilson committed Mar 30, 2020
1 parent d75a92a commit 229007e
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 0 deletions.
53 changes: 53 additions & 0 deletions drivers/gpu/drm/i915/i915_active.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions drivers/gpu/drm/i915/i915_active.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_ */

0 comments on commit 229007e

Please sign in to comment.