forked from Minki/linux
drm/i915: Give each sw_fence its own lockclass
Localise the static struct lock_class_key to the caller of i915_sw_fence_init() so that we create a lock_class instance for each unique sw_fence rather than all sw_fences sharing the same lock_class. This eliminate some lockdep false positive when using fences from within fence callbacks. For the relatively small number of fences currently in use [2], this adds 160 bytes of unused text/code when lockdep is disabled. This seems quite high, but fully reducing it via ifdeffery is also quite ugly. Removing the #fence strings saves 72 bytes with just a single #ifdef. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20161114204105.29171-1-chris@chris-wilson.co.uk
This commit is contained in:
parent
e3c566dfe4
commit
556b748710
@ -116,11 +116,14 @@ static void i915_sw_fence_await(struct i915_sw_fence *fence)
|
|||||||
WARN_ON(atomic_inc_return(&fence->pending) <= 1);
|
WARN_ON(atomic_inc_return(&fence->pending) <= 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void i915_sw_fence_init(struct i915_sw_fence *fence, i915_sw_fence_notify_t fn)
|
void __i915_sw_fence_init(struct i915_sw_fence *fence,
|
||||||
|
i915_sw_fence_notify_t fn,
|
||||||
|
const char *name,
|
||||||
|
struct lock_class_key *key)
|
||||||
{
|
{
|
||||||
BUG_ON((unsigned long)fn & ~I915_SW_FENCE_MASK);
|
BUG_ON((unsigned long)fn & ~I915_SW_FENCE_MASK);
|
||||||
|
|
||||||
init_waitqueue_head(&fence->wait);
|
__init_waitqueue_head(&fence->wait, name, key);
|
||||||
kref_init(&fence->kref);
|
kref_init(&fence->kref);
|
||||||
atomic_set(&fence->pending, 1);
|
atomic_set(&fence->pending, 1);
|
||||||
fence->flags = (unsigned long)fn;
|
fence->flags = (unsigned long)fn;
|
||||||
|
@ -40,7 +40,22 @@ typedef int (*i915_sw_fence_notify_t)(struct i915_sw_fence *,
|
|||||||
enum i915_sw_fence_notify state);
|
enum i915_sw_fence_notify state);
|
||||||
#define __i915_sw_fence_call __aligned(4)
|
#define __i915_sw_fence_call __aligned(4)
|
||||||
|
|
||||||
void i915_sw_fence_init(struct i915_sw_fence *fence, i915_sw_fence_notify_t fn);
|
void __i915_sw_fence_init(struct i915_sw_fence *fence,
|
||||||
|
i915_sw_fence_notify_t fn,
|
||||||
|
const char *name,
|
||||||
|
struct lock_class_key *key);
|
||||||
|
#ifdef CONFIG_LOCKDEP
|
||||||
|
#define i915_sw_fence_init(fence, fn) \
|
||||||
|
do { \
|
||||||
|
static struct lock_class_key __key; \
|
||||||
|
\
|
||||||
|
__i915_sw_fence_init((fence), (fn), #fence, &__key); \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
#define i915_sw_fence_init(fence, fn) \
|
||||||
|
__i915_sw_fence_init((fence), (fn), NULL, NULL)
|
||||||
|
#endif
|
||||||
|
|
||||||
void i915_sw_fence_commit(struct i915_sw_fence *fence);
|
void i915_sw_fence_commit(struct i915_sw_fence *fence);
|
||||||
|
|
||||||
int i915_sw_fence_await_sw_fence(struct i915_sw_fence *fence,
|
int i915_sw_fence_await_sw_fence(struct i915_sw_fence *fence,
|
||||||
|
Loading…
Reference in New Issue
Block a user