Skip to content

Commit 4a0559e

Browse files
icklejlahtine-intel
authored andcommitted
drm/i915: Call i915_perf_fini() on init_hw error unwind
We have to cleanup after i915_perf_init(), even on the error path, as it passes a pointer into the module to the sysfs core. If we fail to unregister the sysctl table, we leave a dangling pointer which then may explode anytime later. Fixes: 9f9b279 ("drm/i915/perf: reuse timestamp frequency from device info") Signed-off-by: Chris Wilson <[email protected]> Cc: Lionel Landwerlin <[email protected]> Cc: Matthew Auld <[email protected]> Reviewed-by: Lionel Landwerlin <[email protected]> Reviewed-by: Michal Wajdeczko <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] (cherry picked from commit 9f172f6) Signed-off-by: Joonas Lahtinen <[email protected]>
1 parent a3520b8 commit 4a0559e

File tree

1 file changed

+15
-12
lines changed

1 file changed

+15
-12
lines changed

drivers/gpu/drm/i915/i915_drv.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,30 +1102,32 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
11021102

11031103
ret = i915_ggtt_probe_hw(dev_priv);
11041104
if (ret)
1105-
return ret;
1105+
goto err_perf;
11061106

1107-
/* WARNING: Apparently we must kick fbdev drivers before vgacon,
1108-
* otherwise the vga fbdev driver falls over. */
1107+
/*
1108+
* WARNING: Apparently we must kick fbdev drivers before vgacon,
1109+
* otherwise the vga fbdev driver falls over.
1110+
*/
11091111
ret = i915_kick_out_firmware_fb(dev_priv);
11101112
if (ret) {
11111113
DRM_ERROR("failed to remove conflicting framebuffer drivers\n");
1112-
goto out_ggtt;
1114+
goto err_ggtt;
11131115
}
11141116

11151117
ret = i915_kick_out_vgacon(dev_priv);
11161118
if (ret) {
11171119
DRM_ERROR("failed to remove conflicting VGA console\n");
1118-
goto out_ggtt;
1120+
goto err_ggtt;
11191121
}
11201122

11211123
ret = i915_ggtt_init_hw(dev_priv);
11221124
if (ret)
1123-
return ret;
1125+
goto err_ggtt;
11241126

11251127
ret = i915_ggtt_enable_hw(dev_priv);
11261128
if (ret) {
11271129
DRM_ERROR("failed to enable GGTT\n");
1128-
goto out_ggtt;
1130+
goto err_ggtt;
11291131
}
11301132

11311133
pci_set_master(pdev);
@@ -1136,7 +1138,7 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
11361138
if (ret) {
11371139
DRM_ERROR("failed to set DMA mask\n");
11381140

1139-
goto out_ggtt;
1141+
goto err_ggtt;
11401142
}
11411143
}
11421144

@@ -1154,7 +1156,7 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
11541156
if (ret) {
11551157
DRM_ERROR("failed to set DMA mask\n");
11561158

1157-
goto out_ggtt;
1159+
goto err_ggtt;
11581160
}
11591161
}
11601162

@@ -1187,13 +1189,14 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
11871189

11881190
ret = intel_gvt_init(dev_priv);
11891191
if (ret)
1190-
goto out_ggtt;
1192+
goto err_ggtt;
11911193

11921194
return 0;
11931195

1194-
out_ggtt:
1196+
err_ggtt:
11951197
i915_ggtt_cleanup_hw(dev_priv);
1196-
1198+
err_perf:
1199+
i915_perf_fini(dev_priv);
11971200
return ret;
11981201
}
11991202

0 commit comments

Comments
 (0)