[1/2] drm/i915: Specialise i915_active.work lock classes
diff mbox series

Message ID 20191202163334.2628526-1-chris@chris-wilson.co.uk
State New
Headers show
Series
  • [1/2] drm/i915: Specialise i915_active.work lock classes
Related show

Commit Message

Chris Wilson Dec. 2, 2019, 4:33 p.m. UTC
Similar to for i915_active.mutex, we require each class of i915_active
to have distinct lockdep chains as some, but by no means all,
i915_active are used within the shrinker and so have much more severe
usage constraints. By using a lockclass local to i915_active_init() all
i915_active workers have the same lock class, and we may generate false
positives when waiting for the i915_active. If we push the lockclass
into the caller, each class of i915_active will have distinct lockdep
chains.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_active.c | 3 +++
 drivers/gpu/drm/i915/i915_active.h | 2 ++
 2 files changed, 5 insertions(+)

Patch
diff mbox series

diff --git a/drivers/gpu/drm/i915/i915_active.c b/drivers/gpu/drm/i915/i915_active.c
index 479195ecbc6c..7553acc5aa16 100644
--- a/drivers/gpu/drm/i915/i915_active.c
+++ b/drivers/gpu/drm/i915/i915_active.c
@@ -298,6 +298,9 @@  void __i915_active_init(struct i915_active *ref,
 	__mutex_init(&ref->mutex, "i915_active", key);
 	__i915_active_fence_init(&ref->excl, NULL, excl_retire);
 	INIT_WORK(&ref->work, active_work);
+#if IS_ENABLED(CONFIG_LOCKDEP)
+	lockdep_init_map(&ref->work.lockdep_map, "i915_active.work", key, 0);
+#endif
 }
 
 static bool ____active_del_barrier(struct i915_active *ref,
diff --git a/drivers/gpu/drm/i915/i915_active.h b/drivers/gpu/drm/i915/i915_active.h
index 3208cc2e8c1a..6e8633017372 100644
--- a/drivers/gpu/drm/i915/i915_active.h
+++ b/drivers/gpu/drm/i915/i915_active.h
@@ -153,6 +153,8 @@  void __i915_active_init(struct i915_active *ref,
 			int (*active)(struct i915_active *ref),
 			void (*retire)(struct i915_active *ref),
 			struct lock_class_key *key);
+
+/* Specialise each class of i915_active to avoid impossible lockdep cycles. */
 #define i915_active_init(ref, active, retire) do {		\
 	static struct lock_class_key __key;				\
 									\