All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 1/3] [media] coda: Fix error paths
@ 2013-07-23  1:38 Fabio Estevam
  2013-07-23  1:38 ` [PATCH v3 2/3] [media] coda: Check the return value from clk_prepare_enable() Fabio Estevam
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Fabio Estevam @ 2013-07-23  1:38 UTC (permalink / raw)
  To: k.debski; +Cc: m.chehab, kernel, linux-media, Fabio Estevam

From: Fabio Estevam <fabio.estevam@freescale.com>

Some resources were not being released in the error path and some were released
in the incorrect order.

Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
---
Changes since v2:
- Newly introduced in this series

 drivers/media/platform/coda.c | 32 ++++++++++++++++++++------------
 1 file changed, 20 insertions(+), 12 deletions(-)

diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c
index df4ada88..ea16c20 100644
--- a/drivers/media/platform/coda.c
+++ b/drivers/media/platform/coda.c
@@ -1514,15 +1514,17 @@ static int coda_open(struct file *file)
 	int ret = 0;
 	int idx;
 
-	idx = coda_next_free_instance(dev);
-	if (idx >= CODA_MAX_INSTANCES)
-		return -EBUSY;
-	set_bit(idx, &dev->instance_mask);
-
 	ctx = kzalloc(sizeof *ctx, GFP_KERNEL);
 	if (!ctx)
 		return -ENOMEM;
 
+	idx = coda_next_free_instance(dev);
+	if (idx >= CODA_MAX_INSTANCES) {
+		ret =  -EBUSY;
+		goto err_coda_max;
+	}
+	set_bit(idx, &dev->instance_mask);
+
 	v4l2_fh_init(&ctx->fh, video_devdata(file));
 	file->private_data = &ctx->fh;
 	v4l2_fh_add(&ctx->fh);
@@ -1537,12 +1539,12 @@ static int coda_open(struct file *file)
 
 		v4l2_err(&dev->v4l2_dev, "%s return error (%d)\n",
 			 __func__, ret);
-		goto err;
+		goto err_ctx_init;
 	}
 	ret = coda_ctrls_setup(ctx);
 	if (ret) {
 		v4l2_err(&dev->v4l2_dev, "failed to setup coda controls\n");
-		goto err;
+		goto err_ctrls_setup;
 	}
 
 	ctx->fh.ctrl_handler = &ctx->ctrls;
@@ -1552,7 +1554,7 @@ static int coda_open(struct file *file)
 	if (!ctx->parabuf.vaddr) {
 		v4l2_err(&dev->v4l2_dev, "failed to allocate parabuf");
 		ret = -ENOMEM;
-		goto err;
+		goto err_dma_alloc;
 	}
 
 	coda_lock(ctx);
@@ -1567,9 +1569,15 @@ static int coda_open(struct file *file)
 
 	return 0;
 
-err:
+err_dma_alloc:
+	v4l2_ctrl_handler_free(&ctx->ctrls);
+err_ctrls_setup:
+	v4l2_m2m_ctx_release(ctx->m2m_ctx);
+err_ctx_init:
 	v4l2_fh_del(&ctx->fh);
 	v4l2_fh_exit(&ctx->fh);
+	clear_bit(ctx->idx, &dev->instance_mask);
+err_coda_max:
 	kfree(ctx);
 	return ret;
 }
@@ -1582,16 +1590,16 @@ static int coda_release(struct file *file)
 	v4l2_dbg(1, coda_debug, &dev->v4l2_dev, "Releasing instance %p\n",
 		 ctx);
 
+	clk_disable_unprepare(dev->clk_ahb);
+	clk_disable_unprepare(dev->clk_per);
 	coda_lock(ctx);
 	list_del(&ctx->list);
 	coda_unlock(ctx);
 
 	dma_free_coherent(&dev->plat_dev->dev, CODA_PARA_BUF_SIZE,
 		ctx->parabuf.vaddr, ctx->parabuf.paddr);
-	v4l2_m2m_ctx_release(ctx->m2m_ctx);
 	v4l2_ctrl_handler_free(&ctx->ctrls);
-	clk_disable_unprepare(dev->clk_per);
-	clk_disable_unprepare(dev->clk_ahb);
+	v4l2_m2m_ctx_release(ctx->m2m_ctx);
 	v4l2_fh_del(&ctx->fh);
 	v4l2_fh_exit(&ctx->fh);
 	clear_bit(ctx->idx, &dev->instance_mask);
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v3 2/3] [media] coda: Check the return value from clk_prepare_enable()
  2013-07-23  1:38 [PATCH v3 1/3] [media] coda: Fix error paths Fabio Estevam
@ 2013-07-23  1:38 ` Fabio Estevam
  2013-07-23 13:06   ` Philipp Zabel
  2013-07-23  1:38 ` [PATCH v3 3/3] [media] coda: No need to check the return value of platform_get_resource() Fabio Estevam
  2013-07-23 13:03 ` [PATCH v3 1/3] [media] coda: Fix error paths Philipp Zabel
  2 siblings, 1 reply; 5+ messages in thread
From: Fabio Estevam @ 2013-07-23  1:38 UTC (permalink / raw)
  To: k.debski; +Cc: m.chehab, kernel, linux-media, Fabio Estevam

From: Fabio Estevam <fabio.estevam@freescale.com>

clk_prepare_enable() may fail, so let's check its return value and propagate it
in the case of error.

Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
---
- Changes since v2:
- Release the previously acquired resources
Changes since v1:
- Add missing 'if'

 drivers/media/platform/coda.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c
index ea16c20..5f15aaa 100644
--- a/drivers/media/platform/coda.c
+++ b/drivers/media/platform/coda.c
@@ -1561,14 +1561,27 @@ static int coda_open(struct file *file)
 	list_add(&ctx->list, &dev->instances);
 	coda_unlock(ctx);
 
-	clk_prepare_enable(dev->clk_per);
-	clk_prepare_enable(dev->clk_ahb);
+	ret = clk_prepare_enable(dev->clk_per);
+	if (ret)
+		goto err_clk_per;
+
+	ret = clk_prepare_enable(dev->clk_ahb);
+	if (ret)
+		goto err_clk_ahb;
 
 	v4l2_dbg(1, coda_debug, &dev->v4l2_dev, "Created instance %d (%p)\n",
 		 ctx->idx, ctx);
 
 	return 0;
 
+err_clk_ahb:
+	clk_disable_unprepare(dev->clk_per);
+err_clk_per:
+	coda_lock(ctx);
+	list_del(&ctx->list);
+	coda_unlock(ctx);
+	dma_free_coherent(&dev->plat_dev->dev, CODA_PARA_BUF_SIZE,
+			  ctx->parabuf.vaddr, ctx->parabuf.paddr);
 err_dma_alloc:
 	v4l2_ctrl_handler_free(&ctx->ctrls);
 err_ctrls_setup:
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v3 3/3] [media] coda: No need to check the return value of platform_get_resource()
  2013-07-23  1:38 [PATCH v3 1/3] [media] coda: Fix error paths Fabio Estevam
  2013-07-23  1:38 ` [PATCH v3 2/3] [media] coda: Check the return value from clk_prepare_enable() Fabio Estevam
