[PATCH] drm/v3d: fix reference count leaks due to pm_runtime_get_sync

From: Aditya Pakki
Date: Sat Jun 13 2020 - 22:45:14 EST


On calling pm_runtime_get_sync() the reference count of the device
is incremented. In case of failure, decrement the
reference count before returning the error.

Signed-off-by: Aditya Pakki <pakki001@xxxxxxx>
---
drivers/gpu/drm/v3d/v3d_debugfs.c | 8 ++++++--
drivers/gpu/drm/v3d/v3d_drv.c | 4 +++-
drivers/gpu/drm/v3d/v3d_gem.c | 4 +++-
3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/v3d/v3d_debugfs.c b/drivers/gpu/drm/v3d/v3d_debugfs.c
index e76b24bb8828..7ceb945e3a31 100644
--- a/drivers/gpu/drm/v3d/v3d_debugfs.c
+++ b/drivers/gpu/drm/v3d/v3d_debugfs.c
@@ -133,8 +133,10 @@ static int v3d_v3d_debugfs_ident(struct seq_file *m, void *unused)
int ret, core;

ret = pm_runtime_get_sync(v3d->drm.dev);
- if (ret < 0)
+ if (ret < 0) {
+ pm_runtime_put_autosuspend(v3d->drm.dev);
return ret;
+ }

ident0 = V3D_READ(V3D_HUB_IDENT0);
ident1 = V3D_READ(V3D_HUB_IDENT1);
@@ -220,8 +222,10 @@ static int v3d_measure_clock(struct seq_file *m, void *unused)
int ret;

ret = pm_runtime_get_sync(v3d->drm.dev);
- if (ret < 0)
+ if (ret < 0) {
+ pm_runtime_put_autosuspend(v3d->drm.dev);
return ret;
+ }

if (v3d->ver >= 40) {
V3D_CORE_WRITE(core, V3D_V4_PCTR_0_SRC_0_3,
diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c
index 82a7dfdd14c2..9b0a60b0bc11 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.c
+++ b/drivers/gpu/drm/v3d/v3d_drv.c
@@ -106,8 +106,10 @@ static int v3d_get_param_ioctl(struct drm_device *dev, void *data,
return -EINVAL;

ret = pm_runtime_get_sync(v3d->drm.dev);
- if (ret < 0)
+ if (ret < 0) {
+ pm_runtime_put_autosuspend(v3d->drm.dev);
return ret;
+ }
if (args->param >= DRM_V3D_PARAM_V3D_CORE0_IDENT0 &&
args->param <= DRM_V3D_PARAM_V3D_CORE0_IDENT2) {
args->value = V3D_CORE_READ(0, offset);
diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c
index 09a7639cf161..f2980632896a 100644
--- a/drivers/gpu/drm/v3d/v3d_gem.c
+++ b/drivers/gpu/drm/v3d/v3d_gem.c
@@ -440,8 +440,10 @@ v3d_job_init(struct v3d_dev *v3d, struct drm_file *file_priv,
job->free = free;

ret = pm_runtime_get_sync(v3d->drm.dev);
- if (ret < 0)
+ if (ret < 0) {
+ pm_runtime_put_autosuspend(v3d->drm.dev);
return ret;
+ }

xa_init_flags(&job->deps, XA_FLAGS_ALLOC);

--
2.25.1