From: Boris Brezillon <boris.brezillon@bootlin.com>
To: Gregory CLEMENT <gregory.clement@bootlin.com>
Cc: Miquel Raynal <miquel.raynal@bootlin.com>,
linux-mtd@lists.infradead.org,
Jason Cooper <jason@lakedaemon.net>, Andrew Lunn <andrew@lunn.ch>,
Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
linux-arm-kernel@lists.infradead.org,
Antoine Tenart <antoine.tenart@bootlin.com>,
Nadav Haklai <nadavh@marvell.com>,
Shadi Ammouri <shadi@marvell.com>, Omri Itach <omrii@marvell.com>,
Hanna Hawa <hannah@marvell.com>,
Igal Liberman <igall@marvell.com>,
Marcin Wojtas <mw@semihalf.com>, Rob Herring <robh@kernel.org>,
"devicetree\@vger.kernel.org" <devicetree@vger.kernel.org>
Subject: Re: [PATCH v2] mtd: nand: marvell: Fix clock resource by adding a register clock
Date: Mon, 12 Mar 2018 20:35:29 +0100 [thread overview]
Message-ID: <20180312203529.7963ef29@bbrezillon> (raw)
In-Reply-To: <87vae11bep.fsf@bootlin.com>
On Mon, 12 Mar 2018 17:55:26 +0100
Gregory CLEMENT <gregory.clement@bootlin.com> wrote:
> >
> >> struct completion complete;
> >> unsigned long assigned_cs;
> >> struct list_head chips;
> >> @@ -2747,12 +2748,24 @@ static int marvell_nfc_probe(struct platform_device *pdev)
> >> if (ret)
> >> return ret;
> >>
> >> + nfc->reg_clk = devm_clk_get(&pdev->dev, "reg");
> >> + if (PTR_ERR(nfc->reg_clk) != -ENOENT) {
> >> + if (!IS_ERR(nfc->reg_clk)) {
> >> + ret = clk_prepare_enable(nfc->reg_clk);
> >> + if (ret)
> >> + goto unprepare_clk;
> >
> > I already suggested to move the devm_clk_get(&pdev->dev, "reg") before
> > the clk_prepare_enable(nfc->ecc_clk) one to simplify the error path.
> >
>
> Actually I started to implement your suggestion but unlike what you
> though it made the code less simpler. Indeed by having the mandatory
> clock first than in case of failure we can directly exit the function.
>
> If the reg clock was initialized first, then if the core/ecc clock fail
> in soem case we woudl need to daisbel the reg clock and in other case we
> could directly exit.
Well, it's pretty much the same problem if you do it in the order you
propose here: if the core clk enable fails, you'll have to disable the
reg clk. Plus, I'm not a big fan of if/else block imbrications when we
can avoid them.
>
>
> >> + } else {
> >> + ret = PTR_ERR(nfc->reg_clk);
> >> + goto unprepare_clk;
> >> + }
> >> + }
> >
> > So nfc->reg_clk stays assigned to -ENOENT if the clk is not present, and
> > clk_disable_unprepare() will manipulate an invalid pointer when called
> > from the error or ->remove() path.
>
> I think you missed the fact that the clk_disable_unprepare() function
> managed the invalid pointer, have a look on the functions and you will
> see that IS_ERR() is used, so there is no point to set the pointer to NULL.
Right. I just checked the clk_prepare() implementation which is
checking for NULL value only and I thought clk_disable() and
clk_unprepare() were doing the same, which apparently is not the case.
--
Boris Brezillon, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com
WARNING: multiple messages have this Message-ID (diff)
From: boris.brezillon@bootlin.com (Boris Brezillon)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2] mtd: nand: marvell: Fix clock resource by adding a register clock
Date: Mon, 12 Mar 2018 20:35:29 +0100 [thread overview]
Message-ID: <20180312203529.7963ef29@bbrezillon> (raw)
In-Reply-To: <87vae11bep.fsf@bootlin.com>
On Mon, 12 Mar 2018 17:55:26 +0100
Gregory CLEMENT <gregory.clement@bootlin.com> wrote:
> >
> >> struct completion complete;
> >> unsigned long assigned_cs;
> >> struct list_head chips;
> >> @@ -2747,12 +2748,24 @@ static int marvell_nfc_probe(struct platform_device *pdev)
> >> if (ret)
> >> return ret;
> >>
> >> + nfc->reg_clk = devm_clk_get(&pdev->dev, "reg");
> >> + if (PTR_ERR(nfc->reg_clk) != -ENOENT) {
> >> + if (!IS_ERR(nfc->reg_clk)) {
> >> + ret = clk_prepare_enable(nfc->reg_clk);
> >> + if (ret)
> >> + goto unprepare_clk;
> >
> > I already suggested to move the devm_clk_get(&pdev->dev, "reg") before
> > the clk_prepare_enable(nfc->ecc_clk) one to simplify the error path.
> >
>
> Actually I started to implement your suggestion but unlike what you
> though it made the code less simpler. Indeed by having the mandatory
> clock first than in case of failure we can directly exit the function.
>
> If the reg clock was initialized first, then if the core/ecc clock fail
> in soem case we woudl need to daisbel the reg clock and in other case we
> could directly exit.
Well, it's pretty much the same problem if you do it in the order you
propose here: if the core clk enable fails, you'll have to disable the
reg clk. Plus, I'm not a big fan of if/else block imbrications when we
can avoid them.
>
>
> >> + } else {
> >> + ret = PTR_ERR(nfc->reg_clk);
> >> + goto unprepare_clk;
> >> + }
> >> + }
> >
> > So nfc->reg_clk stays assigned to -ENOENT if the clk is not present, and
> > clk_disable_unprepare() will manipulate an invalid pointer when called
> > from the error or ->remove() path.
>
> I think you missed the fact that the clk_disable_unprepare() function
> managed the invalid pointer, have a look on the functions and you will
> see that IS_ERR() is used, so there is no point to set the pointer to NULL.
Right. I just checked the clk_prepare() implementation which is
checking for NULL value only and I thought clk_disable() and
clk_unprepare() were doing the same, which apparently is not the case.
--
Boris Brezillon, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com
WARNING: multiple messages have this Message-ID (diff)
From: Boris Brezillon <boris.brezillon@bootlin.com>
To: Gregory CLEMENT <gregory.clement@bootlin.com>
Cc: Andrew Lunn <andrew@lunn.ch>, Jason Cooper <jason@lakedaemon.net>,
Rob Herring <robh@kernel.org>,
Antoine Tenart <antoine.tenart@bootlin.com>,
Hanna Hawa <hannah@marvell.com>, Omri Itach <omrii@marvell.com>,
Nadav Haklai <nadavh@marvell.com>,
"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
linux-mtd@lists.infradead.org, Igal Liberman <igall@marvell.com>,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
Miquel Raynal <miquel.raynal@bootlin.com>,
Shadi Ammouri <shadi@marvell.com>,
Marcin Wojtas <mw@semihalf.com>,
linux-arm-kernel@lists.infradead.org,
Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Subject: Re: [PATCH v2] mtd: nand: marvell: Fix clock resource by adding a register clock
Date: Mon, 12 Mar 2018 20:35:29 +0100 [thread overview]
Message-ID: <20180312203529.7963ef29@bbrezillon> (raw)
In-Reply-To: <87vae11bep.fsf@bootlin.com>
On Mon, 12 Mar 2018 17:55:26 +0100
Gregory CLEMENT <gregory.clement@bootlin.com> wrote:
> >
> >> struct completion complete;
> >> unsigned long assigned_cs;
> >> struct list_head chips;
> >> @@ -2747,12 +2748,24 @@ static int marvell_nfc_probe(struct platform_device *pdev)
> >> if (ret)
> >> return ret;
> >>
> >> + nfc->reg_clk = devm_clk_get(&pdev->dev, "reg");
> >> + if (PTR_ERR(nfc->reg_clk) != -ENOENT) {
> >> + if (!IS_ERR(nfc->reg_clk)) {
> >> + ret = clk_prepare_enable(nfc->reg_clk);
> >> + if (ret)
> >> + goto unprepare_clk;
> >
> > I already suggested to move the devm_clk_get(&pdev->dev, "reg") before
> > the clk_prepare_enable(nfc->ecc_clk) one to simplify the error path.
> >
>
> Actually I started to implement your suggestion but unlike what you
> though it made the code less simpler. Indeed by having the mandatory
> clock first than in case of failure we can directly exit the function.
>
> If the reg clock was initialized first, then if the core/ecc clock fail
> in soem case we woudl need to daisbel the reg clock and in other case we
> could directly exit.
Well, it's pretty much the same problem if you do it in the order you
propose here: if the core clk enable fails, you'll have to disable the
reg clk. Plus, I'm not a big fan of if/else block imbrications when we
can avoid them.
>
>
> >> + } else {
> >> + ret = PTR_ERR(nfc->reg_clk);
> >> + goto unprepare_clk;
> >> + }
> >> + }
> >
> > So nfc->reg_clk stays assigned to -ENOENT if the clk is not present, and
> > clk_disable_unprepare() will manipulate an invalid pointer when called
> > from the error or ->remove() path.
>
> I think you missed the fact that the clk_disable_unprepare() function
> managed the invalid pointer, have a look on the functions and you will
> see that IS_ERR() is used, so there is no point to set the pointer to NULL.
Right. I just checked the clk_prepare() implementation which is
checking for NULL value only and I thought clk_disable() and
clk_unprepare() were doing the same, which apparently is not the case.
--
Boris Brezillon, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com
next prev parent reply other threads:[~2018-03-12 19:35 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-07 16:13 [PATCH v2] mtd: nand: marvell: Fix clock resource by adding a register clock Gregory CLEMENT
2018-03-07 16:13 ` Gregory CLEMENT
2018-03-07 19:44 ` Boris Brezillon
2018-03-07 19:44 ` Boris Brezillon
2018-03-07 19:44 ` Boris Brezillon
2018-03-12 16:55 ` Gregory CLEMENT
2018-03-12 16:55 ` Gregory CLEMENT
2018-03-12 16:55 ` Gregory CLEMENT
2018-03-12 19:35 ` Boris Brezillon [this message]
2018-03-12 19:35 ` Boris Brezillon
2018-03-12 19:35 ` Boris Brezillon
2018-03-13 10:29 ` Gregory CLEMENT
2018-03-13 10:29 ` Gregory CLEMENT
2018-03-13 10:29 ` Gregory CLEMENT
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=20180312203529.7963ef29@bbrezillon \
--to=boris.brezillon@bootlin.com \
--cc=andrew@lunn.ch \
--cc=antoine.tenart@bootlin.com \
--cc=devicetree@vger.kernel.org \
--cc=gregory.clement@bootlin.com \
--cc=hannah@marvell.com \
--cc=igall@marvell.com \
--cc=jason@lakedaemon.net \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-mtd@lists.infradead.org \
--cc=miquel.raynal@bootlin.com \
--cc=mw@semihalf.com \
--cc=nadavh@marvell.com \
--cc=omrii@marvell.com \
--cc=robh@kernel.org \
--cc=sebastian.hesselbarth@gmail.com \
--cc=shadi@marvell.com \
--cc=thomas.petazzoni@bootlin.com \
/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.