| From 49cf923b7e4865ffca995e8d61216ff08418b2ba Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 13 Jun 2020 20:41:56 -0500 |
| Subject: drm/nouveau: fix multiple instances of reference count leaks |
| |
| From: Aditya Pakki <pakki001@umn.edu> |
| |
| [ Upstream commit 659fb5f154c3434c90a34586f3b7aa1c39cf6062 ] |
| |
| On calling pm_runtime_get_sync() the reference count of the device |
| is incremented. In case of failure, decrement the |
| ref count before returning the error. |
| |
| Signed-off-by: Aditya Pakki <pakki001@umn.edu> |
| Signed-off-by: Ben Skeggs <bskeggs@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/nouveau/nouveau_drm.c | 8 ++++++-- |
| drivers/gpu/drm/nouveau/nouveau_gem.c | 4 +++- |
| 2 files changed, 9 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c |
| index ca4087f5a15b6..c484d21820c9b 100644 |
| --- a/drivers/gpu/drm/nouveau/nouveau_drm.c |
| +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c |
| @@ -1051,8 +1051,10 @@ nouveau_drm_open(struct drm_device *dev, struct drm_file *fpriv) |
| |
| /* need to bring up power immediately if opening device */ |
| ret = pm_runtime_get_sync(dev->dev); |
| - if (ret < 0 && ret != -EACCES) |
| + if (ret < 0 && ret != -EACCES) { |
| + pm_runtime_put_autosuspend(dev->dev); |
| return ret; |
| + } |
| |
| get_task_comm(tmpname, current); |
| snprintf(name, sizeof(name), "%s[%d]", tmpname, pid_nr(fpriv->pid)); |
| @@ -1134,8 +1136,10 @@ nouveau_drm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
| long ret; |
| |
| ret = pm_runtime_get_sync(dev->dev); |
| - if (ret < 0 && ret != -EACCES) |
| + if (ret < 0 && ret != -EACCES) { |
| + pm_runtime_put_autosuspend(dev->dev); |
| return ret; |
| + } |
| |
| switch (_IOC_NR(cmd) - DRM_COMMAND_BASE) { |
| case DRM_NOUVEAU_NVIF: |
| diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c |
| index f5ece1f949734..f941ce8f81e3a 100644 |
| --- a/drivers/gpu/drm/nouveau/nouveau_gem.c |
| +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c |
| @@ -45,8 +45,10 @@ nouveau_gem_object_del(struct drm_gem_object *gem) |
| int ret; |
| |
| ret = pm_runtime_get_sync(dev); |
| - if (WARN_ON(ret < 0 && ret != -EACCES)) |
| + if (WARN_ON(ret < 0 && ret != -EACCES)) { |
| + pm_runtime_put_autosuspend(dev); |
| return; |
| + } |
| |
| if (gem->import_attach) |
| drm_prime_gem_destroy(gem, nvbo->bo.sg); |
| -- |
| 2.25.1 |
| |