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 85dd7131553afa065592032aa0ba9eff93785482..0ae3a025efe9d6f9566ef69a05021c627c16583a 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 5691ef1b0e586e42de911ff5fb6176afdb3ff0bd..f46d377f0c3046309c2bf1d12415f593f6aed467 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 d09a24931c87cbb8499490fdfba287401d0fbf04..e5d2a40260288742fd956931fd48416f46bdd1b5 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 22a03f7ffdc12f91cee667089dc79b9f9603bf13..5ce771cba1335f4d59466e88294e3bb993963e44 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 cc2aa2308a515820e9c1590cd598523032f91e6e..f02a035dda4532083540cef021d0c0e90d9b96d7 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 48e98a60ab6ef5bc0c5735e366e7e5d331b73c99..77e128832920eecb9b88cfc6e70545ed1dc74ca8 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;