Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 89ced125 authored by Daniel Vetter's avatar Daniel Vetter Committed by Dave Airlie
Browse files

drm/fb-helper: Fix locking in drm_fb_helper_hotplug_event



Driver's and ->fill_modes functions are allowed to grab crtc mutexes
(for e.g. load detect). Hence we need to first only grab the general
kms mutex, and only in a second step grab all locks to do the
modesets.

This prevents a deadlock on my gm45 in the tv load detect code called
by drm_helper_probe_single_connector_modes.

Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 1baee586
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -1544,10 +1544,10 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
	if (!fb_helper->fb)
		return 0;

	drm_modeset_lock_all(dev);
	mutex_lock(&fb_helper->dev->mode_config.mutex);
	if (!drm_fb_helper_is_bound(fb_helper)) {
		fb_helper->delayed_hotplug = true;
		drm_modeset_unlock_all(dev);
		mutex_unlock(&fb_helper->dev->mode_config.mutex);
		return 0;
	}
	DRM_DEBUG_KMS("\n");
@@ -1558,9 +1558,11 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)

	count = drm_fb_helper_probe_connector_modes(fb_helper, max_width,
						    max_height);
	mutex_unlock(&fb_helper->dev->mode_config.mutex);

	drm_modeset_lock_all(dev);
	drm_setup_crtcs(fb_helper);
	drm_modeset_unlock_all(dev);

	drm_fb_helper_set_par(fb_helper->fbdev);

	return 0;