[PATCH] drm: Try to acquire modeset lock on panic or sysrq

David Herrmann dh.herrmann at gmail.com
Wed Mar 26 05:33:24 PDT 2014


Hi

On Tue, Mar 25, 2014 at 1:25 PM, Thierry Reding
<thierry.reding at gmail.com> wrote:
> From: Thierry Reding <treding at nvidia.com>
>
> 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.
>
> Signed-off-by: Thierry Reding <treding at nvidia.com>
> ---
>  drivers/gpu/drm/drm_fb_helper.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
> index 9580393628a0..afce7cbd5149 100644
> --- a/drivers/gpu/drm/drm_fb_helper.c
> +++ b/drivers/gpu/drm/drm_fb_helper.c
> @@ -325,12 +325,21 @@ static bool drm_fb_helper_force_kernel_mode(void)
>                 return false;
>
>         list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) {
> -               if (helper->dev->switch_power_state == DRM_SWITCH_POWER_OFF)
> +               struct drm_device *dev = helper->dev;
> +
> +               if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
> +                       continue;
> +
> +               if (!mutex_trylock(&dev->mode_config.mutex)) {
> +                       error = true;

Reviewed-by: David Herrmann <dh.herrmann at gmail.com>

Thanks
David

>                         continue;
> +               }
>
>                 ret = drm_fb_helper_restore_fbdev_mode(helper);
>                 if (ret)
>                         error = true;
> +
> +               mutex_unlock(&dev->mode_config.mutex);
>         }
>         return error;
>  }
> --
> 1.9.1
>


More information about the dri-devel mailing list