drm/tegra: Fix reference leak when pm_runtime_get_sync() fails
authorQinglang Miao <miaoqinglang@huawei.com>
Tue, 1 Dec 2020 12:56:31 +0000 (20:56 +0800)
committerThierry Reding <treding@nvidia.com>
Fri, 15 Jan 2021 16:24:51 +0000 (17:24 +0100)
The PM reference count is not expected to be incremented on return in
these Tegra functions.

However, pm_runtime_get_sync() will increment the PM reference count
even on failure. Forgetting to put the reference again will result in
a leak.

Replace it with pm_runtime_resume_and_get() to keep the usage counter
balanced.

Fixes: fd67e9c6ed5a ("drm/tegra: Do not implement runtime PM")
Reported-by: Hulk Robot <hulkci@huawei.com>
Signed-off-by: Qinglang Miao <miaoqinglang@huawei.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/drm/tegra/dc.c
drivers/gpu/drm/tegra/dsi.c
drivers/gpu/drm/tegra/hdmi.c
drivers/gpu/drm/tegra/hub.c
drivers/gpu/drm/tegra/sor.c
drivers/gpu/drm/tegra/vic.c

index 85dd713..0ae3a02 100644 (file)
@@ -2186,7 +2186,7 @@ static int tegra_dc_runtime_resume(struct host1x_client *client)
        struct device *dev = client->dev;
        int err;
 
-       err = pm_runtime_get_sync(dev);
+       err = pm_runtime_resume_and_get(dev);
        if (err < 0) {
                dev_err(dev, "failed to get runtime PM: %d\n", err);
                return err;
index 5691ef1..f46d377 100644 (file)
@@ -1111,7 +1111,7 @@ static int tegra_dsi_runtime_resume(struct host1x_client *client)
        struct device *dev = client->dev;
        int err;
 
-       err = pm_runtime_get_sync(dev);
+       err = pm_runtime_resume_and_get(dev);
        if (err < 0) {
                dev_err(dev, "failed to get runtime PM: %d\n", err);
                return err;
index d09a249..e5d2a40 100644 (file)
@@ -1510,7 +1510,7 @@ static int tegra_hdmi_runtime_resume(struct host1x_client *client)
        struct device *dev = client->dev;
        int err;
 
-       err = pm_runtime_get_sync(dev);
+       err = pm_runtime_resume_and_get(dev);
        if (err < 0) {
                dev_err(dev, "failed to get runtime PM: %d\n", err);
                return err;
index 22a03f7..5ce771c 100644 (file)
@@ -789,7 +789,7 @@ static int tegra_display_hub_runtime_resume(struct host1x_client *client)
        unsigned int i;
        int err;
 
-       err = pm_runtime_get_sync(dev);
+       err = pm_runtime_resume_and_get(dev);
        if (err < 0) {
                dev_err(dev, "failed to get runtime PM: %d\n", err);
                return err;
index cc2aa23..f02a035 100644 (file)
@@ -3218,7 +3218,7 @@ static int tegra_sor_runtime_resume(struct host1x_client *client)
        struct device *dev = client->dev;
        int err;
 
-       err = pm_runtime_get_sync(dev);
+       err = pm_runtime_resume_and_get(dev);
        if (err < 0) {
                dev_err(dev, "failed to get runtime PM: %d\n", err);
                return err;
index 48e98a6..77e1288 100644 (file)
@@ -331,7 +331,7 @@ static int vic_open_channel(struct tegra_drm_client *client,
        struct vic *vic = to_vic(client);
        int err;
 
-       err = pm_runtime_get_sync(vic->dev);
+       err = pm_runtime_resume_and_get(vic->dev);
        if (err < 0)
                return err;