[Intel-gfx] [PATCH] drm/i915: duct-tape locking when eDP init fails

Jani Nikula jani.nikula at linux.intel.com
Tue Mar 26 08:45:47 CET 2013


On Mon, 25 Mar 2013, Daniel Vetter <daniel.vetter at ffwll.ch> wrote:
> Thanks to apple gpu mux fail we detect an eDP output, but can't read
> anything over dp aux. In the resulting failure path we then hit a
> paranoid WARN about potential locking.
>
> Since the WARN is pretty useful for normal operation just paper over
> it in the failure case by grabbing the demanded (but for init/teardown
> not really required) lock.
>
> I've checked our driver unload code and we already don't hold the kms
> lock when calling drm_mode_config_cleanup. So this won't lead to a new
> deadlock when reloading i915.ko.

Also, drm_encoder_cleanup() grabs mode_config mutex internally, so we
would have deadlocks already if intel_dp_encoder_destroy() were called
while holding the lock.

Reviewed-by: Jani Nikula <jani.nikula at intel.com>


An observation outside of this patch, I find it a bit ugly that it
depends on the ironlake_edp_panel_vdd_off() sync parameter whether the
caller needs to hold the mode_config mutex or not. Perhaps separate
functions for sync/async would be neater, but don't hold your breath
waiting for patches from me to that effect. ;)

>
> v2: Make it compile.
>
> Reported-by: Dave Airlie <airlied at gmail.com>
> Cc: Dave Airlie <airlied at gmail.com>
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
>  drivers/gpu/drm/i915/intel_dp.c |    3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index d7d4afe..8fc93f9 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -2559,12 +2559,15 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder)
>  {
>  	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
>  	struct intel_dp *intel_dp = &intel_dig_port->dp;
> +	struct drm_device *dev = intel_dp_to_dev(intel_dp);
>  
>  	i2c_del_adapter(&intel_dp->adapter);
>  	drm_encoder_cleanup(encoder);
>  	if (is_edp(intel_dp)) {
>  		cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
> +		mutex_lock(&dev->mode_config.mutex);
>  		ironlake_panel_vdd_off_sync(intel_dp);
> +		mutex_unlock(&dev->mode_config.mutex);
>  	}
>  	kfree(intel_dig_port);
>  }
> -- 
> 1.7.10.4
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



More information about the Intel-gfx mailing list