@ 2013-07-23  1:38 ` Fabio Estevam
  2013-07-23 13:03 ` [PATCH v3 1/3] [media] coda: Fix error paths Philipp Zabel
  2 siblings, 0 replies; 5+ messages in thread
From: Fabio Estevam @ 2013-07-23  1:38 UTC (permalink / raw)
  To: k.debski; +Cc: m.chehab, kernel, linux-media, Fabio Estevam

From: Fabio Estevam <fabio.estevam@freescale.com>

When using devm_ioremap_resource(), we do not need to check the return value of
platform_get_resource(), so just remove it.

Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
---
Changes since v2:
- None
Changes since v1:
- None

 drivers/media/platform/coda.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c
index 5f15aaa..78c9236 100644
--- a/drivers/media/platform/coda.c
+++ b/drivers/media/platform/coda.c
@@ -2053,11 +2053,6 @@ static int coda_probe(struct platform_device *pdev)
 
 	/* Get  memory for physical registers */
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	if (res == NULL) {
-		dev_err(&pdev->dev, "failed to get memory region resource\n");
-		return -ENOENT;
-	}
-
 	dev->regs_base = devm_ioremap_resource(&pdev->dev, res);
 	if (IS_ERR(dev->regs_base))
 		return PTR_ERR(dev->regs_base);
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 1/3] [media] coda: Fix error paths
  2013-07-23  1:38 [PATCH v3 1/3] [media] coda: Fix error paths Fabio Estevam
  2013-07-23  1:38 ` [PATCH v3 2/3] [media] coda: Check the return value from clk_prepare_enable() Fabio Estevam
  2013-07-23  1:38 ` [PATCH v3 3/3] [media] coda: No need to check the return value of platform_get_resource() Fabio Estevam
