--- a/sys/dev/drm/i915/vlv_dsi.c +++ b/sys/dev/drm/i915/vlv_dsi.c @@ -1857,7 +1857,14 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv) mutex_unlock(&dev->mode_config.mutex); if (!fixed_mode) { DRM_DEBUG_KMS("no fixed mode\n"); - goto err; + goto err_connector; } @@ -1871,7 +1878,11 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv) return; +err_connector: + /* drm_connector_init() already registered this connector in the + * mode-object IDR and on dev->mode_config.connector_list; undo it + * before the kfree below or every later list/IDR walker uses freed + * memory (DF-4206). */ + drm_connector_cleanup(connector); err: drm_encoder_cleanup(&intel_encoder->base); kfree(intel_dsi);