aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2014-04-29 05:44:32 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-04-29 06:24:12 -0400
commitb77f0765fdfb3a115e40effd890acb4674dc0989 (patch)
tree01fec81e4a91610342c2f7774ecab002f7526b82
parent1dcc0ceba05797dc6a696022509df6a180a78384 (diff)
drm: Try to acquire modeset lock on panic or sysrq
Commit 62ff94a54921 "drm/crtc-helper: remove LOCKING from kerneldoc" causes drm_helper_crtc_in_use() and drm_helper_encoder_in_use() to complain loudly during a kernel panic or sysrq processing. This is caused by nobody acquiring the modeset lock in these code paths. This patch fixes this by trying to acquire the modeset lock for each FB helper that's forced to kernel mode. If the lock can't be acquired, it's likely that somebody else is performing a modeset. However, doing another modeset concurrently might make things even worse, so the safe option is to simply bail out in that case. Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: David Herrmann <dh.herrmann@gmail.com> Signed-off-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/drm_fb_helper.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 04d3fd3658f3..158d8e51db3d 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -326,12 +326,21 @@ static bool drm_fb_helper_force_kernel_mode(void)
326 return false; 326 return false;
327 327
328 list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) { 328 list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) {
329 if (helper->dev->switch_power_state == DRM_SWITCH_POWER_OFF) 329 struct drm_device *dev = helper->dev;
330
331 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
332 continue;
333
334 if (!mutex_trylock(&dev->mode_config.mutex)) {
335 error = true;
330 continue; 336 continue;
337 }
331 338
332 ret = drm_fb_helper_restore_fbdev_mode(helper); 339 ret = drm_fb_helper_restore_fbdev_mode(helper);
333 if (ret) 340 if (ret)
334 error = true; 341 error = true;
342
343 mutex_unlock(&dev->mode_config.mutex);
335 } 344 }
336 return error; 345 return error;
337} 346}