* [PATCH] of.c: replace of_node_put with __free improves cleanup
@ 2024-07-19 22:38 David Hunter
2024-08-01 23:55 ` Bjorn Helgaas
0 siblings, 1 reply; 4+ messages in thread
From: David Hunter @ 2024-07-19 22:38 UTC (permalink / raw)
To: bhelgaas, linux-pci, linux-kernel
Cc: David Hunter, julia.lawall, skhan, javier.carrasco.cruz
The use of the __free function allows the cleanup to be based on scope
instead of on another function called later. This makes the cleanup
automatic and less susceptible to errors later.
This code was compiled without errors or warnings.
Signed-off-by: David Hunter <david.hunter.linux@gmail.com>
---
drivers/pci/of.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/pci/of.c b/drivers/pci/of.c
index b908fe1ae951..8b150982f5cd 100644
--- a/drivers/pci/of.c
+++ b/drivers/pci/of.c
@@ -616,16 +616,14 @@ int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *bridge)
void of_pci_remove_node(struct pci_dev *pdev)
{
- struct device_node *np;
+ struct device_node *np __free(device_node) = pci_device_to_OF_node(pdev);
- np = pci_device_to_OF_node(pdev);
if (!np || !of_node_check_flag(np, OF_DYNAMIC))
return;
pdev->dev.of_node = NULL;
of_changeset_revert(np->data);
of_changeset_destroy(np->data);
- of_node_put(np);
}
void of_pci_make_dev_node(struct pci_dev *pdev)
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] of.c: replace of_node_put with __free improves cleanup
2024-07-19 22:38 [PATCH] of.c: replace of_node_put with __free improves cleanup David Hunter
@ 2024-08-01 23:55 ` Bjorn Helgaas
2024-08-07 10:47 ` Jonathan Cameron
0 siblings, 1 reply; 4+ messages in thread
From: Bjorn Helgaas @ 2024-08-01 23:55 UTC (permalink / raw)
To: David Hunter
Cc: bhelgaas, linux-pci, linux-kernel, julia.lawall, skhan,
javier.carrasco.cruz, Rob Herring, Jonathan Cameron
[+cc Rob, Jonathan]
On Fri, Jul 19, 2024 at 06:38:05PM -0400, David Hunter wrote:
> The use of the __free function allows the cleanup to be based on scope
> instead of on another function called later. This makes the cleanup
> automatic and less susceptible to errors later.
>
> This code was compiled without errors or warnings.
I *think* this looks OK, but I'm not comfy with all this scope magic
yet, so would like Jonathan and/or Rob to take a peek too.
And is there some way to include a hint here about how to find the
implicit of_node_put()? I think it's this from 9448e55d032d ("of: Add
cleanup.h based auto release via __free(device_node) markings"):
+DEFINE_FREE(device_node, struct device_node *, if (_T) of_node_put(_T))
but it did take some looking to find it.
If it looks good, I'll tweak the commit log to use imperative mood:
https://chris.beams.io/posts/git-commit/
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?id=v6.9#n94
since this technically says what *could* happen but not what the patch
*does*.
> Signed-off-by: David Hunter <david.hunter.linux@gmail.com>
> ---
> drivers/pci/of.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/drivers/pci/of.c b/drivers/pci/of.c
> index b908fe1ae951..8b150982f5cd 100644
> --- a/drivers/pci/of.c
> +++ b/drivers/pci/of.c
> @@ -616,16 +616,14 @@ int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *bridge)
>
> void of_pci_remove_node(struct pci_dev *pdev)
> {
> - struct device_node *np;
> + struct device_node *np __free(device_node) = pci_device_to_OF_node(pdev);
>
> - np = pci_device_to_OF_node(pdev);
> if (!np || !of_node_check_flag(np, OF_DYNAMIC))
> return;
> pdev->dev.of_node = NULL;
>
> of_changeset_revert(np->data);
> of_changeset_destroy(np->data);
> - of_node_put(np);
> }
>
> void of_pci_make_dev_node(struct pci_dev *pdev)
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] of.c: replace of_node_put with __free improves cleanup
2024-08-01 23:55 ` Bjorn Helgaas
@ 2024-08-07 10:47 ` Jonathan Cameron
2024-08-07 16:18 ` Rob Herring
0 siblings, 1 reply; 4+ messages in thread
From: Jonathan Cameron @ 2024-08-07 10:47 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: David Hunter, bhelgaas, linux-pci, linux-kernel, julia.lawall,
skhan, javier.carrasco.cruz, Rob Herring
On Thu, 1 Aug 2024 18:55:26 -0500
Bjorn Helgaas <helgaas@kernel.org> wrote:
> [+cc Rob, Jonathan]
>
> On Fri, Jul 19, 2024 at 06:38:05PM -0400, David Hunter wrote:
> > The use of the __free function allows the cleanup to be based on scope
> > instead of on another function called later. This makes the cleanup
> > automatic and less susceptible to errors later.
> >
> > This code was compiled without errors or warnings.
>
> I *think* this looks OK, but I'm not comfy with all this scope magic
> yet, so would like Jonathan and/or Rob to take a peek too.
I'm suspicious of usecases where there isn't a constructor / destructor pair.
This is more of a 'steal' the pointer and destroy it pattern.
Also, bug in this case.... see below.
>
> And is there some way to include a hint here about how to find the
> implicit of_node_put()? I think it's this from 9448e55d032d ("of: Add
> cleanup.h based auto release via __free(device_node) markings"):
>
> +DEFINE_FREE(device_node, struct device_node *, if (_T) of_node_put(_T))
Yes, it's that one. Makes sense to add a reference to that in the
patch description for these.
>
> but it did take some looking to find it.
>
> If it looks good, I'll tweak the commit log to use imperative mood:
> https://chris.beams.io/posts/git-commit/
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?id=v6.9#n94
>
> since this technically says what *could* happen but not what the patch
> *does*.
>
> > Signed-off-by: David Hunter <david.hunter.linux@gmail.com>
> > ---
> > drivers/pci/of.c | 4 +---
> > 1 file changed, 1 insertion(+), 3 deletions(-)
> >
> > diff --git a/drivers/pci/of.c b/drivers/pci/of.c
> > index b908fe1ae951..8b150982f5cd 100644
> > --- a/drivers/pci/of.c
> > +++ b/drivers/pci/of.c
> > @@ -616,16 +616,14 @@ int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *bridge)
> >
> > void of_pci_remove_node(struct pci_dev *pdev)
> > {
> > - struct device_node *np;
> > + struct device_node *np __free(device_node) = pci_device_to_OF_node(pdev);
> >
> > - np = pci_device_to_OF_node(pdev);
> > if (!np || !of_node_check_flag(np, OF_DYNAMIC))
Wil now put the node if that second check fails. Didn't do that before
and I'm guessing we shouldn't? Technically it calls the cleanup
in the !np case but that is fine as we check for NULL pointer.
So I'd leave this particular one alone.
> > return;
> > pdev->dev.of_node = NULL;
> >
> > of_changeset_revert(np->data);
> > of_changeset_destroy(np->data);
> > - of_node_put(np);
> > }
> >
> > void of_pci_make_dev_node(struct pci_dev *pdev)
> > --
> > 2.34.1
> >
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] of.c: replace of_node_put with __free improves cleanup
2024-08-07 10:47 ` Jonathan Cameron
@ 2024-08-07 16:18 ` Rob Herring
0 siblings, 0 replies; 4+ messages in thread
From: Rob Herring @ 2024-08-07 16:18 UTC (permalink / raw)
To: Jonathan Cameron, Bjorn Helgaas, David Hunter
Cc: bhelgaas, linux-pci, linux-kernel, julia.lawall, skhan,
javier.carrasco.cruz
On Wed, Aug 7, 2024 at 4:47 AM Jonathan Cameron
<Jonathan.Cameron@huawei.com> wrote:
>
> On Thu, 1 Aug 2024 18:55:26 -0500
> Bjorn Helgaas <helgaas@kernel.org> wrote:
>
> > [+cc Rob, Jonathan]
> >
> > On Fri, Jul 19, 2024 at 06:38:05PM -0400, David Hunter wrote:
> > > The use of the __free function allows the cleanup to be based on scope
> > > instead of on another function called later. This makes the cleanup
> > > automatic and less susceptible to errors later.
> > >
> > > This code was compiled without errors or warnings.
> >
> > I *think* this looks OK, but I'm not comfy with all this scope magic
> > yet, so would like Jonathan and/or Rob to take a peek too.
>
> I'm suspicious of usecases where there isn't a constructor / destructor pair.
>
> This is more of a 'steal' the pointer and destroy it pattern.
>
> Also, bug in this case.... see below.
>
> >
> > And is there some way to include a hint here about how to find the
> > implicit of_node_put()? I think it's this from 9448e55d032d ("of: Add
> > cleanup.h based auto release via __free(device_node) markings"):
> >
> > +DEFINE_FREE(device_node, struct device_node *, if (_T) of_node_put(_T))
>
> Yes, it's that one. Makes sense to add a reference to that in the
> patch description for these.
> >
> > but it did take some looking to find it.
> >
> > If it looks good, I'll tweak the commit log to use imperative mood:
> > https://chris.beams.io/posts/git-commit/
> > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?id=v6.9#n94
> >
> > since this technically says what *could* happen but not what the patch
> > *does*.
> >
> > > Signed-off-by: David Hunter <david.hunter.linux@gmail.com>
> > > ---
> > > drivers/pci/of.c | 4 +---
> > > 1 file changed, 1 insertion(+), 3 deletions(-)
> > >
> > > diff --git a/drivers/pci/of.c b/drivers/pci/of.c
> > > index b908fe1ae951..8b150982f5cd 100644
> > > --- a/drivers/pci/of.c
> > > +++ b/drivers/pci/of.c
> > > @@ -616,16 +616,14 @@ int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *bridge)
> > >
> > > void of_pci_remove_node(struct pci_dev *pdev)
> > > {
> > > - struct device_node *np;
> > > + struct device_node *np __free(device_node) = pci_device_to_OF_node(pdev);
> > >
> > > - np = pci_device_to_OF_node(pdev);
> > > if (!np || !of_node_check_flag(np, OF_DYNAMIC))
>
> Wil now put the node if that second check fails. Didn't do that before
> and I'm guessing we shouldn't? Technically it calls the cleanup
> in the !np case but that is fine as we check for NULL pointer.
>
> So I'd leave this particular one alone.
Right. The pci_device_to_OF_node() doesn't do a get, so using __free()
isn't really appropriate here. The put here is to free the node. The
get to balance the put was the allocation of the node.
Rob
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-08-07 16:18 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-19 22:38 [PATCH] of.c: replace of_node_put with __free improves cleanup David Hunter
2024-08-01 23:55 ` Bjorn Helgaas
2024-08-07 10:47 ` Jonathan Cameron
2024-08-07 16:18 ` Rob Herring
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).