* [PATCH 00/78] media: use pm_runtime_resume_and_get() instead of pm_runtime_get_sync()
@ 2021-04-24 6:44 Mauro Carvalho Chehab
2021-04-24 6:44 ` [PATCH 17/78] staging: media: vde: use pm_runtime_resume_and_get() Mauro Carvalho Chehab
` (3 more replies)
0 siblings, 4 replies; 8+ messages in thread
From: Mauro Carvalho Chehab @ 2021-04-24 6:44 UTC (permalink / raw)
Cc: linuxarm, mauro.chehab, Mauro Carvalho Chehab, Lad, Prabhakar,
Paul J. Murphy, Alexandre Torgue, Andrzej Hajda,
Andrzej Pietrasiewicz, Andy Gross, Benoit Parrot, Bingbu Cao,
Bjorn Andersson, Chen-Yu Tsai, Chiranjeevi Rapolu,
Dafna Hirschfeld, Dan Scally, Daniele Alessandrelli,
Dave Stevenson, Dmitry Osipenko, Dongchun Zhu, Ezequiel Garcia,
Fabio Estevam, Heiko Stuebner, Helen Koike, Hyungwoo Yang,
Jacek Anaszewski, Jacob Chen, Jacopo Mondi, Jernej Skrabec,
Jonathan Hunter, Krzysztof Kozlowski, Leon Luo,
Manivannan Sadhasivam, Marek Szyprowski, Matt Ranostay,
Matthias Brugger, Mauro Carvalho Chehab, Maxime Coquelin,
Maxime Ripard, NXP Linux Team, Paul Kocialkowski,
Pengutronix Kernel Team, Philipp Zabel, Ricardo Ribalda,
Robert Foss, Rui Miguel Silva, Sakari Ailus, Sascha Hauer,
Shawn Guo, Shawn Tu, Shunqian Zheng, Sowjanya Komatineni,
Stanimir Varbanov, Steve Longerbeam, Sylwester Nawrocki,
Sylwester Nawrocki, Thierry Reding, Tianshu Qiu, Todor Tomov,
Wenyou Yang, Yong Zhi, devel, linux-arm-kernel, linux-arm-msm,
linux-kernel, linux-media, linux-mediatek, linux-renesas-soc,
linux-rockchip, linux-samsung-soc, linux-stm32, linux-tegra
During the review of the patches from unm.edu, one of the patterns
I noticed is the amount of patches trying to fix pm_runtime_get_sync()
calls.
On contrary of the common sense that a foo_get() function will
only increment the usage on success, pm_runtime_get_sync()
increments it unconditionally.
Due to that, there are bugs on lots of places, that ended being
gradually fixed, but, still there are a few places on media where
this is still broken.
Commit dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter")
added a new method to does a pm_runtime get, which increments
the usage count only on success.
This series replace all places where the old pm_runtime_get_sync()
is called, using pm_runtime_resume_and_get() instead.
This should help to avoid future mistakes like that, as people
tend to use the existing drivers as examples for newer ones.
compile-tested only.
Mauro Carvalho Chehab (78):
media: atmel: properly get pm_runtime
media: marvel-ccic: fix some issues when getting pm_runtime
media: mdk-mdp: fix pm_runtime_get_sync() usage count
media: rcar_fdp1: fix usage count
media: mdk-mdp: fix pm_runtime_get_sync() usage count
media: renesas-ceu: fix pm_runtime_get_sync() usage count
media: s5p: fix pm_runtime_get_sync() usage count
media: am437x:: fix pm_runtime_get_sync() usage count
media: sh_vou: fix pm_runtime_get_sync() usage count
media: sti/hva: use pm_runtime_resume_and_get()
staging: media: rkvdec: fix pm_runtime_get_sync() usage count
staging: media: atomisp_fops: use pm_runtime_resume_and_get()
staging: media: hantro_drv: use pm_runtime_resume_and_get()
staging: media: imx7-mipi-csis: use pm_runtime_resume_and_get()
staging: media: ipu3: use pm_runtime_resume_and_get()
staging: media: cedrus_video: use pm_runtime_resume_and_get()
staging: media: vde: use pm_runtime_resume_and_get()
staging: media: csi: use pm_runtime_resume_and_get()
staging: media: vi: use pm_runtime_resume_and_get()
media: mtk-vcodec: fix pm_runtime_get_sync() usage count
media: s5p-jpeg: fix pm_runtime_get_sync() usage count
media: delta-v4l2: fix pm_runtime_get_sync() usage count
media: sun8i_rotate: fix pm_runtime_get_sync() usage count
media: i2c: ak7375: use pm_runtime_resume_and_get()
media: i2c: ccs-core: use pm_runtime_resume_and_get()
media: i2c: dw9714: use pm_runtime_resume_and_get()
media: i2c: dw9768: use pm_runtime_resume_and_get()
media: i2c: dw9807-vcm: use pm_runtime_resume_and_get()
media: i2c: hi556: use pm_runtime_resume_and_get()
media: i2c: imx214: use pm_runtime_resume_and_get()
media: i2c: imx219: use pm_runtime_resume_and_get()
media: i2c: imx258: use pm_runtime_resume_and_get()
media: i2c: imx274: use pm_runtime_resume_and_get()
media: i2c: imx290: use pm_runtime_resume_and_get()
media: i2c: imx319: use pm_runtime_resume_and_get()
media: i2c: imx334: use pm_runtime_resume_and_get()
media: i2c: imx355: use pm_runtime_resume_and_get()
media: i2c: mt9m001: use pm_runtime_resume_and_get()
media: i2c: ov02a10: use pm_runtime_resume_and_get()
media: i2c: ov13858: use pm_runtime_resume_and_get()
media: i2c: ov2659: use pm_runtime_resume_and_get()
media: i2c: ov2685: use pm_runtime_resume_and_get()
media: i2c: ov2740: use pm_runtime_resume_and_get()
media: i2c: ov5647: use pm_runtime_resume_and_get()
media: i2c: ov5648: use pm_runtime_resume_and_get()
media: i2c: ov5670: use pm_runtime_resume_and_get()
media: i2c: ov5675: use pm_runtime_resume_and_get()
media: i2c: ov5695: use pm_runtime_resume_and_get()
media: i2c: ov7740: use pm_runtime_resume_and_get()
media: i2c: ov8856: use pm_runtime_resume_and_get()
media: i2c: ov8865: use pm_runtime_resume_and_get()
media: i2c: ov9734: use pm_runtime_resume_and_get()
media: i2c: tvp5150: use pm_runtime_resume_and_get()
media: i2c: video-i2c: use pm_runtime_resume_and_get()
media: ipu3: use pm_runtime_resume_and_get()
media: coda: use pm_runtime_resume_and_get()
media: exynos4-is: use pm_runtime_resume_and_get()
media: exynos-gsc: use pm_runtime_resume_and_get()
media: mtk-jpeg: use pm_runtime_resume_and_get()
media: camss-csid: use pm_runtime_resume_and_get()
media: camss-csiphy: use pm_runtime_resume_and_get()
media: camss-ispif: use pm_runtime_resume_and_get()
media: camss-vfe: use pm_runtime_resume_and_get()
media: core: use pm_runtime_resume_and_get()
media: pm_helpers: use pm_runtime_resume_and_get()
media: vdec: use pm_runtime_resume_and_get()
media: venc: use pm_runtime_resume_and_get()
media: rcar-fcp: use pm_runtime_resume_and_get()
media: rcar-vin: use pm_runtime_resume_and_get()
media: rga-buf: use pm_runtime_resume_and_get()
media: rkisp1-capture: use pm_runtime_resume_and_get()
media: s3c-camif: use pm_runtime_resume_and_get()
media: s5p-mfc: use pm_runtime_resume_and_get()
media: bdisp-v4l2: use pm_runtime_resume_and_get()
media: stm32: use pm_runtime_resume_and_get()
media: sun4i_v4l2: use pm_runtime_resume_and_get()
media: ti-vpe: use pm_runtime_resume_and_get()
media: vsp1: use pm_runtime_resume_and_get()
drivers/media/cec/platform/s5p/s5p_cec.c | 5 +++-
drivers/media/i2c/ak7375.c | 10 +------
drivers/media/i2c/ccs/ccs-core.c | 11 ++++----
drivers/media/i2c/dw9714.c | 10 +------
drivers/media/i2c/dw9768.c | 10 +------
drivers/media/i2c/dw9807-vcm.c | 10 +------
drivers/media/i2c/hi556.c | 3 +--
drivers/media/i2c/imx214.c | 6 ++---
drivers/media/i2c/imx219.c | 6 ++---
drivers/media/i2c/imx258.c | 6 ++---
drivers/media/i2c/imx274.c | 3 +--
drivers/media/i2c/imx290.c | 6 ++---
drivers/media/i2c/imx319.c | 6 ++---
drivers/media/i2c/imx334.c | 5 ++--
drivers/media/i2c/imx355.c | 6 ++---
drivers/media/i2c/mt9m001.c | 7 ++---
drivers/media/i2c/ov02a10.c | 6 ++---
drivers/media/i2c/ov13858.c | 6 ++---
drivers/media/i2c/ov2659.c | 6 ++---
drivers/media/i2c/ov2685.c | 7 +++--
drivers/media/i2c/ov2740.c | 6 ++---
drivers/media/i2c/ov5647.c | 9 ++++---
drivers/media/i2c/ov5648.c | 6 ++---
drivers/media/i2c/ov5670.c | 6 ++---
drivers/media/i2c/ov5675.c | 3 +--
drivers/media/i2c/ov5695.c | 6 ++---
drivers/media/i2c/ov7740.c | 8 +++---
drivers/media/i2c/ov8856.c | 3 +--
drivers/media/i2c/ov8865.c | 6 ++---
drivers/media/i2c/ov9734.c | 3 +--
drivers/media/i2c/tvp5150.c | 16 +++---------
drivers/media/i2c/video-i2c.c | 14 ++++------
drivers/media/pci/intel/ipu3/ipu3-cio2-main.c | 3 +--
drivers/media/platform/am437x/am437x-vpfe.c | 10 ++++---
drivers/media/platform/atmel/atmel-isc-base.c | 26 ++++++++++++++-----
drivers/media/platform/atmel/atmel-isi.c | 19 +++++++++++---
drivers/media/platform/coda/coda-common.c | 2 +-
drivers/media/platform/exynos-gsc/gsc-core.c | 3 +--
drivers/media/platform/exynos-gsc/gsc-m2m.c | 2 +-
.../media/platform/exynos4-is/fimc-capture.c | 6 ++---
drivers/media/platform/exynos4-is/fimc-is.c | 3 ++-
.../platform/exynos4-is/fimc-isp-video.c | 3 +--
drivers/media/platform/exynos4-is/fimc-isp.c | 7 +++--
drivers/media/platform/exynos4-is/fimc-lite.c | 5 ++--
drivers/media/platform/exynos4-is/fimc-m2m.c | 2 +-
drivers/media/platform/exynos4-is/media-dev.c | 8 +++---
drivers/media/platform/exynos4-is/mipi-csis.c | 5 ++--
.../media/platform/marvell-ccic/mcam-core.c | 9 +++++--
.../media/platform/mtk-jpeg/mtk_jpeg_core.c | 4 +--
drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c | 6 ++---
.../platform/mtk-vcodec/mtk_vcodec_dec_pm.c | 4 +--
.../media/platform/qcom/camss/camss-csid.c | 6 ++---
.../media/platform/qcom/camss/camss-csiphy.c | 6 ++---
.../media/platform/qcom/camss/camss-ispif.c | 6 ++---
drivers/media/platform/qcom/camss/camss-vfe.c | 5 ++--
drivers/media/platform/qcom/venus/core.c | 19 +++++++-------
.../media/platform/qcom/venus/pm_helpers.c | 10 +++----
drivers/media/platform/qcom/venus/vdec.c | 4 +--
drivers/media/platform/qcom/venus/venc.c | 5 ++--
drivers/media/platform/rcar-fcp.c | 6 ++---
drivers/media/platform/rcar-vin/rcar-csi2.c | 2 +-
drivers/media/platform/rcar-vin/rcar-dma.c | 6 ++---
drivers/media/platform/rcar-vin/rcar-v4l2.c | 6 ++---
drivers/media/platform/rcar_fdp1.c | 12 +++++++--
drivers/media/platform/renesas-ceu.c | 5 +++-
drivers/media/platform/rockchip/rga/rga-buf.c | 3 +--
drivers/media/platform/rockchip/rga/rga.c | 4 ++-
.../platform/rockchip/rkisp1/rkisp1-capture.c | 3 +--
.../media/platform/s3c-camif/camif-capture.c | 5 ++--
drivers/media/platform/s3c-camif/camif-core.c | 5 ++--
drivers/media/platform/s5p-jpeg/jpeg-core.c | 2 +-
drivers/media/platform/s5p-mfc/s5p_mfc_pm.c | 6 ++---
drivers/media/platform/sh_vou.c | 6 ++++-
drivers/media/platform/sti/bdisp/bdisp-v4l2.c | 7 ++---
drivers/media/platform/sti/delta/delta-v4l2.c | 4 +--
drivers/media/platform/sti/hva/hva-hw.c | 17 ++++++------
drivers/media/platform/stm32/stm32-dcmi.c | 5 ++--
.../platform/sunxi/sun4i-csi/sun4i_v4l2.c | 7 +++--
.../sunxi/sun8i-rotate/sun8i_rotate.c | 2 +-
drivers/media/platform/ti-vpe/cal-video.c | 4 ++-
drivers/media/platform/ti-vpe/cal.c | 8 +++---
drivers/media/platform/ti-vpe/vpe.c | 4 +--
drivers/media/platform/vsp1/vsp1_drv.c | 6 ++---
.../staging/media/atomisp/pci/atomisp_fops.c | 6 ++---
drivers/staging/media/hantro/hantro_drv.c | 2 +-
drivers/staging/media/imx/imx7-mipi-csis.c | 7 +++--
drivers/staging/media/ipu3/ipu3.c | 3 +--
drivers/staging/media/rkvdec/rkvdec.c | 2 +-
.../staging/media/sunxi/cedrus/cedrus_video.c | 6 ++---
drivers/staging/media/tegra-vde/vde.c | 16 +++++++-----
drivers/staging/media/tegra-video/csi.c | 3 +--
drivers/staging/media/tegra-video/vi.c | 3 +--
92 files changed, 270 insertions(+), 322 deletions(-)
--
2.30.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 17/78] staging: media: vde: use pm_runtime_resume_and_get()
2021-04-24 6:44 [PATCH 00/78] media: use pm_runtime_resume_and_get() instead of pm_runtime_get_sync() Mauro Carvalho Chehab
@ 2021-04-24 6:44 ` Mauro Carvalho Chehab
2021-04-24 7:35 ` Dmitry Osipenko
2021-04-24 6:44 ` [PATCH 18/78] staging: media: csi: " Mauro Carvalho Chehab
` (2 subsequent siblings)
3 siblings, 1 reply; 8+ messages in thread
From: Mauro Carvalho Chehab @ 2021-04-24 6:44 UTC (permalink / raw)
Cc: linuxarm, mauro.chehab, Mauro Carvalho Chehab, Dmitry Osipenko,
Greg Kroah-Hartman, Jonathan Hunter, Mauro Carvalho Chehab,
Thierry Reding, devel, linux-kernel, linux-media, linux-tegra
Commit dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter")
added pm_runtime_resume_and_get() in order to automatically handle
dev->power.usage_count decrement on errors.
Use the new API, in order to cleanup the error check logic.
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
---
drivers/staging/media/tegra-vde/vde.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/drivers/staging/media/tegra-vde/vde.c b/drivers/staging/media/tegra-vde/vde.c
index 28845b5bafaf..8936f140a246 100644
--- a/drivers/staging/media/tegra-vde/vde.c
+++ b/drivers/staging/media/tegra-vde/vde.c
@@ -775,9 +775,9 @@ static int tegra_vde_ioctl_decode_h264(struct tegra_vde *vde,
if (ret)
goto release_dpb_frames;
- ret = pm_runtime_get_sync(dev);
+ ret = pm_runtime_resume_and_get(dev);
if (ret < 0)
- goto put_runtime_pm;
+ goto unlock;
/*
* We rely on the VDE registers reset value, otherwise VDE
@@ -843,6 +843,8 @@ static int tegra_vde_ioctl_decode_h264(struct tegra_vde *vde,
put_runtime_pm:
pm_runtime_mark_last_busy(dev);
pm_runtime_put_autosuspend(dev);
+
+unlock:
mutex_unlock(&vde->lock);
release_dpb_frames:
@@ -1069,8 +1071,8 @@ static int tegra_vde_probe(struct platform_device *pdev)
* power-cycle it in order to put hardware into a predictable lower
* power state.
*/
- pm_runtime_get_sync(dev);
- pm_runtime_put(dev);
+ if (pm_runtime_resume_and_get(dev) >= 0)
+ pm_runtime_put(dev);
return 0;
@@ -1088,8 +1090,9 @@ static int tegra_vde_remove(struct platform_device *pdev)
{
struct tegra_vde *vde = platform_get_drvdata(pdev);
struct device *dev = &pdev->dev;
+ int ret;
- pm_runtime_get_sync(dev);
+ ret = pm_runtime_resume_and_get(dev);
pm_runtime_dont_use_autosuspend(dev);
pm_runtime_disable(dev);
@@ -1097,7 +1100,8 @@ static int tegra_vde_remove(struct platform_device *pdev)
* Balance RPM state, the VDE power domain is left ON and hardware
* is clock-gated. It's safe to reboot machine now.
*/
- pm_runtime_put_noidle(dev);
+ if (ret >= 0)
+ pm_runtime_put_noidle(dev);
clk_disable_unprepare(vde->clk);
misc_deregister(&vde->miscdev);
--
2.30.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 18/78] staging: media: csi: use pm_runtime_resume_and_get()
2021-04-24 6:44 [PATCH 00/78] media: use pm_runtime_resume_and_get() instead of pm_runtime_get_sync() Mauro Carvalho Chehab
2021-04-24 6:44 ` [PATCH 17/78] staging: media: vde: use pm_runtime_resume_and_get() Mauro Carvalho Chehab
@ 2021-04-24 6:44 ` Mauro Carvalho Chehab
2021-04-24 6:44 ` [PATCH 19/78] staging: media: vi: " Mauro Carvalho Chehab
2021-04-28 10:13 ` [PATCH 00/78] media: use pm_runtime_resume_and_get() instead of pm_runtime_get_sync() Dan Carpenter
3 siblings, 0 replies; 8+ messages in thread
From: Mauro Carvalho Chehab @ 2021-04-24 6:44 UTC (permalink / raw)
Cc: linuxarm, mauro.chehab, Mauro Carvalho Chehab, Greg Kroah-Hartman,
Jonathan Hunter, Mauro Carvalho Chehab, Sowjanya Komatineni,
Thierry Reding, devel, linux-kernel, linux-media, linux-tegra
Commit dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter")
added pm_runtime_resume_and_get() in order to automatically handle
dev->power.usage_count decrement on errors.
Use the new API, in order to cleanup the error check logic.
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
---
drivers/staging/media/tegra-video/csi.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/staging/media/tegra-video/csi.c b/drivers/staging/media/tegra-video/csi.c
index 033a6935c26d..e938bf4c48b6 100644
--- a/drivers/staging/media/tegra-video/csi.c
+++ b/drivers/staging/media/tegra-video/csi.c
@@ -298,10 +298,9 @@ static int tegra_csi_enable_stream(struct v4l2_subdev *subdev)
struct tegra_csi *csi = csi_chan->csi;
int ret, err;
- ret = pm_runtime_get_sync(csi->dev);
+ ret = pm_runtime_resume_and_get(csi->dev);
if (ret < 0) {
dev_err(csi->dev, "failed to get runtime PM: %d\n", ret);
- pm_runtime_put_noidle(csi->dev);
return ret;
}
--
2.30.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 19/78] staging: media: vi: use pm_runtime_resume_and_get()
2021-04-24 6:44 [PATCH 00/78] media: use pm_runtime_resume_and_get() instead of pm_runtime_get_sync() Mauro Carvalho Chehab
2021-04-24 6:44 ` [PATCH 17/78] staging: media: vde: use pm_runtime_resume_and_get() Mauro Carvalho Chehab
2021-04-24 6:44 ` [PATCH 18/78] staging: media: csi: " Mauro Carvalho Chehab
@ 2021-04-24 6:44 ` Mauro Carvalho Chehab
2021-04-28 10:13 ` [PATCH 00/78] media: use pm_runtime_resume_and_get() instead of pm_runtime_get_sync() Dan Carpenter
3 siblings, 0 replies; 8+ messages in thread
From: Mauro Carvalho Chehab @ 2021-04-24 6:44 UTC (permalink / raw)
Cc: linuxarm, mauro.chehab, Mauro Carvalho Chehab, Greg Kroah-Hartman,
Jonathan Hunter, Mauro Carvalho Chehab, Sowjanya Komatineni,
Thierry Reding, devel, linux-kernel, linux-media, linux-tegra
Commit dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter")
added pm_runtime_resume_and_get() in order to automatically handle
dev->power.usage_count decrement on errors.
Use the new API, in order to cleanup the error check logic.
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
---
drivers/staging/media/tegra-video/vi.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/staging/media/tegra-video/vi.c b/drivers/staging/media/tegra-video/vi.c
index 7a09061cda57..1298740a9c6c 100644
--- a/drivers/staging/media/tegra-video/vi.c
+++ b/drivers/staging/media/tegra-video/vi.c
@@ -297,10 +297,9 @@ static int tegra_channel_start_streaming(struct vb2_queue *vq, u32 count)
struct tegra_vi_channel *chan = vb2_get_drv_priv(vq);
int ret;
- ret = pm_runtime_get_sync(chan->vi->dev);
+ ret = pm_runtime_resume_and_get(chan->vi->dev);
if (ret < 0) {
dev_err(chan->vi->dev, "failed to get runtime PM: %d\n", ret);
- pm_runtime_put_noidle(chan->vi->dev);
return ret;
}
--
2.30.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 17/78] staging: media: vde: use pm_runtime_resume_and_get()
2021-04-24 6:44 ` [PATCH 17/78] staging: media: vde: use pm_runtime_resume_and_get() Mauro Carvalho Chehab
@ 2021-04-24 7:35 ` Dmitry Osipenko
2021-04-27 9:22 ` Mauro Carvalho Chehab
0 siblings, 1 reply; 8+ messages in thread
From: Dmitry Osipenko @ 2021-04-24 7:35 UTC (permalink / raw)
To: Mauro Carvalho Chehab
Cc: linuxarm, mauro.chehab, Greg Kroah-Hartman, Jonathan Hunter,
Mauro Carvalho Chehab, Thierry Reding, devel, linux-kernel,
linux-media, linux-tegra
24.04.2021 09:44, Mauro Carvalho Chehab пишет:
> Commit dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter")
> added pm_runtime_resume_and_get() in order to automatically handle
> dev->power.usage_count decrement on errors.
>
> Use the new API, in order to cleanup the error check logic.
>
> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
> ---
> drivers/staging/media/tegra-vde/vde.c | 16 ++++++++++------
> 1 file changed, 10 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/staging/media/tegra-vde/vde.c b/drivers/staging/media/tegra-vde/vde.c
> index 28845b5bafaf..8936f140a246 100644
> --- a/drivers/staging/media/tegra-vde/vde.c
> +++ b/drivers/staging/media/tegra-vde/vde.c
> @@ -775,9 +775,9 @@ static int tegra_vde_ioctl_decode_h264(struct tegra_vde *vde,
> if (ret)
> goto release_dpb_frames;
>
> - ret = pm_runtime_get_sync(dev);
> + ret = pm_runtime_resume_and_get(dev);
> if (ret < 0)
> - goto put_runtime_pm;
> + goto unlock;
>
> /*
> * We rely on the VDE registers reset value, otherwise VDE
> @@ -843,6 +843,8 @@ static int tegra_vde_ioctl_decode_h264(struct tegra_vde *vde,
> put_runtime_pm:
> pm_runtime_mark_last_busy(dev);
> pm_runtime_put_autosuspend(dev);
> +
> +unlock:
> mutex_unlock(&vde->lock);
>
> release_dpb_frames:
> @@ -1069,8 +1071,8 @@ static int tegra_vde_probe(struct platform_device *pdev)
> * power-cycle it in order to put hardware into a predictable lower
> * power state.
> */
> - pm_runtime_get_sync(dev);
> - pm_runtime_put(dev);
> + if (pm_runtime_resume_and_get(dev) >= 0)
> + pm_runtime_put(dev);
>
> return 0;
>
> @@ -1088,8 +1090,9 @@ static int tegra_vde_remove(struct platform_device *pdev)
> {
> struct tegra_vde *vde = platform_get_drvdata(pdev);
> struct device *dev = &pdev->dev;
> + int ret;
>
> - pm_runtime_get_sync(dev);
> + ret = pm_runtime_resume_and_get(dev);
> pm_runtime_dont_use_autosuspend(dev);
> pm_runtime_disable(dev);
>
> @@ -1097,7 +1100,8 @@ static int tegra_vde_remove(struct platform_device *pdev)
> * Balance RPM state, the VDE power domain is left ON and hardware
> * is clock-gated. It's safe to reboot machine now.
> */
> - pm_runtime_put_noidle(dev);
> + if (ret >= 0)
> + pm_runtime_put_noidle(dev);
> clk_disable_unprepare(vde->clk);
>
> misc_deregister(&vde->miscdev);
>
Hello Mauro,
Thank you very much for the patch. It looks to me that the original
variant was a bit simpler, this patch adds more code lines without
changing the previous behaviour. Or am I missing something?
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 17/78] staging: media: vde: use pm_runtime_resume_and_get()
2021-04-24 7:35 ` Dmitry Osipenko
@ 2021-04-27 9:22 ` Mauro Carvalho Chehab
2021-04-27 12:34 ` Johan Hovold
0 siblings, 1 reply; 8+ messages in thread
From: Mauro Carvalho Chehab @ 2021-04-27 9:22 UTC (permalink / raw)
To: Dmitry Osipenko
Cc: linuxarm, mauro.chehab, Greg Kroah-Hartman, Jonathan Hunter,
Mauro Carvalho Chehab, Thierry Reding, devel, linux-kernel,
linux-media, linux-tegra
Hi Dmitry,
Em Sat, 24 Apr 2021 10:35:22 +0300
Dmitry Osipenko <digetx@gmail.com> escreveu:
> 24.04.2021 09:44, Mauro Carvalho Chehab пишет:
> > Commit dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter")
> > added pm_runtime_resume_and_get() in order to automatically handle
> > dev->power.usage_count decrement on errors.
> >
> > Use the new API, in order to cleanup the error check logic.
> >
> > Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
> > ---
> > drivers/staging/media/tegra-vde/vde.c | 16 ++++++++++------
> > 1 file changed, 10 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/staging/media/tegra-vde/vde.c b/drivers/staging/media/tegra-vde/vde.c
> > index 28845b5bafaf..8936f140a246 100644
> > --- a/drivers/staging/media/tegra-vde/vde.c
> > +++ b/drivers/staging/media/tegra-vde/vde.c
> > @@ -775,9 +775,9 @@ static int tegra_vde_ioctl_decode_h264(struct tegra_vde *vde,
> > if (ret)
> > goto release_dpb_frames;
> >
> > - ret = pm_runtime_get_sync(dev);
> > + ret = pm_runtime_resume_and_get(dev);
> > if (ret < 0)
> > - goto put_runtime_pm;
> > + goto unlock;
> >
> > /*
> > * We rely on the VDE registers reset value, otherwise VDE
> > @@ -843,6 +843,8 @@ static int tegra_vde_ioctl_decode_h264(struct tegra_vde *vde,
> > put_runtime_pm:
> > pm_runtime_mark_last_busy(dev);
> > pm_runtime_put_autosuspend(dev);
> > +
> > +unlock:
> > mutex_unlock(&vde->lock);
> >
> > release_dpb_frames:
> > @@ -1069,8 +1071,8 @@ static int tegra_vde_probe(struct platform_device *pdev)
> > * power-cycle it in order to put hardware into a predictable lower
> > * power state.
> > */
> > - pm_runtime_get_sync(dev);
> > - pm_runtime_put(dev);
> > + if (pm_runtime_resume_and_get(dev) >= 0)
> > + pm_runtime_put(dev);
> >
> > return 0;
> >
> > @@ -1088,8 +1090,9 @@ static int tegra_vde_remove(struct platform_device *pdev)
> > {
> > struct tegra_vde *vde = platform_get_drvdata(pdev);
> > struct device *dev = &pdev->dev;
> > + int ret;
> >
> > - pm_runtime_get_sync(dev);
> > + ret = pm_runtime_resume_and_get(dev);
> > pm_runtime_dont_use_autosuspend(dev);
> > pm_runtime_disable(dev);
> >
> > @@ -1097,7 +1100,8 @@ static int tegra_vde_remove(struct platform_device *pdev)
> > * Balance RPM state, the VDE power domain is left ON and hardware
> > * is clock-gated. It's safe to reboot machine now.
> > */
> > - pm_runtime_put_noidle(dev);
> > + if (ret >= 0)
> > + pm_runtime_put_noidle(dev);
> > clk_disable_unprepare(vde->clk);
> >
> > misc_deregister(&vde->miscdev);
> >
>
> Hello Mauro,
>
> Thank you very much for the patch. It looks to me that the original
> variant was a bit simpler, this patch adds more code lines without
> changing the previous behaviour. Or am I missing something?
While on several places the newer code is simpler, the end goal here is
to replace all occurrences of pm_runtime_get_sync() from the media
subsystem, due to the number of problems we're having with this:
1. despite its name, this is actually a PM runtime resume call,
but some developers didn't seem to realize that, as I got this
pattern on some drivers:
pm_runtime_get_sync(&client->dev);
pm_runtime_disable(&client->dev);
pm_runtime_set_suspended(&client->dev);
pm_runtime_put_noidle(&client->dev);
It makes no sense to resume PM just to suspend it again ;-)
The name of the new variant is a lot clearer:
pm_runtime_resume_and_get()
2. Usual *_get() methods only increment their use count on success,
but pm_runtime_get_sync() increments it unconditionally. Due to
that, several drivers were mistakenly not calling
pm_runtime_put_noidle() when it fails;
3. Consistency: we did similar changes subsystem wide with
for instance strlcpy() and strcpy() that got replaced by
strscpy(). Having all drivers using the same known-to-be-safe
methods is a good thing;
4. Prevent newer drivers to copy-and-paste a code that it would
be easier to break if they don't truly understand what's behind
the scenes.
Thanks,
Mauro
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 17/78] staging: media: vde: use pm_runtime_resume_and_get()
2021-04-27 9:22 ` Mauro Carvalho Chehab
@ 2021-04-27 12:34 ` Johan Hovold
0 siblings, 0 replies; 8+ messages in thread
From: Johan Hovold @ 2021-04-27 12:34 UTC (permalink / raw)
To: Mauro Carvalho Chehab
Cc: Dmitry Osipenko, devel, Greg Kroah-Hartman, linuxarm,
Jonathan Hunter, linux-tegra, Thierry Reding, mauro.chehab,
Mauro Carvalho Chehab, linux-kernel, linux-media
On Tue, Apr 27, 2021 at 11:22:50AM +0200, Mauro Carvalho Chehab wrote:
> Hi Dmitry,
>
> Em Sat, 24 Apr 2021 10:35:22 +0300
> Dmitry Osipenko <digetx@gmail.com> escreveu:
>
> > 24.04.2021 09:44, Mauro Carvalho Chehab пишет:
> > > Commit dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter")
> > > added pm_runtime_resume_and_get() in order to automatically handle
> > > dev->power.usage_count decrement on errors.
> > >
> > > Use the new API, in order to cleanup the error check logic.
> > >
> > > Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
> > > ---
> > > drivers/staging/media/tegra-vde/vde.c | 16 ++++++++++------
> > > 1 file changed, 10 insertions(+), 6 deletions(-)
> > >
> > > diff --git a/drivers/staging/media/tegra-vde/vde.c b/drivers/staging/media/tegra-vde/vde.c
> > > index 28845b5bafaf..8936f140a246 100644
> > > --- a/drivers/staging/media/tegra-vde/vde.c
> > > +++ b/drivers/staging/media/tegra-vde/vde.c
> > > @@ -775,9 +775,9 @@ static int tegra_vde_ioctl_decode_h264(struct tegra_vde *vde,
> > > if (ret)
> > > goto release_dpb_frames;
> > >
> > > - ret = pm_runtime_get_sync(dev);
> > > + ret = pm_runtime_resume_and_get(dev);
> > > if (ret < 0)
> > > - goto put_runtime_pm;
> > > + goto unlock;
> > >
> > > /*
> > > * We rely on the VDE registers reset value, otherwise VDE
> > > @@ -843,6 +843,8 @@ static int tegra_vde_ioctl_decode_h264(struct tegra_vde *vde,
> > > put_runtime_pm:
> > > pm_runtime_mark_last_busy(dev);
> > > pm_runtime_put_autosuspend(dev);
> > > +
> > > +unlock:
> > > mutex_unlock(&vde->lock);
> > >
> > > release_dpb_frames:
> > > @@ -1069,8 +1071,8 @@ static int tegra_vde_probe(struct platform_device *pdev)
> > > * power-cycle it in order to put hardware into a predictable lower
> > > * power state.
> > > */
> > > - pm_runtime_get_sync(dev);
> > > - pm_runtime_put(dev);
> > > + if (pm_runtime_resume_and_get(dev) >= 0)
> > > + pm_runtime_put(dev);
> > >
> > > return 0;
> > >
> > > @@ -1088,8 +1090,9 @@ static int tegra_vde_remove(struct platform_device *pdev)
> > > {
> > > struct tegra_vde *vde = platform_get_drvdata(pdev);
> > > struct device *dev = &pdev->dev;
> > > + int ret;
> > >
> > > - pm_runtime_get_sync(dev);
> > > + ret = pm_runtime_resume_and_get(dev);
> > > pm_runtime_dont_use_autosuspend(dev);
> > > pm_runtime_disable(dev);
> > >
> > > @@ -1097,7 +1100,8 @@ static int tegra_vde_remove(struct platform_device *pdev)
> > > * Balance RPM state, the VDE power domain is left ON and hardware
> > > * is clock-gated. It's safe to reboot machine now.
> > > */
> > > - pm_runtime_put_noidle(dev);
> > > + if (ret >= 0)
> > > + pm_runtime_put_noidle(dev);
> > > clk_disable_unprepare(vde->clk);
> > >
> > > misc_deregister(&vde->miscdev);
> > >
> >
> > Hello Mauro,
> >
> > Thank you very much for the patch. It looks to me that the original
> > variant was a bit simpler, this patch adds more code lines without
> > changing the previous behaviour. Or am I missing something?
I agree, the above does not look like an improvement at all.
> While on several places the newer code is simpler, the end goal here is
> to replace all occurrences of pm_runtime_get_sync() from the media
> subsystem, due to the number of problems we're having with this:
>
> 1. despite its name, this is actually a PM runtime resume call,
> but some developers didn't seem to realize that, as I got this
> pattern on some drivers:
>
> pm_runtime_get_sync(&client->dev);
> pm_runtime_disable(&client->dev);
> pm_runtime_set_suspended(&client->dev);
> pm_runtime_put_noidle(&client->dev);
>
> It makes no sense to resume PM just to suspend it again ;-)
It very well may. You're resuming the device and leaving it a defined
power state before balancing the PM count, cleaning up and unbinding the
driver.
> The name of the new variant is a lot clearer:
> pm_runtime_resume_and_get()
For people not used to the API perhaps.
> 2. Usual *_get() methods only increment their use count on success,
> but pm_runtime_get_sync() increments it unconditionally. Due to
> that, several drivers were mistakenly not calling
> pm_runtime_put_noidle() when it fails;
As I mentioned elsewhere, all pm_runtime_get calls increment the usage
count so the API is consistent.
> 3. Consistency: we did similar changes subsystem wide with
> for instance strlcpy() and strcpy() that got replaced by
> strscpy(). Having all drivers using the same known-to-be-safe
> methods is a good thing;
There's no know-to-be safe API. People will find ways to get this wrong
too.
And the old interface isn't going away from the kernel even if you
manage to not use it in media.
> 4. Prevent newer drivers to copy-and-paste a code that it would
> be easier to break if they don't truly understand what's behind
> the scenes.
Johan
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 00/78] media: use pm_runtime_resume_and_get() instead of pm_runtime_get_sync()
2021-04-24 6:44 [PATCH 00/78] media: use pm_runtime_resume_and_get() instead of pm_runtime_get_sync() Mauro Carvalho Chehab
` (2 preceding siblings ...)
2021-04-24 6:44 ` [PATCH 19/78] staging: media: vi: " Mauro Carvalho Chehab
@ 2021-04-28 10:13 ` Dan Carpenter
3 siblings, 0 replies; 8+ messages in thread
From: Dan Carpenter @ 2021-04-28 10:13 UTC (permalink / raw)
To: Mauro Carvalho Chehab
Cc: Shawn Tu, Ricardo Ribalda, Dafna Hirschfeld, Heiko Stuebner,
linuxarm, Todor Tomov, Bjorn Andersson, Andrzej Hajda,
Lad, Prabhakar, Thierry Reding, Pengutronix Kernel Team,
Dmitry Osipenko, linux-stm32, Andrzej Pietrasiewicz, Leon Luo,
Paul Kocialkowski, Mauro Carvalho Chehab, Dave Stevenson,
Matt Ranostay, Krzysztof Kozlowski, Jonathan Hunter,
linux-rockchip, Chen-Yu Tsai, Andy Gross, Matthias Brugger,
Dongchun Zhu, Sakari Ailus, Bingbu Cao, Marek Szyprowski,
Shunqian Zheng, Tianshu Qiu, NXP Linux Team, Philipp Zabel, devel,
Jacopo Mondi, Sylwester Nawrocki, linux-tegra, Alexandre Torgue,
Wenyou Yang, Manivannan Sadhasivam, linux-arm-msm, Sascha Hauer,
Steve Longerbeam, linux-media, Maxime Ripard, Stanimir Varbanov,
Benoit Parrot, Helen Koike, linux-samsung-soc, linux-mediatek,
Jacek Anaszewski, mauro.chehab, Sylwester Nawrocki,
Paul J. Murphy, Ezequiel Garcia, Daniele Alessandrelli,
Chiranjeevi Rapolu, linux-arm-kernel, Jacob Chen, Jernej Skrabec,
Hyungwoo Yang, linux-kernel, Robert Foss, Dan Scally,
Sowjanya Komatineni, Maxime Coquelin, linux-renesas-soc, Yong Zhi,
Shawn Guo
There was a Smatch check for these bugs. This was a good source of
recurring Reported-by tags for me. ;) Thanks for doing this.
regards,
dan carpenter
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2021-04-28 10:15 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-04-24 6:44 [PATCH 00/78] media: use pm_runtime_resume_and_get() instead of pm_runtime_get_sync() Mauro Carvalho Chehab
2021-04-24 6:44 ` [PATCH 17/78] staging: media: vde: use pm_runtime_resume_and_get() Mauro Carvalho Chehab
2021-04-24 7:35 ` Dmitry Osipenko
2021-04-27 9:22 ` Mauro Carvalho Chehab
2021-04-27 12:34 ` Johan Hovold
2021-04-24 6:44 ` [PATCH 18/78] staging: media: csi: " Mauro Carvalho Chehab
2021-04-24 6:44 ` [PATCH 19/78] staging: media: vi: " Mauro Carvalho Chehab
2021-04-28 10:13 ` [PATCH 00/78] media: use pm_runtime_resume_and_get() instead of pm_runtime_get_sync() Dan Carpenter
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox