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 <ch...@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_active.c |  8 ++++++--
 drivers/gpu/drm/i915/i915_active.h | 10 +++++++---
 2 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_active.c 
b/drivers/gpu/drm/i915/i915_active.c
index 479195ecbc6c..e60e44986c9d 100644
--- a/drivers/gpu/drm/i915/i915_active.c
+++ b/drivers/gpu/drm/i915/i915_active.c
@@ -277,7 +277,8 @@ active_instance(struct i915_active *ref, struct 
intel_timeline *tl)
 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)
+                       struct lock_class_key *mkey,
+                       struct lock_class_key *wkey)
 {
        unsigned long bits;
 
@@ -295,9 +296,12 @@ void __i915_active_init(struct i915_active *ref,
 
        init_llist_head(&ref->preallocated_barriers);
        atomic_set(&ref->count, 0);
-       __mutex_init(&ref->mutex, "i915_active", key);
+       __mutex_init(&ref->mutex, "i915_active", mkey);
        __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", wkey, 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..b571f675c795 100644
--- a/drivers/gpu/drm/i915/i915_active.h
+++ b/drivers/gpu/drm/i915/i915_active.h
@@ -152,11 +152,15 @@ i915_active_fence_isset(const struct i915_active_fence 
*active)
 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);
+                       struct lock_class_key *mkey,
+                       struct lock_class_key *wkey);
+
+/* 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;                             \
+       static struct lock_class_key __mkey;                            \
+       static struct lock_class_key __wkey;                            \
                                                                        \
-       __i915_active_init(ref, active, retire, &__key);                \
+       __i915_active_init(ref, active, retire, &__mkey, &__wkey);      \
 } while (0)
 
 int i915_active_ref(struct i915_active *ref,
-- 
2.24.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to