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: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
1baee58638
commit
89ced12547
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue