const char *name);
 void i915_timeline_fini(struct i915_timeline *tl);
 
+static inline void
+i915_timeline_set_subclass(struct i915_timeline *timeline,
+                          unsigned int subclass)
+{
+       lockdep_set_subclass(&timeline->lock, subclass);
+
+       /*
+        * Due to an interesting quirk in lockdep's internal debug tracking,
+        * after setting a subclass we must ensure the lock is used. Otherwise,
+        * nr_unused_locks is incremented once too often.
+        */
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+       local_irq_disable();
+       lock_map_acquire(&timeline->lock.dep_map);
+       lock_map_release(&timeline->lock.dep_map);
+       local_irq_enable();
+#endif
+}
+
 struct i915_timeline *
 i915_timeline_create(struct drm_i915_private *i915, const char *name);
 
 
 void intel_engine_setup_common(struct intel_engine_cs *engine)
 {
        i915_timeline_init(engine->i915, &engine->timeline, engine->name);
-       lockdep_set_subclass(&engine->timeline.lock, TIMELINE_ENGINE);
+       i915_timeline_set_subclass(&engine->timeline, TIMELINE_ENGINE);
 
        intel_engine_init_execlist(engine);
        intel_engine_init_hangcheck(engine);
 
        engine->base.submit_request = mock_submit_request;
 
        i915_timeline_init(i915, &engine->base.timeline, engine->base.name);
-       lockdep_set_subclass(&engine->base.timeline.lock, TIMELINE_ENGINE);
+       i915_timeline_set_subclass(&engine->base.timeline, TIMELINE_ENGINE);
 
        intel_engine_init_breadcrumbs(&engine->base);
        engine->base.breadcrumbs.mock = true; /* prevent touching HW for irqs */