diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2018-11-15 15:38:51 -0500 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2018-11-16 03:38:21 -0500 |
commit | f911e7234f83efe4842a453406e90ceac3cabd8e (patch) | |
tree | 47164b79f7a9e8bd901342a500c4ac231811fca7 | |
parent | 56d4eac0a1eba31f8c2ff1051388f6cc3a730999 (diff) |
drm/i915/selftests: Workaround an issue with unused lockdep subclass
lockdep insists that if we give a lock a subclass, it must be used.
Failure to do so triggers a self-consistency check when reading
lockdep_stats:
[ 49.902002] DEBUG_LOCKS_WARN_ON(debug_atomic_read(nr_unused_locks) != nr_unused)
[ 49.902009] WARNING: CPU: 3 PID: 383 at kernel/locking/lockdep_proc.c:249 lockdep_stats_show+0x984/0xa10
[ 49.902026] Modules linked in: nls_ascii nls_cp437 vfat fat crct10dif_pclmul crc32_pclmul crc32c_intel aesni_intel aes_x86_64 crypto_simd cryptd glue_helper intel_cstate intel_uncore intel_rapl_perf intel_gtt efivars prime_numbers ahci libahci i2c_i801 video button efivarfs [last unloaded: drm_kms_helper]
[ 49.902059] CPU: 3 PID: 383 Comm: cat Tainted: G U 4.20.0-rc2+ #304
[ 49.902068] Hardware name: Intel Corporation NUC7i5BNK/NUC7i5BNB, BIOS BNKBL357.86A.0052.2017.0918.1346 09/18/2017
[ 49.902079] RIP: 0010:lockdep_stats_show+0x984/0xa10
[ 49.902086] Code: 00 85 c0 0f 84 aa f8 ff ff 8b 05 77 37 e2 00 85 c0 0f 85 9c f8 ff ff 48 c7 c6 e0 57 bc 81 48 c7 c7 28 30 bb 81 e8 6b 77 fa ff <0f> 0b e9 82 f8 ff ff 48 c7 44 24 50 00 00 00 00 45 31 e4 31 db 31
[ 49.902103] RSP: 0018:ffffc90000247d58 EFLAGS: 00010292
[ 49.902110] RAX: 0000000000000044 RBX: 00000000000002f0 RCX: 0000000000000000
[ 49.902118] RDX: 0000000000000002 RSI: 0000000000000001 RDI: ffffffff810b3464
[ 49.902126] RBP: 0000000000000039 R08: 0000000000000002 R09: 0000000000000000
[ 49.902133] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000007ead
[ 49.902141] R13: 0000000000000001 R14: ffff88884c021000 R15: 0000000000000097
[ 49.902150] FS: 00007fb347e66540(0000) GS:ffff88885e600000(0000) knlGS:0000000000000000
[ 49.902159] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 49.902165] CR2: 00007fb347aeb000 CR3: 00000008544bd005 CR4: 00000000001606e0
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: MichaĆ Winiarski <michal.winiarski@intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181115203851.25739-1-chris@chris-wilson.co.uk
-rw-r--r-- | drivers/gpu/drm/i915/i915_timeline.h | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_engine_cs.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/selftests/mock_engine.c | 2 |
3 files changed, 21 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_timeline.h b/drivers/gpu/drm/i915/i915_timeline.h index a2c2c3ab5fb0..ebd71b487220 100644 --- a/drivers/gpu/drm/i915/i915_timeline.h +++ b/drivers/gpu/drm/i915/i915_timeline.h | |||
@@ -83,6 +83,25 @@ void i915_timeline_init(struct drm_i915_private *i915, | |||
83 | const char *name); | 83 | const char *name); |
84 | void i915_timeline_fini(struct i915_timeline *tl); | 84 | void i915_timeline_fini(struct i915_timeline *tl); |
85 | 85 | ||
86 | static inline void | ||
87 | i915_timeline_set_subclass(struct i915_timeline *timeline, | ||
88 | unsigned int subclass) | ||
89 | { | ||
90 | lockdep_set_subclass(&timeline->lock, subclass); | ||
91 | |||
92 | /* | ||
93 | * Due to an interesting quirk in lockdep's internal debug tracking, | ||
94 | * after setting a subclass we must ensure the lock is used. Otherwise, | ||
95 | * nr_unused_locks is incremented once too often. | ||
96 | */ | ||
97 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
98 | local_irq_disable(); | ||
99 | lock_map_acquire(&timeline->lock.dep_map); | ||
100 | lock_map_release(&timeline->lock.dep_map); | ||
101 | local_irq_enable(); | ||
102 | #endif | ||
103 | } | ||
104 | |||
86 | struct i915_timeline * | 105 | struct i915_timeline * |
87 | i915_timeline_create(struct drm_i915_private *i915, const char *name); | 106 | i915_timeline_create(struct drm_i915_private *i915, const char *name); |
88 | 107 | ||
diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c index bc147d9e6c92..885a901b6e13 100644 --- a/drivers/gpu/drm/i915/intel_engine_cs.c +++ b/drivers/gpu/drm/i915/intel_engine_cs.c | |||
@@ -485,7 +485,7 @@ static void intel_engine_init_execlist(struct intel_engine_cs *engine) | |||
485 | void intel_engine_setup_common(struct intel_engine_cs *engine) | 485 | void intel_engine_setup_common(struct intel_engine_cs *engine) |
486 | { | 486 | { |
487 | i915_timeline_init(engine->i915, &engine->timeline, engine->name); | 487 | i915_timeline_init(engine->i915, &engine->timeline, engine->name); |
488 | lockdep_set_subclass(&engine->timeline.lock, TIMELINE_ENGINE); | 488 | i915_timeline_set_subclass(&engine->timeline, TIMELINE_ENGINE); |
489 | 489 | ||
490 | intel_engine_init_execlist(engine); | 490 | intel_engine_init_execlist(engine); |
491 | intel_engine_init_hangcheck(engine); | 491 | intel_engine_init_hangcheck(engine); |
diff --git a/drivers/gpu/drm/i915/selftests/mock_engine.c b/drivers/gpu/drm/i915/selftests/mock_engine.c index 22a73da45ad5..d0c44c18db42 100644 --- a/drivers/gpu/drm/i915/selftests/mock_engine.c +++ b/drivers/gpu/drm/i915/selftests/mock_engine.c | |||
@@ -200,7 +200,7 @@ struct intel_engine_cs *mock_engine(struct drm_i915_private *i915, | |||
200 | engine->base.submit_request = mock_submit_request; | 200 | engine->base.submit_request = mock_submit_request; |
201 | 201 | ||
202 | i915_timeline_init(i915, &engine->base.timeline, engine->base.name); | 202 | i915_timeline_init(i915, &engine->base.timeline, engine->base.name); |
203 | lockdep_set_subclass(&engine->base.timeline.lock, TIMELINE_ENGINE); | 203 | i915_timeline_set_subclass(&engine->base.timeline, TIMELINE_ENGINE); |
204 | 204 | ||
205 | intel_engine_init_breadcrumbs(&engine->base); | 205 | intel_engine_init_breadcrumbs(&engine->base); |
206 | engine->base.breadcrumbs.mock = true; /* prevent touching HW for irqs */ | 206 | engine->base.breadcrumbs.mock = true; /* prevent touching HW for irqs */ |