| From e5c1ad41962db0da9f494dbca05e437cb1e54f4b Mon Sep 17 00:00:00 2001 |
| From: Aditya Pakki <pakki001@umn.edu> |
| Date: Sat, 13 Jun 2020 20:41:56 -0500 |
| Subject: [PATCH] drm/nouveau: fix multiple instances of reference count leaks |
| |
| commit 659fb5f154c3434c90a34586f3b7aa1c39cf6062 upstream. |
| |
| 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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c |
| index e6b2cd082544..425fe54da1f5 100644 |
| --- a/drivers/gpu/drm/nouveau/nouveau_drm.c |
| +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c |
| @@ -1050,8 +1050,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)); |
| @@ -1133,8 +1135,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 b4bda716564d..0f96beec66ac 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.27.0 |
| |