@ 2013-07-23 13:03 ` Philipp Zabel
  2 siblings, 0 replies; 5+ messages in thread
From: Philipp Zabel @ 2013-07-23 13:03 UTC (permalink / raw)
  To: Fabio Estevam; +Cc: k.debski, m.chehab, kernel, linux-media, Fabio Estevam

Hi Fabio,

Am Montag, den 22.07.2013, 22:38 -0300 schrieb Fabio Estevam:
> From: Fabio Estevam <fabio.estevam@freescale.com>
> 
> Some resources were not being released in the error path and some were released
> in the incorrect order.
> 
> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
> ---
> Changes since v2:
> - Newly introduced in this series
> 
>  drivers/media/platform/coda.c | 32 ++++++++++++++++++++------------
>  1 file changed, 20 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c
> index df4ada88..ea16c20 100644
> --- a/drivers/media/platform/coda.c
> +++ b/drivers/media/platform/coda.c
> @@ -1514,15 +1514,17 @@ static int coda_open(struct file *file)
>  	int ret = 0;
>  	int idx;
>  
> -	idx = coda_next_free_instance(dev);
> -	if (idx >= CODA_MAX_INSTANCES)
> -		return -EBUSY;
> -	set_bit(idx, &dev->instance_mask);
> -
>  	ctx = kzalloc(sizeof *ctx, GFP_KERNEL);
>  	if (!ctx)
>  		return -ENOMEM;
>  
> +	idx = coda_next_free_instance(dev);
> +	if (idx >= CODA_MAX_INSTANCES) {
> +		ret =  -EBUSY;
> +		goto err_coda_max;
> +	}
> +	set_bit(idx, &dev->instance_mask);
> +
>  	v4l2_fh_init(&ctx->fh, video_devdata(file));
>  	file->private_data = &ctx->fh;
>  	v4l2_fh_add(&ctx->fh);
> @@ -1537,12 +1539,12 @@ static int coda_open(struct file *file)
>  
>  		v4l2_err(&dev->v4l2_dev, "%s return error (%d)\n",
>  			 __func__, ret);
> -		goto err;
> +		goto err_ctx_init;
>  	}
>  	ret = coda_ctrls_setup(ctx);
>  	if (ret) {
>  		v4l2_err(&dev->v4l2_dev, "failed to setup coda controls\n");
> -		goto err;
> +		goto err_ctrls_setup;
>  	}
>  
>  	ctx->fh.ctrl_handler = &ctx->ctrls;
> @@ -1552,7 +1554,7 @@ static int coda_open(struct file *file)
>  	if (!ctx->parabuf.vaddr) {
>  		v4l2_err(&dev->v4l2_dev, "failed to allocate parabuf");
>  		ret = -ENOMEM;
> -		goto err;
> +		goto err_dma_alloc;
>  	}
>  
>  	coda_lock(ctx);
> @@ -1567,9 +1569,15 @@ static int coda_open(struct file *file)
>  
>  	return 0;
>  
> -err:
> +err_dma_alloc:
> +	v4l2_ctrl_handler_free(&ctx->ctrls);
> +err_ctrls_setup:
> +	v4l2_m2m_ctx_release(ctx->m2m_ctx);
> +err_ctx_init:
>  	v4l2_fh_del(&ctx->fh);
>  	v4l2_fh_exit(&ctx->fh);
> +	clear_bit(ctx->idx, &dev->instance_mask);
> +err_coda_max:
>  	kfree(ctx);
>  	return ret;
>  }
> @@ -1582,16 +1590,16 @@ static int coda_release(struct file *file)
>  	v4l2_dbg(1, coda_debug, &dev->v4l2_dev, "Releasing instance %p\n",
>  		 ctx);
>  
> +	clk_disable_unprepare(dev->clk_ahb);
> +	clk_disable_unprepare(dev->clk_per);
>  	coda_lock(ctx);
>  	list_del(&ctx->list);
>  	coda_unlock(ctx);
>  
>  	dma_free_coherent(&dev->plat_dev->dev, CODA_PARA_BUF_SIZE,
>  		ctx->parabuf.vaddr, ctx->parabuf.paddr);
> -	v4l2_m2m_ctx_release(ctx->m2m_ctx);
>  	v4l2_ctrl_handler_free(&ctx->ctrls);
> -	clk_disable_unprepare(dev->clk_per);
> -	clk_disable_unprepare(dev->clk_ahb);
> +	v4l2_m2m_ctx_release(ctx->m2m_ctx);

the clocks must not be disabled until after v4l2_m2m_ctx_release
returns: this function might wait for the currently running job to
finish.

>  	v4l2_fh_del(&ctx->fh);
>  	v4l2_fh_exit(&ctx->fh);
>  	clear_bit(ctx->idx, &dev->instance_mask);

regards
Philipp


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 2/3] [media] coda: Check the return value from clk_prepare_enable()
  2013-07-23  1:38 ` [PATCH v3 2/3] [media] coda: Check the return value from clk_prepare_enable() Fabio Estevam
