From 9c52345db761baa0a08634b3e93a233804b7a91b Mon Sep 17 00:00:00 2001 From: zrj Date: Fri, 20 May 2016 18:54:04 +0300 Subject: [PATCH] drm/i915: Avoid dead-locking the userland. Was happening for some time and the cause is still unclear. On exit Xorg doesn't return from kernel and is unkillable. Sometimes even panics on haswell, it is better to avoid that. Also reduce spam on laptops with eDP panels on i915 load. Great opportunity to use just implemented DRM_ERROR_RATELIMITED() macro that uses krateprintf(). --- sys/dev/drm/i915/intel_dp.c | 7 +++++++ sys/dev/drm/i915/intel_fbdev.c | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/sys/dev/drm/i915/intel_dp.c b/sys/dev/drm/i915/intel_dp.c index 32d38cca74..e0ce841529 100644 --- a/sys/dev/drm/i915/intel_dp.c +++ b/sys/dev/drm/i915/intel_dp.c @@ -1977,8 +1977,15 @@ void intel_edp_panel_vdd_on(struct intel_dp *intel_dp) vdd = edp_panel_vdd_on(intel_dp); pps_unlock(intel_dp); +#if 1 +/* XXX: limit dmesg spam to 16 warnings instead of 137, where is the bug? */ + if(!vdd) + DRM_ERROR_RATELIMITED("eDP port %c VDD already requested on\n", + port_name(dp_to_dig_port(intel_dp)->port)); +#else I915_STATE_WARN(!vdd, "eDP port %c VDD already requested on\n", port_name(dp_to_dig_port(intel_dp)->port)); +#endif } static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp) diff --git a/sys/dev/drm/i915/intel_fbdev.c b/sys/dev/drm/i915/intel_fbdev.c index a0a0f7d4ee..d0c5cf36e9 100644 --- a/sys/dev/drm/i915/intel_fbdev.c +++ b/sys/dev/drm/i915/intel_fbdev.c @@ -812,6 +812,12 @@ void intel_fbdev_restore_mode(struct drm_device *dev) fb_helper = &ifbdev->helper; + /* XXX: avoid dead-locking the Xorg on exit */ + if (mutex_is_locked(&dev->mode_config.mutex)) { + DRM_ERROR("fubar while trying to restore kms_console\n"); + return; /* drm_modeset_unlock_all(dev) ? */ + } + ret = drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper); if (ret) { DRM_DEBUG("failed to restore crtc mode\n"); -- 2.41.0