Skip to content

Commit e130d15

Browse files
jkrzyszt-inteljfvogel
authored andcommitted
drm/i915/huc: Fix fence not released on early probe errors
[ Upstream commit e3ea2eae70692a455e256787e4f54153fb739b90 ] HuC delayed loading fence, introduced with commit 27536e0 ("drm/i915/huc: track delayed HuC load with a fence"), is registered with object tracker early on driver probe but unregistered only from driver remove, which is not called on early probe errors. Since its memory is allocated under devres, then released anyway, it may happen to be allocated again to the fence and reused on future driver probes, resulting in kernel warnings that taint the kernel: <4> [309.731371] ------------[ cut here ]------------ <3> [309.731373] ODEBUG: init destroyed (active state 0) object: ffff88813d7dd2e0 object type: i915_sw_fence hint: sw_fence_dummy_notify+0x0/0x20 [i915] <4> [309.731575] WARNING: CPU: 2 PID: 3161 at lib/debugobjects.c:612 debug_print_object+0x93/0xf0 ... <4> [309.731693] CPU: 2 UID: 0 PID: 3161 Comm: i915_module_loa Tainted: G U 6.14.0-CI_DRM_16362-gf0fd77956987+ #1 ... <4> [309.731700] RIP: 0010:debug_print_object+0x93/0xf0 ... <4> [309.731728] Call Trace: <4> [309.731730] <TASK> ... <4> [309.731949] __debug_object_init+0x17b/0x1c0 <4> [309.731957] debug_object_init+0x34/0x50 <4> [309.732126] __i915_sw_fence_init+0x34/0x60 [i915] <4> [309.732256] intel_huc_init_early+0x4b/0x1d0 [i915] <4> [309.732468] intel_uc_init_early+0x61/0x680 [i915] <4> [309.732667] intel_gt_common_init_early+0x105/0x130 [i915] <4> [309.732804] intel_root_gt_init_early+0x63/0x80 [i915] <4> [309.732938] i915_driver_probe+0x1fa/0xeb0 [i915] <4> [309.733075] i915_pci_probe+0xe6/0x220 [i915] <4> [309.733198] local_pci_probe+0x44/0xb0 <4> [309.733203] pci_device_probe+0xf4/0x270 <4> [309.733209] really_probe+0xee/0x3c0 <4> [309.733215] __driver_probe_device+0x8c/0x180 <4> [309.733219] driver_probe_device+0x24/0xd0 <4> [309.733223] __driver_attach+0x10f/0x220 <4> [309.733230] bus_for_each_dev+0x7d/0xe0 <4> [309.733236] driver_attach+0x1e/0x30 <4> [309.733239] bus_add_driver+0x151/0x290 <4> [309.733244] driver_register+0x5e/0x130 <4> [309.733247] __pci_register_driver+0x7d/0x90 <4> [309.733251] i915_pci_register_driver+0x23/0x30 [i915] <4> [309.733413] i915_init+0x34/0x120 [i915] <4> [309.733655] do_one_initcall+0x62/0x3f0 <4> [309.733667] do_init_module+0x97/0x2a0 <4> [309.733671] load_module+0x25ff/0x2890 <4> [309.733688] init_module_from_file+0x97/0xe0 <4> [309.733701] idempotent_init_module+0x118/0x330 <4> [309.733711] __x64_sys_finit_module+0x77/0x100 <4> [309.733715] x64_sys_call+0x1f37/0x2650 <4> [309.733719] do_syscall_64+0x91/0x180 <4> [309.733763] entry_SYSCALL_64_after_hwframe+0x76/0x7e <4> [309.733792] </TASK> ... <4> [309.733806] ---[ end trace 0000000000000000 ]--- That scenario is most easily reproducible with igt@i915_module_load@reload-with-fault-injection. Fix the issue by moving the cleanup step to driver release path. Fixes: 27536e0 ("drm/i915/huc: track delayed HuC load with a fence") Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13592 Cc: Daniele Ceraolo Spurio <[email protected]> Cc: Alan Previn <[email protected]> Signed-off-by: Janusz Krzysztofik <[email protected]> Reviewed-by: Daniele Ceraolo Spurio <[email protected]> Reviewed-by: Krzysztof Karas <[email protected]> Signed-off-by: Daniele Ceraolo Spurio <[email protected]> Link: https://lore.kernel.org/r/[email protected] (cherry picked from commit 795dbde92fe5c6996a02a5b579481de73035e7bf) Signed-off-by: Jani Nikula <[email protected]> Signed-off-by: Sasha Levin <[email protected]> (cherry picked from commit c5a906806162aea62dbe5d327760ce3b7117ca17) Signed-off-by: Jack Vogel <[email protected]>
1 parent 991ace0 commit e130d15

File tree

3 files changed

+7
-6
lines changed

3 files changed

+7
-6
lines changed

drivers/gpu/drm/i915/gt/uc/intel_huc.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,11 @@ void intel_huc_init_early(struct intel_huc *huc)
317317
}
318318
}
319319

320+
void intel_huc_fini_late(struct intel_huc *huc)
321+
{
322+
delayed_huc_load_fini(huc);
323+
}
324+
320325
#define HUC_LOAD_MODE_STRING(x) (x ? "GSC" : "legacy")
321326
static int check_huc_loading_mode(struct intel_huc *huc)
322327
{
@@ -414,12 +419,6 @@ int intel_huc_init(struct intel_huc *huc)
414419

415420
void intel_huc_fini(struct intel_huc *huc)
416421
{
417-
/*
418-
* the fence is initialized in init_early, so we need to clean it up
419-
* even if HuC loading is off.
420-
*/
421-
delayed_huc_load_fini(huc);
422-
423422
if (huc->heci_pkt)
424423
i915_vma_unpin_and_release(&huc->heci_pkt, 0);
425424

drivers/gpu/drm/i915/gt/uc/intel_huc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ struct intel_huc {
5555

5656
int intel_huc_sanitize(struct intel_huc *huc);
5757
void intel_huc_init_early(struct intel_huc *huc);
58+
void intel_huc_fini_late(struct intel_huc *huc);
5859
int intel_huc_init(struct intel_huc *huc);
5960
void intel_huc_fini(struct intel_huc *huc);
6061
void intel_huc_suspend(struct intel_huc *huc);

drivers/gpu/drm/i915/gt/uc/intel_uc.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ void intel_uc_init_late(struct intel_uc *uc)
136136

137137
void intel_uc_driver_late_release(struct intel_uc *uc)
138138
{
139+
intel_huc_fini_late(&uc->huc);
139140
}
140141

141142
/**

0 commit comments

Comments
 (0)