All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Vetter <daniel@ffwll.ch>
To: Thierry Reding <thierry.reding@gmail.com>
Cc: "Boris Brezillon" <boris.brezillon@free-electrons.com>,
	"Joonyoung Shim" <jy0922.shim@samsung.com>,
	"Xinliang Liu" <z.liuxinliang@hisilicon.com>,
	"Daniel Vetter" <daniel.vetter@ffwll.ch>,
	intel-gfx@lists.freedesktop.org,
	"Seung-Woo Kim" <sw0312.kim@samsung.com>,
	"Xinwei Kong" <kong.kongxinwei@hisilicon.com>,
	dri-devel@lists.freedesktop.org,
	"Inki Dae" <inki.dae@samsung.com>,
	"Kyungmin Park" <kyungmin.park@samsung.com>,
	"Chen Feng" <puck.chen@hisilicon.com>,
	"Alex Deucher" <alexander.deucher@amd.com>,
	"Christian König" <christian.koenig@amd.com>
Subject: Re: [PATCH v2 5/9] drm/fb-helper: Add top-level lock
Date: Tue, 7 Jun 2016 21:54:12 +0200	[thread overview]
Message-ID: <20160607195412.GI3363@phenom.ffwll.local> (raw)
In-Reply-To: <20160607152625.9511-6-thierry.reding@gmail.com>

On Tue, Jun 07, 2016 at 05:26:21PM +0200, Thierry Reding wrote:
> From: Thierry Reding <treding@nvidia.com>
> 
> Introduce a new top-level lock for the FB helper code. This will allow
> better locking granularity and avoid the need to abuse modeset locking
> for this purpose instead.
> 
> Signed-off-by: Thierry Reding <treding@nvidia.com>

I think this is now too much locking, and ime too much locking only leads
to massive confusion. It'd be great if we can clean this up (maybe in a
follow-up patch, maybe in this one here) and restrict the core locks to
just where we need them: So all the places that look at probe state need
dev->mode_config.mutex, all the places that change modeset state need the
modeset locks. But e.g. add/remove_one_connector only need the new
fb_helper->lock I think. In the future we might grabbing the other locks
even down into the legacy/atomic fbdev implementations.

