All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yakir Yang <ykk@rock-chips.com>
To: Sean Paul <seanpaul@chromium.org>,
	mark.yao@rock-chips.com, dri-devel@lists.freedesktop.org
Cc: marcheu@chromium.org, dianders@chromium.org,
	linux-rockchip@lists.infradead.org
Subject: Re: [PATCH v2 1/6] drm/rockchip: Convert psr_list_mutex to spinlock and use it
Date: Wed, 17 Aug 2016 10:29:59 +0800	[thread overview]
Message-ID: <37178adb-5cf4-f5e3-d1d5-fe2a312c49ad@rock-chips.com> (raw)
In-Reply-To: <1471396276-8222-2-git-send-email-seanpaul@chromium.org>


On 08/17/2016 09:11 AM, Sean Paul wrote:
> This patch converts the psr_list_mutex to a spinlock and locks
> all access to psr_list to avoid races (however unlikely they
> were).
>
> Signed-off-by: Sean Paul <seanpaul@chromium.org>
Reviewed-by: Yakir Yang <ykk@rock-chips.com>
> ---
>
> Changes in v2:
> 	- Rebased on https://cgit.freedesktop.org/~seanpaul/dogwood/log/?h=for-next
>
>   drivers/gpu/drm/rockchip/rockchip_drm_drv.c |  2 +-
>   drivers/gpu/drm/rockchip/rockchip_drm_drv.h |  2 +-
>   drivers/gpu/drm/rockchip/rockchip_drm_psr.c | 25 ++++++++++++++++++-------
>   3 files changed, 20 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
> index b43fe5d9..76eaf1d 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
> @@ -157,7 +157,7 @@ static int rockchip_drm_bind(struct device *dev)
>   	drm_dev->dev_private = private;
>   
>   	INIT_LIST_HEAD(&private->psr_list);
> -	mutex_init(&private->psr_list_mutex);
> +	spin_lock_init(&private->psr_list_lock);
>   
>   	drm_mode_config_init(drm_dev);
>   
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
> index 9c34c9e..5c69845 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
> @@ -63,7 +63,7 @@ struct rockchip_drm_private {
>   	struct drm_atomic_state *state;
>   
>   	struct list_head psr_list;
> -	struct mutex psr_list_mutex;
> +	spinlock_t psr_list_lock;
>   };
>   
>   int rockchip_register_crtc_funcs(struct drm_crtc *crtc,
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_psr.c b/drivers/gpu/drm/rockchip/rockchip_drm_psr.c
> index a6d3bd25..bd25273 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_psr.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_psr.c
> @@ -45,12 +45,18 @@ static struct psr_drv *find_psr_by_crtc(struct drm_crtc *crtc)
>   {
>   	struct rockchip_drm_private *drm_drv = crtc->dev->dev_private;
>   	struct psr_drv *psr;
> +	unsigned long flags;
>   
> -	list_for_each_entry(psr, &drm_drv->psr_list, list)
> +	spin_lock_irqsave(&drm_drv->psr_list_lock, flags);
> +	list_for_each_entry(psr, &drm_drv->psr_list, list) {
>   		if (psr->encoder->crtc == crtc)
> -			return psr;
> +			goto out;
> +	}
> +	psr = ERR_PTR(-ENODEV);
>   
> -	return ERR_PTR(-ENODEV);
> +out:
> +	spin_unlock_irqrestore(&drm_drv->psr_list_lock, flags);
> +	return psr;
>   }
>   
>   static void psr_state_work(struct work_struct *work)
> @@ -173,7 +179,9 @@ void rockchip_drm_psr_flush(struct drm_device *dev)
>   {
>   	struct rockchip_drm_private *drm_drv = dev->dev_private;
>   	struct psr_drv *psr;
> +	unsigned long flags;
>   
> +	spin_lock_irqsave(&drm_drv->psr_list_lock, flags);
>   	list_for_each_entry(psr, &drm_drv->psr_list, list) {
>   		if (psr->request_state == PSR_DISABLE)
>   			continue;
> @@ -183,6 +191,7 @@ void rockchip_drm_psr_flush(struct drm_device *dev)
>   
>   		psr_set_state(psr, PSR_FLUSH);
>   	}
> +	spin_unlock_irqrestore(&drm_drv->psr_list_lock, flags);
>   }
>   EXPORT_SYMBOL(rockchip_drm_psr_flush);
>   
> @@ -199,6 +208,7 @@ int rockchip_drm_psr_register(struct drm_encoder *encoder,
>   {
>   	struct rockchip_drm_private *drm_drv = encoder->dev->dev_private;
>   	struct psr_drv *psr;
> +	unsigned long flags;
>   
>   	if (!encoder || !psr_set)
>   		return -EINVAL;
> @@ -215,9 +225,9 @@ int rockchip_drm_psr_register(struct drm_encoder *encoder,
>   	psr->encoder = encoder;
>   	psr->set = psr_set;
>   
> -	mutex_lock(&drm_drv->psr_list_mutex);
> +	spin_lock_irqsave(&drm_drv->psr_list_lock, flags);
>   	list_add_tail(&psr->list, &drm_drv->psr_list);
> -	mutex_unlock(&drm_drv->psr_list_mutex);
> +	spin_unlock_irqrestore(&drm_drv->psr_list_lock, flags);
>   
>   	return 0;
>   }
> @@ -235,8 +245,9 @@ void rockchip_drm_psr_unregister(struct drm_encoder *encoder)
>   {
>   	struct rockchip_drm_private *drm_drv = encoder->dev->dev_private;
>   	struct psr_drv *psr, *n;
> +	unsigned long flags;
>   
> -	mutex_lock(&drm_drv->psr_list_mutex);
> +	spin_lock_irqsave(&drm_drv->psr_list_lock, flags);
>   	list_for_each_entry_safe(psr, n, &drm_drv->psr_list, list) {
>   		if (psr->encoder == encoder) {
>   			del_timer(&psr->flush_timer);
> @@ -244,6 +255,6 @@ void rockchip_drm_psr_unregister(struct drm_encoder *encoder)
>   			kfree(psr);
>   		}
>   	}
> -	mutex_unlock(&drm_drv->psr_list_mutex);
> +	spin_unlock_irqrestore(&drm_drv->psr_list_lock, flags);
>   }
>   EXPORT_SYMBOL(rockchip_drm_psr_unregister);


_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2016-08-17  2:29 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-17  1:11 [PATCH v2 0/6] drm/rockchip: Some patches to update the PSR series Sean Paul
2016-08-17  1:11 ` [PATCH v2 1/6] drm/rockchip: Convert psr_list_mutex to spinlock and use it Sean Paul
2016-08-17  2:29   ` Yakir Yang [this message]
2016-08-17  1:11 ` [PATCH v2 2/6] drm/rockchip: Don't use a delayed worker for psr state changes Sean Paul
2016-08-17  2:31   ` Yakir Yang
2016-08-17  1:11 ` [PATCH v2 3/6] drm/rockchip: Use a spinlock to protect psr state Sean Paul
2016-08-17  2:33   ` Yakir Yang
2016-08-17  1:11 ` [PATCH v2 4/6] drm/rockchip: A couple small fixes to psr Sean Paul
2016-08-17  2:34   ` Yakir Yang
2016-08-17  1:11 ` [PATCH v2 5/6] drm/rockchip: Improve analogix-dp psr handling Sean Paul
2016-08-17  2:35   ` Yakir Yang
2016-08-17  1:11 ` [PATCH v2 6/6] drm/rockchip: Enable vblank without event Sean Paul
2016-08-17  3:27   ` Yakir Yang
2016-08-17  2:41 ` [PATCH v2 0/6] drm/rockchip: Some patches to update the PSR series Yakir Yang
2016-08-17  2:45   ` Sean Paul
2016-08-17  3:20     ` Yakir Yang
2016-08-17  2:45   ` Yakir Yang

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=37178adb-5cf4-f5e3-d1d5-fe2a312c49ad@rock-chips.com \
    --to=ykk@rock-chips.com \
    --cc=dianders@chromium.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=marcheu@chromium.org \
    --cc=mark.yao@rock-chips.com \
    --cc=seanpaul@chromium.org \
    /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.