Message ID | 20081206163449.60757c4a.akpm@linux-foundation.org (mailing list archive) |
---|---|
State | Changes Requested, archived |
Headers | show |
Andrew Morton writes: > This still misses a path - if that `return 0' is taken, we still leak > the reference. > > This is reason #345 why sprinkling return statements all over your code > is bad. > > I fixed it up thusly. Please check. I'm really in two minds about applying any of the of_node_put patches that only affect powermacs. The reference counts only matter on platforms where we update the OF device tree at runtime, which is currently only IBM pSeries machines. Since we don't have any hotplug on powermacs, and never will have, the OF device tree is completely static and we don't actually need refcounts on the nodes at all, so who cares if they're a bit higher than they might be? In particular, the VIA whose node we're looking for here is built-in on the motherboard, and there can never be more than one, and it can never be removed. Paul.
Hi Paul, On Sun, 7 Dec 2008 13:31:00 +1100 Paul Mackerras <paulus@samba.org> wrote: > > I'm really in two minds about applying any of the of_node_put patches > that only affect powermacs. The reference counts only matter on > platforms where we update the OF device tree at runtime, which is > currently only IBM pSeries machines. Since we don't have any hotplug > on powermacs, and never will have, the OF device tree is completely > static and we don't actually need refcounts on the nodes at all, so > who cares if they're a bit higher than they might be? > > In particular, the VIA whose node we're looking for here is built-in > on the motherboard, and there can never be more than one, and it can > never be removed. I my mind it is about consistent use of the API and good examples for people to copy. Also, in about a year you will be presented with the same set of patches when a new pair of eyes looks at the same code and notices the discrepancy ...
On Sunday 07 December 2008 06:43:33 Stephen Rothwell wrote: > Hi Paul, > > On Sun, 7 Dec 2008 13:31:00 +1100 Paul Mackerras <paulus@samba.org> wrote: > > > > I'm really in two minds about applying any of the of_node_put patches > > that only affect powermacs. The reference counts only matter on > > platforms where we update the OF device tree at runtime, which is > > currently only IBM pSeries machines. Since we don't have any hotplug > > on powermacs, and never will have, the OF device tree is completely > > static and we don't actually need refcounts on the nodes at all, so > > who cares if they're a bit higher than they might be? > > > > In particular, the VIA whose node we're looking for here is built-in > > on the motherboard, and there can never be more than one, and it can > > never be removed. > > I my mind it is about consistent use of the API and good examples for > people to copy. Also, in about a year you will be presented with the > same set of patches when a new pair of eyes looks at the same code and > notices the discrepancy ... > Hi Andrew, Indeed, there is an updated version of this patch in my second mail which fixes this issue. http://lkml.org/lkml/2008/12/3/88 Moreover, there is still a reference count unbalanced with your patch in the case where the function returns 1. Regards,
On Sun, 2008-12-07 at 16:43 +1100, Stephen Rothwell wrote: > Hi Paul, > > On Sun, 7 Dec 2008 13:31:00 +1100 Paul Mackerras <paulus@samba.org> wrote: > > > > I'm really in two minds about applying any of the of_node_put patches > > that only affect powermacs. The reference counts only matter on > > platforms where we update the OF device tree at runtime, which is > > currently only IBM pSeries machines. Since we don't have any hotplug > > on powermacs, and never will have, the OF device tree is completely > > static and we don't actually need refcounts on the nodes at all, so > > who cares if they're a bit higher than they might be? > > > > In particular, the VIA whose node we're looking for here is built-in > > on the motherboard, and there can never be more than one, and it can > > never be removed. > > I my mind it is about consistent use of the API and good examples for > people to copy. Also, in about a year you will be presented with the > same set of patches when a new pair of eyes looks at the same code and > notices the discrepancy ... what-he-said++ Allowing the ref counting to be broken in one part of the code is just asking for it to be broken everywhere. cheers
diff -puN arch/powerpc/platforms/powermac/pci.c~powerpc-powermac-add-missing-of_node_put arch/powerpc/platforms/powermac/pci.c --- a/arch/powerpc/platforms/powermac/pci.c~powerpc-powermac-add-missing-of_node_put +++ a/arch/powerpc/platforms/powermac/pci.c @@ -661,6 +661,7 @@ static void __init init_second_ohare(voi pci_find_hose_for_OF_device(np); if (!hose) { printk(KERN_ERR "Can't find PCI hose for OHare2 !\n"); + of_node_put(np); return; } early_read_config_word(hose, bus, devfn, PCI_COMMAND, &cmd); @@ -669,6 +670,7 @@ static void __init init_second_ohare(voi early_write_config_word(hose, bus, devfn, PCI_COMMAND, cmd); } has_second_ohare = 1; + of_node_put(np); } /* diff -puN arch/powerpc/platforms/powermac/time.c~powerpc-powermac-add-missing-of_node_put arch/powerpc/platforms/powermac/time.c --- a/arch/powerpc/platforms/powermac/time.c~powerpc-powermac-add-missing-of_node_put +++ a/arch/powerpc/platforms/powermac/time.c @@ -270,11 +270,11 @@ int __init via_calibrate_decr(void) if (vias == 0) vias = of_find_node_by_name(NULL, "via"); if (vias == 0 || of_address_to_resource(vias, 0, &rsrc)) - return 0; + goto fail; via = ioremap(rsrc.start, rsrc.end - rsrc.start + 1); if (via == NULL) { printk(KERN_ERR "Failed to map VIA for timer calibration !\n"); - return 0; + goto fail; } /* set timer 1 for continuous interrupts */ @@ -297,8 +297,11 @@ int __init via_calibrate_decr(void) ppc_tb_freq = (dstart - dend) * 100 / 6; iounmap(via); - + return 1; +fail: + of_node_put(vias); + return 0; } #endif