From: Boris Brezillon <boris.brezillon@collabora.com>
To: Xin Xiong <xiongx18@fudan.edu.cn>
Cc: Tudor Ambarus <tudor.ambarus@microchip.com>,
Miquel Raynal <miquel.raynal@bootlin.com>,
Richard Weinberger <richard@nod.at>,
Vignesh Raghavendra <vigneshr@ti.com>,
Nicolas Ferre <nicolas.ferre@microchip.com>,
Alexandre Belloni <alexandre.belloni@bootlin.com>,
Claudiu Beznea <claudiu.beznea@microchip.com>,
Boris Brezillon <bbrezillon@kernel.org>,
linux-mtd@lists.infradead.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, yuanxzhang@fudan.edu.cn,
Xiyu Yang <xiyuyang19@fudan.edu.cn>,
Xin Tan <tanxin.ctf@gmail.com>
Subject: Re: [PATCH v2] mtd: rawnand: atmel: fix refcount issue in atmel_nand_controller_init
Date: Tue, 1 Mar 2022 09:50:37 +0100 [thread overview]
Message-ID: <20220301095037.1763e051@collabora.com> (raw)
In-Reply-To: <20220301044556.36162-1-xiongx18@fudan.edu.cn>
On Tue, 1 Mar 2022 12:45:56 +0800
Xin Xiong <xiongx18@fudan.edu.cn> wrote:
> The reference counting issue happens in several error handling paths
> on a refcounted object "nc->dmac". In these paths, the function simply
> returns the error code, forgetting to balance the reference count of
> "nc->dmac", increased earlier by dma_request_channel(), which may
> cause refcount leaks.
>
> Fix it by decrementing the refcount of specific object in those error
> paths.
>
> Fixes: f88fc122cc34 ("mtd: nand: Cleanup/rework the atmel_nand driver")
> Co-developed-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
> Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
> Co-developed-by: Xin Tan <tanxin.ctf@gmail.com>
> Signed-off-by: Xin Tan <tanxin.ctf@gmail.com>
> Signed-off-by: Xin Xiong <xiongx18@fudan.edu.cn>
> ---
> V1 -> V2: Rewrited the error handling block
> ---
> drivers/mtd/nand/raw/atmel/nand-controller.c | 18 +++++++++++++++---
> 1 file changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c b/drivers/mtd/nand/raw/atmel/nand-controller.c
> index f3276ee9e4fe..0efeb5d77be0 100644
> --- a/drivers/mtd/nand/raw/atmel/nand-controller.c
> +++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
> @@ -2060,13 +2060,15 @@ static int atmel_nand_controller_init(struct atmel_nand_controller *nc,
> nc->mck = of_clk_get(dev->parent->of_node, 0);
> if (IS_ERR(nc->mck)) {
> dev_err(dev, "Failed to retrieve MCK clk\n");
> - return PTR_ERR(nc->mck);
> + ret = PTR_ERR(nc->mck);
> + goto out_release_dma;
> }
>
> np = of_parse_phandle(dev->parent->of_node, "atmel,smc", 0);
> if (!np) {
> dev_err(dev, "Missing or invalid atmel,smc property\n");
> - return -EINVAL;
> + ret = -EINVAL;
> + goto out_release_dma;
> }
>
> nc->smc = syscon_node_to_regmap(np);
> @@ -2074,10 +2076,20 @@ static int atmel_nand_controller_init(struct atmel_nand_controller *nc,
> if (IS_ERR(nc->smc)) {
> ret = PTR_ERR(nc->smc);
> dev_err(dev, "Could not get SMC regmap (err = %d)\n", ret);
> - return ret;
> + goto out_release_dma;
> }
>
> return 0;
> +
> +out_release_dma:
> + if (nc->caps->has_dma && !atmel_nand_avoid_dma) {
> + if (nc->dmac) {
> + dma_release_channel(nc->dmac);
> + nc->dmac = NULL;
> + }
> + }
Nit:
if (nc->dmac)
dma_release_channel(nc->dmac);
should work just fine.
> +
> + return ret;
> }
>
> static int
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
WARNING: multiple messages have this Message-ID (diff)
From: Boris Brezillon <boris.brezillon@collabora.com>
To: Xin Xiong <xiongx18@fudan.edu.cn>
Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>,
yuanxzhang@fudan.edu.cn, Vignesh Raghavendra <vigneshr@ti.com>,
Xiyu Yang <xiyuyang19@fudan.edu.cn>,
Tudor Ambarus <tudor.ambarus@microchip.com>,
Richard Weinberger <richard@nod.at>,
Boris Brezillon <bbrezillon@kernel.org>,
linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org,
Xin Tan <tanxin.ctf@gmail.com>,
Miquel Raynal <miquel.raynal@bootlin.com>,
Claudiu Beznea <claudiu.beznea@microchip.com>,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v2] mtd: rawnand: atmel: fix refcount issue in atmel_nand_controller_init
Date: Tue, 1 Mar 2022 09:50:37 +0100 [thread overview]
Message-ID: <20220301095037.1763e051@collabora.com> (raw)
In-Reply-To: <20220301044556.36162-1-xiongx18@fudan.edu.cn>
On Tue, 1 Mar 2022 12:45:56 +0800
Xin Xiong <xiongx18@fudan.edu.cn> wrote:
> The reference counting issue happens in several error handling paths
> on a refcounted object "nc->dmac". In these paths, the function simply
> returns the error code, forgetting to balance the reference count of
> "nc->dmac", increased earlier by dma_request_channel(), which may
> cause refcount leaks.
>
> Fix it by decrementing the refcount of specific object in those error
> paths.
>
> Fixes: f88fc122cc34 ("mtd: nand: Cleanup/rework the atmel_nand driver")
> Co-developed-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
> Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
> Co-developed-by: Xin Tan <tanxin.ctf@gmail.com>
> Signed-off-by: Xin Tan <tanxin.ctf@gmail.com>
> Signed-off-by: Xin Xiong <xiongx18@fudan.edu.cn>
> ---
> V1 -> V2: Rewrited the error handling block
> ---
> drivers/mtd/nand/raw/atmel/nand-controller.c | 18 +++++++++++++++---
> 1 file changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c b/drivers/mtd/nand/raw/atmel/nand-controller.c
> index f3276ee9e4fe..0efeb5d77be0 100644
> --- a/drivers/mtd/nand/raw/atmel/nand-controller.c
> +++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
> @@ -2060,13 +2060,15 @@ static int atmel_nand_controller_init(struct atmel_nand_controller *nc,
> nc->mck = of_clk_get(dev->parent->of_node, 0);
> if (IS_ERR(nc->mck)) {
> dev_err(dev, "Failed to retrieve MCK clk\n");
> - return PTR_ERR(nc->mck);
> + ret = PTR_ERR(nc->mck);
> + goto out_release_dma;
> }
>
> np = of_parse_phandle(dev->parent->of_node, "atmel,smc", 0);
> if (!np) {
> dev_err(dev, "Missing or invalid atmel,smc property\n");
> - return -EINVAL;
> + ret = -EINVAL;
> + goto out_release_dma;
> }
>
> nc->smc = syscon_node_to_regmap(np);
> @@ -2074,10 +2076,20 @@ static int atmel_nand_controller_init(struct atmel_nand_controller *nc,
> if (IS_ERR(nc->smc)) {
> ret = PTR_ERR(nc->smc);
> dev_err(dev, "Could not get SMC regmap (err = %d)\n", ret);
> - return ret;
> + goto out_release_dma;
> }
>
> return 0;
> +
> +out_release_dma:
> + if (nc->caps->has_dma && !atmel_nand_avoid_dma) {
> + if (nc->dmac) {
> + dma_release_channel(nc->dmac);
> + nc->dmac = NULL;
> + }
> + }
Nit:
if (nc->dmac)
dma_release_channel(nc->dmac);
should work just fine.
> +
> + return ret;
> }
>
> static int
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
WARNING: multiple messages have this Message-ID (diff)
From: Boris Brezillon <boris.brezillon@collabora.com>
To: Xin Xiong <xiongx18@fudan.edu.cn>
Cc: Tudor Ambarus <tudor.ambarus@microchip.com>,
Miquel Raynal <miquel.raynal@bootlin.com>,
Richard Weinberger <richard@nod.at>,
Vignesh Raghavendra <vigneshr@ti.com>,
Nicolas Ferre <nicolas.ferre@microchip.com>,
Alexandre Belloni <alexandre.belloni@bootlin.com>,
Claudiu Beznea <claudiu.beznea@microchip.com>,
Boris Brezillon <bbrezillon@kernel.org>,
linux-mtd@lists.infradead.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, yuanxzhang@fudan.edu.cn,
Xiyu Yang <xiyuyang19@fudan.edu.cn>,
Xin Tan <tanxin.ctf@gmail.com>
Subject: Re: [PATCH v2] mtd: rawnand: atmel: fix refcount issue in atmel_nand_controller_init
Date: Tue, 1 Mar 2022 09:50:37 +0100 [thread overview]
Message-ID: <20220301095037.1763e051@collabora.com> (raw)
In-Reply-To: <20220301044556.36162-1-xiongx18@fudan.edu.cn>
On Tue, 1 Mar 2022 12:45:56 +0800
Xin Xiong <xiongx18@fudan.edu.cn> wrote:
> The reference counting issue happens in several error handling paths
> on a refcounted object "nc->dmac". In these paths, the function simply
> returns the error code, forgetting to balance the reference count of
> "nc->dmac", increased earlier by dma_request_channel(), which may
> cause refcount leaks.
>
> Fix it by decrementing the refcount of specific object in those error
> paths.
>
> Fixes: f88fc122cc34 ("mtd: nand: Cleanup/rework the atmel_nand driver")
> Co-developed-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
> Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
> Co-developed-by: Xin Tan <tanxin.ctf@gmail.com>
> Signed-off-by: Xin Tan <tanxin.ctf@gmail.com>
> Signed-off-by: Xin Xiong <xiongx18@fudan.edu.cn>
> ---
> V1 -> V2: Rewrited the error handling block
> ---
> drivers/mtd/nand/raw/atmel/nand-controller.c | 18 +++++++++++++++---
> 1 file changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c b/drivers/mtd/nand/raw/atmel/nand-controller.c
> index f3276ee9e4fe..0efeb5d77be0 100644
> --- a/drivers/mtd/nand/raw/atmel/nand-controller.c
> +++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
> @@ -2060,13 +2060,15 @@ static int atmel_nand_controller_init(struct atmel_nand_controller *nc,
> nc->mck = of_clk_get(dev->parent->of_node, 0);
> if (IS_ERR(nc->mck)) {
> dev_err(dev, "Failed to retrieve MCK clk\n");
> - return PTR_ERR(nc->mck);
> + ret = PTR_ERR(nc->mck);
> + goto out_release_dma;
> }
>
> np = of_parse_phandle(dev->parent->of_node, "atmel,smc", 0);
> if (!np) {
> dev_err(dev, "Missing or invalid atmel,smc property\n");
> - return -EINVAL;
> + ret = -EINVAL;
> + goto out_release_dma;
> }
>
> nc->smc = syscon_node_to_regmap(np);
> @@ -2074,10 +2076,20 @@ static int atmel_nand_controller_init(struct atmel_nand_controller *nc,
> if (IS_ERR(nc->smc)) {
> ret = PTR_ERR(nc->smc);
> dev_err(dev, "Could not get SMC regmap (err = %d)\n", ret);
> - return ret;
> + goto out_release_dma;
> }
>
> return 0;
> +
> +out_release_dma:
> + if (nc->caps->has_dma && !atmel_nand_avoid_dma) {
> + if (nc->dmac) {
> + dma_release_channel(nc->dmac);
> + nc->dmac = NULL;
> + }
> + }
Nit:
if (nc->dmac)
dma_release_channel(nc->dmac);
should work just fine.
> +
> + return ret;
> }
>
> static int
next prev parent reply other threads:[~2022-03-01 8:52 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-01 4:45 [PATCH v2] mtd: rawnand: atmel: fix refcount issue in atmel_nand_controller_init Xin Xiong
2022-03-01 4:45 ` Xin Xiong
2022-03-01 4:45 ` Xin Xiong
2022-03-01 8:50 ` Boris Brezillon [this message]
2022-03-01 8:50 ` Boris Brezillon
2022-03-01 8:50 ` Boris Brezillon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220301095037.1763e051@collabora.com \
--to=boris.brezillon@collabora.com \
--cc=alexandre.belloni@bootlin.com \
--cc=bbrezillon@kernel.org \
--cc=claudiu.beznea@microchip.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=miquel.raynal@bootlin.com \
--cc=nicolas.ferre@microchip.com \
--cc=richard@nod.at \
--cc=tanxin.ctf@gmail.com \
--cc=tudor.ambarus@microchip.com \
--cc=vigneshr@ti.com \
--cc=xiongx18@fudan.edu.cn \
--cc=xiyuyang19@fudan.edu.cn \
--cc=yuanxzhang@fudan.edu.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.