> ---
>  drivers/gpu/drm/drm_fb_helper.c | 27 ++++++++++++++++++++++++++-
>  include/drm/drm_fb_helper.h     |  5 +++++
>  2 files changed, 31 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
> index 252c7557bdb5..f7722bcb0064 100644
> --- a/drivers/gpu/drm/drm_fb_helper.c
> +++ b/drivers/gpu/drm/drm_fb_helper.c
> @@ -105,6 +105,7 @@ static int __drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper,
>  	if (!drm_fbdev_emulation)
>  		return 0;
>  
> +	WARN_ON(!mutex_is_locked(&fb_helper->lock));
>  	WARN_ON(!mutex_is_locked(&fb_helper->dev->mode_config.mutex));
>  
>  	count = fb_helper->connector_count + 1;
> @@ -127,6 +128,7 @@ static int __drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper,
>  	drm_connector_reference(connector);
>  	conn->connector = connector;
>  	fb_helper->connector_info[fb_helper->connector_count++] = conn;
> +
>  	return 0;
>  }
>  
> @@ -135,11 +137,13 @@ int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper,
>  {
>  	int err;
>  
> +	mutex_lock(&fb_helper->lock);
>  	mutex_lock(&fb_helper->dev->mode_config.mutex);
>  
>  	err = __drm_fb_helper_add_one_connector(fb_helper, connector);
>  
>  	mutex_unlock(&fb_helper->dev->mode_config.mutex);
> +	mutex_unlock(&fb_helper->lock);
>  
>  	return err;
>  }
> @@ -168,6 +172,7 @@ int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper)
>  	if (!drm_fbdev_emulation)
>  		return 0;
>  
> +	mutex_lock(&fb_helper->lock);
>  	mutex_lock(&dev->mode_config.mutex);
>  
>  	drm_for_each_connector(connector, dev) {
> @@ -184,6 +189,7 @@ int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper)
>  	}
>  
>  	mutex_unlock(&dev->mode_config.mutex);
> +	mutex_unlock(&fb_helper->lock);
>  
>  	return ret;
>  }
> @@ -198,6 +204,7 @@ static int __drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
>  	if (!drm_fbdev_emulation)
>  		return 0;
>  
> +	WARN_ON(!mutex_is_locked(&fb_helper->lock));
>  	WARN_ON(!mutex_is_locked(&fb_helper->dev->mode_config.mutex));
>  
>  	for (i = 0; i < fb_helper->connector_count; i++) {
> @@ -225,11 +232,13 @@ int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
>  {
>  	int err;
>  
> +	mutex_lock(&fb_helper->lock);
>  	mutex_lock(&fb_helper->dev->mode_config.mutex);
>  
>  	err = __drm_fb_helper_remove_one_connector(fb_helper, connector);
>  
>  	mutex_unlock(&fb_helper->dev->mode_config.mutex);
> +	mutex_unlock(&fb_helper->lock);
>  
>  	return err;
>  }
> @@ -478,16 +487,21 @@ int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)
>  	if (!drm_fbdev_emulation)
>  		return -ENODEV;
>  
> +	mutex_lock(&fb_helper->lock);
>  	drm_modeset_lock_all(dev);
> +
>  	ret = restore_fbdev_mode(fb_helper);
>  
>  	do_delayed = fb_helper->delayed_hotplug;
>  	if (do_delayed)
>  		fb_helper->delayed_hotplug = false;
> +
>  	drm_modeset_unlock_all(dev);
> +	mutex_unlock(&fb_helper->lock);
>  
>  	if (do_delayed)
>  		drm_fb_helper_hotplug_event(fb_helper);
> +
>  	return ret;
>  }
>  EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode_unlocked);
> @@ -688,6 +702,7 @@ void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper,
>  	spin_lock_init(&helper->dirty_lock);
>  	INIT_WORK(&helper->dirty_work, drm_fb_helper_dirty_work);
>  	helper->dirty_clip.x1 = helper->dirty_clip.y1 = ~0;
> +	mutex_init(&helper->lock);
>  	helper->funcs = funcs;
>  	helper->dev = dev;
>  }
> @@ -853,6 +868,7 @@ void drm_fb_helper_fini(struct drm_fb_helper *fb_helper)
>  			unregister_sysrq_key('v', &sysrq_drm_fb_helper_restore_op);
>  	}
>  
> +	mutex_destroy(&fb_helper->lock);
>  	drm_fb_helper_crtc_free(fb_helper);
>  
>  }
> @@ -2273,16 +2289,20 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
>  {
>  	struct drm_device *dev = fb_helper->dev;
>  	u32 max_width, max_height;
> +	int err = 0;
>  
>  	if (!drm_fbdev_emulation)
>  		return 0;
>  
> +	mutex_lock(&fb_helper->lock);
>  	mutex_lock(&fb_helper->dev->mode_config.mutex);
> +
>  	if (!fb_helper->fb || !drm_fb_helper_is_bound(fb_helper)) {
>  		fb_helper->delayed_hotplug = true;
>  		mutex_unlock(&fb_helper->dev->mode_config.mutex);
> -		return 0;
> +		goto unlock;
>  	}
> +
>  	DRM_DEBUG_KMS("\n");
>  
>  	max_width = fb_helper->fb->width;
> @@ -2290,6 +2310,7 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
>  
>  	drm_fb_helper_probe_connector_modes(fb_helper, max_width, max_height);
>  	mutex_unlock(&fb_helper->dev->mode_config.mutex);
> +	mutex_unlock(&fb_helper->lock);
>  
>  	drm_modeset_lock_all(dev);
>  	drm_setup_crtcs(fb_helper);
> @@ -2297,6 +2318,10 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
>  	drm_fb_helper_set_par(fb_helper->fbdev);
>  
>  	return 0;
> +
> +unlock:
> +	mutex_unlock(&fb_helper->lock);
> +	return err;
>  }
>  EXPORT_SYMBOL(drm_fb_helper_hotplug_event);
>  
> diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
> index 5b4aa35026a3..7739be08ebca 100644
> --- a/include/drm/drm_fb_helper.h
> +++ b/include/drm/drm_fb_helper.h
> @@ -198,6 +198,11 @@ struct drm_fb_helper {
>  	struct work_struct dirty_work;
>  
>  	/**
> +	 * Top-level FB helper lock.
> +	 */

need to add @lock: in the above comment, otherwise kerneldoc will still
complain about the lack of comment for this new member.
-Daniel

> +	struct mutex lock;
> +
> +	/**
>  	 * @kernel_fb_list:
>  	 *
>  	 * Entry on the global kernel_fb_helper_list, used for kgdb entry/exit.
> -- 
> 2.8.3
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2016-06-07 19:54 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-07 15:26 [PATCH v2 0/9] drm/fb-helper: Deferred setup support Thierry Reding
2016-06-07 15:26 ` [PATCH v2 1/9] drm/fb-helper: Cleanup checkpatch warnings Thierry Reding
2016-06-07 15:26 ` [PATCH v2 2/9] drm/fb-helper: Reshuffle code for subsequent patches Thierry Reding
2016-06-07 15:26 ` [PATCH v2 3/9] drm/fb-helper: Improve code readability Thierry Reding
2016-06-07 15:26 ` [PATCH v2 4/9] drm/fb-helper: Push down modeset lock into FB helpers Thierry Reding
2016-06-09 23:56   ` Inki Dae
2016-06-07 15:26 ` [PATCH v2 5/9] drm/fb-helper: Add top-level lock Thierry Reding
2016-06-07 19:54   ` Daniel Vetter [this message]
2016-06-07 15:26 ` [PATCH v2 6/9] drm/fb-helper: Support deferred setup Thierry Reding
2016-06-07 15:26 ` [PATCH v2 7/9] drm/atmel-hlcdc: Remove custom FB helper " Thierry Reding
2016-06-07 15:26 ` [PATCH v2 8/9] drm/exynos: " Thierry Reding
2016-06-07 19:49   ` Daniel Vetter
2016-06-07 15:26 ` [PATCH v2 9/9] drm/hisilicon: " Thierry Reding
2016-06-07 16:41 ` ✗ Ro.CI.BAT: failure for drm/fb-helper: Deferred setup support Patchwork

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=20160607195412.GI3363@phenom.ffwll.local \
    --to=daniel@ffwll.ch \
    --cc=alexander.deucher@amd.com \
    --cc=boris.brezillon@free-electrons.com \
    --cc=christian.koenig@amd.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=inki.dae@samsung.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=jy0922.shim@samsung.com \
    --cc=kong.kongxinwei@hisilicon.com \
    --cc=kyungmin.park@samsung.com \
    --cc=puck.chen@hisilicon.com \
    --cc=sw0312.kim@samsung.com \
    --cc=thierry.reding@gmail.com \
    --cc=z.liuxinliang@hisilicon.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.