@ 2013-07-23 13:06   ` Philipp Zabel
  0 siblings, 0 replies; 5+ messages in thread
From: Philipp Zabel @ 2013-07-23 13:06 UTC (permalink / raw)
  To: Fabio Estevam; +Cc: k.debski, m.chehab, kernel, linux-media, Fabio Estevam

Hi Fabio,

Am Montag, den 22.07.2013, 22:38 -0300 schrieb Fabio Estevam:
> From: Fabio Estevam <fabio.estevam@freescale.com>
> 
> clk_prepare_enable() may fail, so let's check its return value and propagate it
> in the case of error.
> 
> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
> ---
> - Changes since v2:
> - Release the previously acquired resources
> Changes since v1:
> - Add missing 'if'
> 
>  drivers/media/platform/coda.c | 17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c
> index ea16c20..5f15aaa 100644
> --- a/drivers/media/platform/coda.c
> +++ b/drivers/media/platform/coda.c
> @@ -1561,14 +1561,27 @@ static int coda_open(struct file *file)
>  	list_add(&ctx->list, &dev->instances);
>  	coda_unlock(ctx);
>  
> -	clk_prepare_enable(dev->clk_per);
> -	clk_prepare_enable(dev->clk_ahb);
> +	ret = clk_prepare_enable(dev->clk_per);
> +	if (ret)
> +		goto err_clk_per;
> +
> +	ret = clk_prepare_enable(dev->clk_ahb);
> +	if (ret)
> +		goto err_clk_ahb;
>  
>  	v4l2_dbg(1, coda_debug, &dev->v4l2_dev, "Created instance %d (%p)\n",
>  		 ctx->idx, ctx);
>  
>  	return 0;
>  
> +err_clk_ahb:
> +	clk_disable_unprepare(dev->clk_per);
> +err_clk_per:
> +	coda_lock(ctx);
> +	list_del(&ctx->list);
> +	coda_unlock(ctx);
> +	dma_free_coherent(&dev->plat_dev->dev, CODA_PARA_BUF_SIZE,
> +			  ctx->parabuf.vaddr, ctx->parabuf.paddr);
>  err_dma_alloc:
>  	v4l2_ctrl_handler_free(&ctx->ctrls);
>  err_ctrls_setup:

I still think the list_add() should be moved after the last possible
error case and the lock/list_del/unlock should be removed from the error
path.

regards
Philipp


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-07-23 13:07 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-07-23  1:38 [PATCH v3 1/3] [media] coda: Fix error paths Fabio Estevam
2013-07-23  1:38 ` [PATCH v3 2/3] [media] coda: Check the return value from clk_prepare_enable() Fabio Estevam
2013-07-23 13:06   ` Philipp Zabel
2013-07-23  1:38 ` [PATCH v3 3/3] [media] coda: No need to check the return value of platform_get_resource() Fabio Estevam
2013-07-23 13:03 ` [PATCH v3 1/3] [media] coda: Fix error paths Philipp Zabel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.