All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
To: Eric Anholt <eric@anholt.net>, dri-devel@lists.freedesktop.org
Cc: linux-kernel@vger.kernel.org, Maxime Ripard <maxime.ripard@bootlin.com>
Subject: Re: [PATCH 6/7] drm/vc4: Add helpers for pm get/put.
Date: Fri, 22 Mar 2019 11:48:03 +0100	[thread overview]
Message-ID: <eec66692543e7dee94b3af111b87c9935d11ee6f.camel@bootlin.com> (raw)
In-Reply-To: <20190220210343.28157-6-eric@anholt.net>

Hi,

Le mercredi 20 février 2019 à 13:03 -0800, Eric Anholt a écrit :
> This makes sure the vc4_reset doesn't hit an obscure race with the
> GET_PARAM ioctl, fixes a decrement outside of the lock, and prevents
> future code from making mistakes with the weird return value of
> pm_runtime_get_sync().

Reviewed-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>

Cheers,

Paul

> Signed-off-by: Eric Anholt <eric@anholt.net>
> ---
>  drivers/gpu/drm/vc4/vc4_drv.c | 21 +++++++++------------
>  drivers/gpu/drm/vc4/vc4_drv.h |  2 ++
>  drivers/gpu/drm/vc4/vc4_gem.c | 21 +++++----------------
>  drivers/gpu/drm/vc4/vc4_v3d.c | 33 +++++++++++++++++++++++++++++++++
>  4 files changed, 49 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
> index de1d0ce11831..f95891a61d52 100644
> --- a/drivers/gpu/drm/vc4/vc4_drv.c
> +++ b/drivers/gpu/drm/vc4/vc4_drv.c
> @@ -77,28 +77,25 @@ static int vc4_get_param_ioctl(struct drm_device *dev, void *data,
>  
>  	switch (args->param) {
>  	case DRM_VC4_PARAM_V3D_IDENT0:
> -		ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
> -		if (ret < 0)
> +		ret = vc4_v3d_pm_get(vc4);
> +		if (ret)
>  			return ret;
>  		args->value = V3D_READ(V3D_IDENT0);
> -		pm_runtime_mark_last_busy(&vc4->v3d->pdev->dev);
> -		pm_runtime_put_autosuspend(&vc4->v3d->pdev->dev);
> +		vc4_v3d_pm_put(vc4);
>  		break;
>  	case DRM_VC4_PARAM_V3D_IDENT1:
> -		ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
> -		if (ret < 0)
> +		ret = vc4_v3d_pm_get(vc4);
> +		if (ret)
>  			return ret;
>  		args->value = V3D_READ(V3D_IDENT1);
> -		pm_runtime_mark_last_busy(&vc4->v3d->pdev->dev);
> -		pm_runtime_put_autosuspend(&vc4->v3d->pdev->dev);
> +		vc4_v3d_pm_put(vc4);
>  		break;
>  	case DRM_VC4_PARAM_V3D_IDENT2:
> -		ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
> -		if (ret < 0)
> +		ret = vc4_v3d_pm_get(vc4);
> +		if (ret)
>  			return ret;
>  		args->value = V3D_READ(V3D_IDENT2);
> -		pm_runtime_mark_last_busy(&vc4->v3d->pdev->dev);
> -		pm_runtime_put_autosuspend(&vc4->v3d->pdev->dev);
> +		vc4_v3d_pm_put(vc4);
>  		break;
>  	case DRM_VC4_PARAM_SUPPORTS_BRANCHES:
>  	case DRM_VC4_PARAM_SUPPORTS_ETC1:
> diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
> index 495c5a13a948..c71988b270bc 100644
> --- a/drivers/gpu/drm/vc4/vc4_drv.h
> +++ b/drivers/gpu/drm/vc4/vc4_drv.h
> @@ -809,6 +809,8 @@ void vc4_plane_async_set_fb(struct drm_plane *plane,
>  /* vc4_v3d.c */
>  extern struct platform_driver vc4_v3d_driver;
>  int vc4_v3d_get_bin_slot(struct vc4_dev *vc4);
> +int vc4_v3d_pm_get(struct vc4_dev *vc4);
> +void vc4_v3d_pm_put(struct vc4_dev *vc4);
>  
>  /* vc4_validate.c */
>  int
> diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c
> index 8d816e5ed762..4544a478f106 100644
> --- a/drivers/gpu/drm/vc4/vc4_gem.c
> +++ b/drivers/gpu/drm/vc4/vc4_gem.c
> @@ -969,12 +969,7 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)
>  	/* Release the reference we had on the perf monitor. */
>  	vc4_perfmon_put(exec->perfmon);
>  
> -	mutex_lock(&vc4->power_lock);
> -	if (--vc4->power_refcount == 0) {
> -		pm_runtime_mark_last_busy(&vc4->v3d->pdev->dev);
> -		pm_runtime_put_autosuspend(&vc4->v3d->pdev->dev);
> -	}
> -	mutex_unlock(&vc4->power_lock);
> +	vc4_v3d_pm_put(vc4);
>  
>  	kfree(exec);
>  }
> @@ -1153,17 +1148,11 @@ vc4_submit_cl_ioctl(struct drm_device *dev, void *data,
>  		return -ENOMEM;
>  	}
>  
> -	mutex_lock(&vc4->power_lock);
> -	if (vc4->power_refcount++ == 0) {
> -		ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
> -		if (ret < 0) {
> -			mutex_unlock(&vc4->power_lock);
> -			vc4->power_refcount--;
> -			kfree(exec);
> -			return ret;
> -		}
> +	ret = vc4_v3d_pm_get(vc4);
> +	if (ret) {
> +		kfree(exec);
> +		return ret;
>  	}
> -	mutex_unlock(&vc4->power_lock);
>  
>  	exec->args = args;
>  	INIT_LIST_HEAD(&exec->unref_list);
> diff --git a/drivers/gpu/drm/vc4/vc4_v3d.c b/drivers/gpu/drm/vc4/vc4_v3d.c
> index f008584eb739..7820b8eaaa98 100644
> --- a/drivers/gpu/drm/vc4/vc4_v3d.c
> +++ b/drivers/gpu/drm/vc4/vc4_v3d.c
> @@ -124,6 +124,39 @@ static int vc4_v3d_debugfs_ident(struct seq_file *m, void *unused)
>  	return 0;
>  }
>  
> +/**
> + * Wraps pm_runtime_get_sync() in a refcount, so that we can reliably
> + * get the pm_runtime refcount to 0 in vc4_reset().
> + */
> +int
> +vc4_v3d_pm_get(struct vc4_dev *vc4)
> +{
> +	mutex_lock(&vc4->power_lock);
> +	if (vc4->power_refcount++ == 0) {
> +		int ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
> +
> +		if (ret < 0) {
> +			vc4->power_refcount--;
> +			mutex_unlock(&vc4->power_lock);
> +			return ret;
> +		}
> +	}
> +	mutex_unlock(&vc4->power_lock);
> +
> +	return 0;
> +}
> +
> +void
> +vc4_v3d_pm_put(struct vc4_dev *vc4)
> +{
> +	mutex_lock(&vc4->power_lock);
> +	if (--vc4->power_refcount == 0) {
> +		pm_runtime_mark_last_busy(&vc4->v3d->pdev->dev);
> +		pm_runtime_put_autosuspend(&vc4->v3d->pdev->dev);
> +	}
> +	mutex_unlock(&vc4->power_lock);
> +}
> +
>  static void vc4_v3d_init_hw(struct drm_device *dev)
>  {
>  	struct vc4_dev *vc4 = to_vc4_dev(dev);
-- 
Paul Kocialkowski, Bootlin
Embedded Linux and kernel engineering
https://bootlin.com


  reply	other threads:[~2019-03-22 10:48 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-20 21:03 [PATCH 1/7] drm: Add a helper function for printing a debugfs_regset32 Eric Anholt
2019-02-20 21:03 ` [PATCH 2/7] drm/vc4: Use drm_print_regset32() for our debug register dumping Eric Anholt
2019-02-20 21:03   ` Eric Anholt
2019-03-22 10:32   ` Paul Kocialkowski
2019-03-22 10:32     ` Paul Kocialkowski
2019-02-20 21:03 ` [PATCH 3/7] drm/vc4: Use common helpers for debugfs setup by the driver components Eric Anholt
2019-02-20 21:03   ` Eric Anholt
2019-02-20 21:03 ` [PATCH 4/7] drm/vc4: Use drm_printer for the debugfs and runtime bo stats output Eric Anholt
2019-02-20 21:03   ` Eric Anholt
2019-03-22 10:41   ` Paul Kocialkowski
2019-02-20 21:03 ` [PATCH 5/7] drm/vc4: Disable V3D interactions if the v3d component didn't probe Eric Anholt
2019-03-25 13:30   ` Paul Kocialkowski
2019-02-20 21:03 ` [PATCH 6/7] drm/vc4: Add helpers for pm get/put Eric Anholt
2019-02-20 21:03   ` Eric Anholt
2019-03-22 10:48   ` Paul Kocialkowski [this message]
2019-02-20 21:03 ` [PATCH 7/7] drm/vc4: Make sure that the v3d ident debugfs has vc4's power on Eric Anholt
2019-03-22 10:43   ` Paul Kocialkowski
2019-02-21  9:37 ` [PATCH 1/7] drm: Add a helper function for printing a debugfs_regset32 Daniel Vetter
2019-02-21  9:37   ` Daniel Vetter
2019-03-25 16:43   ` Eric Anholt
2019-03-22 10:30 ` Paul Kocialkowski
2019-04-01 17:52   ` Eric Anholt

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=eec66692543e7dee94b3af111b87c9935d11ee6f.camel@bootlin.com \
    --to=paul.kocialkowski@bootlin.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=eric@anholt.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maxime.ripard@bootlin.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.