All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Vetter <daniel@ffwll.ch>
To: Rob Clark <robdclark@gmail.com>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 13/17] drm: push locking down into restore_fbdev_mode
Date: Mon, 26 May 2014 11:34:10 +0200	[thread overview]
Message-ID: <20140526093410.GD14357@phenom.ffwll.local> (raw)
In-Reply-To: <1400956226-28053-14-git-send-email-robdclark@gmail.com>

On Sat, May 24, 2014 at 02:30:22PM -0400, Rob Clark wrote:
> All the call-sites save one need locking.  By pushing it down and adding
> a lockless flag, we can use the new spiffy atomic ww_mutex crtc locking
> and simplify all the call-sites.
> 
> Signed-off-by: Rob Clark <robdclark@gmail.com>

Yeah, makes sense. But I don't like the bool lockless interface,
especially since the only user of it is also in the fb helper.

Imo much better to add a static function with __ prefix internal to
drm_fb_helper.c which is lockless and give drivers less rope to hang
themselves. Since I just can't think of a good reason why they want to not
have locking when force-restoring the fbdev emulation.

With that changed this is Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> ---
>  drivers/gpu/drm/armada/armada_fbdev.c     |  4 +---
>  drivers/gpu/drm/drm_fb_cma_helper.c       |  9 ++-------
>  drivers/gpu/drm/drm_fb_helper.c           | 17 ++++++++---------
>  drivers/gpu/drm/exynos/exynos_drm_fbdev.c |  4 +---
>  drivers/gpu/drm/gma500/psb_drv.c          |  4 +---
>  drivers/gpu/drm/i915/intel_fbdev.c        |  6 +-----
>  drivers/gpu/drm/msm/msm_drv.c             |  7 ++-----
>  drivers/gpu/drm/omapdrm/omap_drv.c        |  4 +---
>  drivers/gpu/drm/tegra/fb.c                |  7 ++-----
>  include/drm/drm_fb_helper.h               |  3 ++-
>  10 files changed, 21 insertions(+), 44 deletions(-)
> 
> diff --git a/drivers/gpu/drm/armada/armada_fbdev.c b/drivers/gpu/drm/armada/armada_fbdev.c
> index 948cb14..9976125 100644
> --- a/drivers/gpu/drm/armada/armada_fbdev.c
> +++ b/drivers/gpu/drm/armada/armada_fbdev.c
> @@ -181,10 +181,8 @@ void armada_fbdev_lastclose(struct drm_device *dev)
>  {
>  	struct armada_private *priv = dev->dev_private;
>  
> -	drm_modeset_lock_all(dev);
>  	if (priv->fbdev)
> -		drm_fb_helper_restore_fbdev_mode(priv->fbdev);
> -	drm_modeset_unlock_all(dev);
> +		drm_fb_helper_restore_fbdev_mode(priv->fbdev, false);
>  }
>  
>  void armada_fbdev_fini(struct drm_device *dev)
> diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c
> index 65540b7..ccb7a9ac 100644
> --- a/drivers/gpu/drm/drm_fb_cma_helper.c
> +++ b/drivers/gpu/drm/drm_fb_cma_helper.c
> @@ -429,13 +429,8 @@ EXPORT_SYMBOL_GPL(drm_fbdev_cma_fini);
>   */
>  void drm_fbdev_cma_restore_mode(struct drm_fbdev_cma *fbdev_cma)
>  {
> -	if (fbdev_cma) {
> -		struct drm_device *dev = fbdev_cma->fb_helper.dev;
> -
> -		drm_modeset_lock_all(dev);
> -		drm_fb_helper_restore_fbdev_mode(&fbdev_cma->fb_helper);
> -		drm_modeset_unlock_all(dev);
> -	}
> +	if (fbdev_cma)
> +		drm_fb_helper_restore_fbdev_mode(&fbdev_cma->fb_helper, false);
>  }
>  EXPORT_SYMBOL_GPL(drm_fbdev_cma_restore_mode);
>  
> diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
> index 4669e69..3815e1a 100644
> --- a/drivers/gpu/drm/drm_fb_helper.c
> +++ b/drivers/gpu/drm/drm_fb_helper.c
> @@ -276,12 +276,15 @@ EXPORT_SYMBOL(drm_fb_helper_debug_leave);
>  /**
>   * drm_fb_helper_restore_fbdev_mode - restore fbdev configuration
>   * @fb_helper: fbcon to restore
> + * @lockless: true in drm_fb_helper_force_kernel_mode() path, to avoid
> + *   blocking in panic case, everywhere else should use false
>   *
>   * This should be called from driver's drm ->lastclose callback
>   * when implementing an fbcon on top of kms using this helper. This ensures that
>   * the user isn't greeted with a black screen when e.g. X dies.
>   */
> -bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper)
> +bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper,
> +		bool lockless)
>  {
>  	struct drm_device *dev = fb_helper->dev;
>  	struct drm_plane *plane;
> @@ -289,9 +292,8 @@ bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper)
>  	struct drm_atomic_state *state;
>  	int i;
>  
> -	drm_warn_on_modeset_not_all_locked(dev);
> -
> -	state = dev->driver->atomic_begin(dev, 0);
> +	state = dev->driver->atomic_begin(dev, lockless ?
> +			DRM_MODE_ATOMIC_NOLOCK : 0);
>  	if (IS_ERR(state)) {
>  		DRM_ERROR("failed to restore fbdev mode\n");
>  		return true;
> @@ -355,7 +357,7 @@ static bool drm_fb_helper_force_kernel_mode(void)
>  			continue;
>  		}
>  
> -		ret = drm_fb_helper_restore_fbdev_mode(helper);
> +		ret = drm_fb_helper_restore_fbdev_mode(helper, true);
>  		if (ret)
>  			error = true;
>  
> @@ -840,7 +842,6 @@ EXPORT_SYMBOL(drm_fb_helper_check_var);
>  int drm_fb_helper_set_par(struct fb_info *info)
>  {
>  	struct drm_fb_helper *fb_helper = info->par;
> -	struct drm_device *dev = fb_helper->dev;
>  	struct fb_var_screeninfo *var = &info->var;
>  
>  	if (var->pixclock != 0) {
> @@ -848,9 +849,7 @@ int drm_fb_helper_set_par(struct fb_info *info)
>  		return -EINVAL;
>  	}
>  
> -	drm_modeset_lock_all(dev);
> -	drm_fb_helper_restore_fbdev_mode(fb_helper);
> -	drm_modeset_unlock_all(dev);
> +	drm_fb_helper_restore_fbdev_mode(fb_helper, false);
>  
>  	if (fb_helper->delayed_hotplug) {
>  		fb_helper->delayed_hotplug = false;
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> index 2371716..486b21f 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> @@ -375,7 +375,5 @@ void exynos_drm_fbdev_restore_mode(struct drm_device *dev)
>  	if (!private || !private->fb_helper)
>  		return;
>  
> -	drm_modeset_lock_all(dev);
> -	drm_fb_helper_restore_fbdev_mode(private->fb_helper);
> -	drm_modeset_unlock_all(dev);
> +	drm_fb_helper_restore_fbdev_mode(private->fb_helper, false);
>  }
> diff --git a/drivers/gpu/drm/gma500/psb_drv.c b/drivers/gpu/drm/gma500/psb_drv.c
> index 0180292..72a35e3 100644
> --- a/drivers/gpu/drm/gma500/psb_drv.c
> +++ b/drivers/gpu/drm/gma500/psb_drv.c
> @@ -112,11 +112,9 @@ static void psb_driver_lastclose(struct drm_device *dev)
>  	struct drm_psb_private *dev_priv = dev->dev_private;
>  	struct psb_fbdev *fbdev = dev_priv->fbdev;
>  
> -	drm_modeset_lock_all(dev);
> -	ret = drm_fb_helper_restore_fbdev_mode(&fbdev->psb_fb_helper);
> +	ret = drm_fb_helper_restore_fbdev_mode(&fbdev->psb_fb_helper, false);
>  	if (ret)
>  		DRM_DEBUG("failed to restore crtc mode\n");
> -	drm_modeset_unlock_all(dev);
>  
>  	return;
>  }
> diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
> index fce4a0d..28afd69 100644
> --- a/drivers/gpu/drm/i915/intel_fbdev.c
> +++ b/drivers/gpu/drm/i915/intel_fbdev.c
> @@ -683,11 +683,7 @@ void intel_fbdev_restore_mode(struct drm_device *dev)
>  	if (!dev_priv->fbdev)
>  		return;
>  
> -	drm_modeset_lock_all(dev);
> -
> -	ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper);
> +	ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper, false);
>  	if (ret)
>  		DRM_DEBUG("failed to restore crtc mode\n");
> -
> -	drm_modeset_unlock_all(dev);
>  }
> diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
> index 46e0f29..d24ca45 100644
> --- a/drivers/gpu/drm/msm/msm_drv.c
> +++ b/drivers/gpu/drm/msm/msm_drv.c
> @@ -382,11 +382,8 @@ static void msm_preclose(struct drm_device *dev, struct drm_file *file)
>  static void msm_lastclose(struct drm_device *dev)
>  {
>  	struct msm_drm_private *priv = dev->dev_private;
> -	if (priv->fbdev) {
> -		drm_modeset_lock_all(dev);
> -		drm_fb_helper_restore_fbdev_mode(priv->fbdev);
> -		drm_modeset_unlock_all(dev);
> -	}
> +	if (priv->fbdev)
> +		drm_fb_helper_restore_fbdev_mode(priv->fbdev, false);
>  }
>  
>  static irqreturn_t msm_irq(int irq, void *arg)
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 3f64c47..ad082f4 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -590,9 +590,7 @@ static void dev_lastclose(struct drm_device *dev)
>  		}
>  	}
>  
> -	drm_modeset_lock_all(dev);
> -	ret = drm_fb_helper_restore_fbdev_mode(priv->fbdev);
> -	drm_modeset_unlock_all(dev);
> +	ret = drm_fb_helper_restore_fbdev_mode(priv->fbdev, false);
>  	if (ret)
>  		DBG("failed to restore crtc mode");
>  }
> diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c
> index f7fca09..85aae37 100644
> --- a/drivers/gpu/drm/tegra/fb.c
> +++ b/drivers/gpu/drm/tegra/fb.c
> @@ -346,11 +346,8 @@ static void tegra_fbdev_free(struct tegra_fbdev *fbdev)
>  
>  void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev)
>  {
> -	if (fbdev) {
> -		drm_modeset_lock_all(fbdev->base.dev);
> -		drm_fb_helper_restore_fbdev_mode(&fbdev->base);
> -		drm_modeset_unlock_all(fbdev->base.dev);
> -	}
> +	if (fbdev)
> +		drm_fb_helper_restore_fbdev_mode(&fbdev->base, false);
>  }
>  
>  static void tegra_fb_output_poll_changed(struct drm_device *drm)
> diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
> index 6e622f7..99598a0 100644
> --- a/include/drm/drm_fb_helper.h
> +++ b/include/drm/drm_fb_helper.h
> @@ -108,7 +108,8 @@ int drm_fb_helper_set_par(struct fb_info *info);
>  int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
>  			    struct fb_info *info);
>  
> -bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper);
> +bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper,
> +		bool lockless);
>  void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper,
>  			    uint32_t fb_width, uint32_t fb_height);
>  void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
> -- 
> 1.9.0
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

  reply	other threads:[~2014-05-26  9:34 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-24 18:30 [PATCH 00/17] prepare for atomic/nuclear modeset/pageflip Rob Clark
2014-05-24 18:30 ` [PATCH 01/17] drm: fix typo Rob Clark
2014-05-24 18:30 ` [PATCH 02/17] drm: add atomic fxns Rob Clark
2014-05-24 18:30 ` [PATCH 03/17] drm: convert crtc and mode_config to ww_mutex Rob Clark
2014-05-25 22:10   ` Daniel Vetter
2014-05-25 23:16     ` Rob Clark
2014-05-26  8:23       ` Daniel Vetter
2014-05-26 11:56         ` Rob Clark
2014-05-26 14:35           ` Daniel Vetter
2014-05-26 14:36             ` Daniel Vetter
2014-05-26 15:04             ` Rob Clark
2014-05-26 15:07               ` Daniel Vetter
2014-05-26 15:20                 ` Rob Clark
2014-05-26 15:35                   ` Daniel Vetter
2014-05-26 15:49                     ` Rob Clark
2014-05-26 16:09                       ` Daniel Vetter
2014-05-24 18:30 ` [PATCH 04/17] drm: add object property type Rob Clark
2014-05-26  8:29   ` Daniel Vetter
2014-05-26  8:33     ` Daniel Vetter
2014-05-26 11:06     ` Rob Clark
2014-05-24 18:30 ` [PATCH 05/17] drm: add signed-range " Rob Clark
2014-05-24 18:30 ` [PATCH 06/17] drm: helpers to find mode objects Rob Clark
2014-05-26  8:37   ` Daniel Vetter
2014-05-26  8:55     ` Daniel Vetter
2014-05-26 11:12     ` Rob Clark
2014-05-24 18:30 ` [PATCH 07/17] drm: split propvals out and blob property support Rob Clark
2014-05-24 18:30 ` [PATCH 08/17] drm: Allow drm_mode_object_find() to look up an object of any type Rob Clark
2014-05-24 18:30 ` [PATCH 09/17] drm: Refactor object property check code Rob Clark
2014-05-24 18:30 ` [PATCH 10/17] drm: allow FB's in drm_mode_object_find Rob Clark
2014-05-26  8:39   ` Daniel Vetter
2014-05-24 18:30 ` [PATCH 11/17] drm: convert plane to properties/state Rob Clark
2014-05-26  9:12   ` Daniel Vetter
2014-05-26 11:32     ` Rob Clark
2014-05-26 14:52       ` Daniel Vetter
2014-05-24 18:30 ` [PATCH 12/17] drm: convert crtc " Rob Clark
2014-05-26  9:31   ` Daniel Vetter
2014-05-26 11:35     ` Rob Clark
2014-05-26 14:56       ` Daniel Vetter
2014-05-26 15:15         ` Rob Clark
2014-05-26 15:23     ` Ville Syrjälä
2014-05-26 15:37       ` Daniel Vetter
2014-05-26 15:42         ` Rob Clark
2014-05-26 15:46         ` Ville Syrjälä
2014-05-26 16:12           ` Daniel Vetter
2014-05-24 18:30 ` [PATCH 13/17] drm: push locking down into restore_fbdev_mode Rob Clark
2014-05-26  9:34   ` Daniel Vetter [this message]
2014-05-24 18:30 ` [PATCH 14/17] drm/msm: add atomic support Rob Clark
2014-05-26 17:54   ` Daniel Vetter
2014-05-27 15:58     ` Rob Clark
2014-05-27 17:50       ` Daniel Vetter
2014-05-27 18:48         ` Rob Clark
2014-05-27 19:26           ` Daniel Vetter
2014-05-27 20:06             ` Rob Clark
2014-05-27 22:09               ` Daniel Vetter
2014-05-27 23:32                 ` Rob Clark
2014-05-28 13:21                   ` Daniel Vetter
2014-05-28 14:14                     ` Ville Syrjälä
2014-05-28 14:50                       ` Daniel Vetter
2014-05-28 15:19                     ` Rob Clark
2014-05-27 23:47                 ` Rob Clark
2014-05-28 13:32                   ` Daniel Vetter
2014-05-24 18:30 ` [PATCH 15/17] drm: spiff out FB refcnting traces Rob Clark
2014-05-24 18:30 ` [PATCH 16/17] drm: more conservative locking Rob Clark
2014-05-24 18:30 ` [PATCH 17/17] drm: Fix up the atomic legacy paths so they work Rob Clark
2014-05-26 10:40 ` [PATCH 00/17] prepare for atomic/nuclear modeset/pageflip Daniel Vetter
2014-05-26 12:48   ` Rob Clark
2014-05-26 15:24     ` Daniel Vetter
2014-05-26 16:12       ` Rob Clark
2014-05-26 17:36         ` Daniel Vetter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140526093410.GD14357@phenom.ffwll.local \
    --to=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=robdclark@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.