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;
 
 
        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,
 
 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,