Re: [Cocci] [PATCH v2] coccinelle: api: semantic patch to use pm_runtime_resume_and_get
On Tue, Apr 27, 2021 at 03:44:25PM +0200, Julia Lawall wrote: > On Tue, 27 Apr 2021, Johan Hovold wrote: > > > On Mon, Apr 26, 2021 at 08:54:04PM +0200, Julia Lawall wrote: > > > pm_runtime_get_sync keeps a reference count on failure, which can lead > > > to leaks. pm_runtime_resume_and_get drops the reference count in the > > > failure case. This rule very conservatively follows the definition of > > > pm_runtime_resume_and_get to address the cases where the reference > > > count is unlikely to be needed in the failure case. > > > > > > pm_runtime_resume_and_get was introduced in > > > commit dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to > > > deal with usage counter") > > > > > > Signed-off-by: Julia Lawall > > > > As I've said elsewhere, not sure trying to do a mass conversion of this > > is a good idea. People may not be used to the interface, but it is > > consistent and has its use. The recent flurry of conversions show that > > those also risk introducing new bugs in code that is currently tested > > and correct. > > I looked some of the patches you commented on, and this rule would not > have transformed those cases. This rule is very restricted to ensure that > the transformed code follows the behavior of the new function. Ah, ok. I didn't look too closely at the semantic patch itself and wrongly associated it with the all-or-nothing media subsystem conversions. Thanks for clarifying further in v3 too. Still a bit worried that this will push the cleanup crew to send more broken patches since it sends a signal that pm_runtime_get_sync() is always wrong. But guess there's not much to do about that now after having added pm_runtime_resume_and_get() in the first place. Johan ___ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci
Re: [Cocci] [PATCH v2] coccinelle: api: semantic patch to use pm_runtime_resume_and_get
On Tue, Apr 27, 2021 at 3:18 PM Johan Hovold wrote: > > On Mon, Apr 26, 2021 at 08:54:04PM +0200, Julia Lawall wrote: > > pm_runtime_get_sync keeps a reference count on failure, which can lead > > to leaks. pm_runtime_resume_and_get drops the reference count in the > > failure case. This rule very conservatively follows the definition of > > pm_runtime_resume_and_get to address the cases where the reference > > count is unlikely to be needed in the failure case. > > > > pm_runtime_resume_and_get was introduced in > > commit dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to > > deal with usage counter") > > > > Signed-off-by: Julia Lawall > > As I've said elsewhere, not sure trying to do a mass conversion of this > is a good idea. No, it isn't. > People may not be used to the interface, but it is > consistent and has its use. The recent flurry of conversions show that > those also risk introducing new bugs in code that is currently tested > and correct. > > By giving the script kiddies another toy like this, the influx of broken > patches is just bound to increase. > > Would also be good to CC the PM maintainer on this issue. There are many call sites in the kernel where replacing pm_runtime_get_sync() with pm_runtime_resume_and_get() mechanically would introduce an error, so please don't do that. Every such replacement should be reviewed by the people familiar with the code in question. Thanks, Rafael ___ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci
Re: [Cocci] [PATCH v2] coccinelle: api: semantic patch to use pm_runtime_resume_and_get
On Mon, Apr 26, 2021 at 08:54:04PM +0200, Julia Lawall wrote: > pm_runtime_get_sync keeps a reference count on failure, which can lead > to leaks. pm_runtime_resume_and_get drops the reference count in the > failure case. This rule very conservatively follows the definition of > pm_runtime_resume_and_get to address the cases where the reference > count is unlikely to be needed in the failure case. > > pm_runtime_resume_and_get was introduced in > commit dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to > deal with usage counter") > > Signed-off-by: Julia Lawall As I've said elsewhere, not sure trying to do a mass conversion of this is a good idea. People may not be used to the interface, but it is consistent and has its use. The recent flurry of conversions show that those also risk introducing new bugs in code that is currently tested and correct. By giving the script kiddies another toy like this, the influx of broken patches is just bound to increase. Would also be good to CC the PM maintainer on this issue. Johan ___ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci
Re: [Cocci] [PATCH v2] coccinelle: api: semantic patch to use pm_runtime_resume_and_get
On Tue, 27 Apr 2021, Johan Hovold wrote: > On Mon, Apr 26, 2021 at 08:54:04PM +0200, Julia Lawall wrote: > > pm_runtime_get_sync keeps a reference count on failure, which can lead > > to leaks. pm_runtime_resume_and_get drops the reference count in the > > failure case. This rule very conservatively follows the definition of > > pm_runtime_resume_and_get to address the cases where the reference > > count is unlikely to be needed in the failure case. > > > > pm_runtime_resume_and_get was introduced in > > commit dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to > > deal with usage counter") > > > > Signed-off-by: Julia Lawall > > As I've said elsewhere, not sure trying to do a mass conversion of this > is a good idea. People may not be used to the interface, but it is > consistent and has its use. The recent flurry of conversions show that > those also risk introducing new bugs in code that is currently tested > and correct. I looked some of the patches you commented on, and this rule would not have transformed those cases. This rule is very restricted to ensure that the transformed code follows the behavior of the new function. > > By giving the script kiddies another toy like this, the influx of broken > patches is just bound to increase. > > Would also be good to CC the PM maintainer on this issue. Sure, I can resend with Rafael in CC. julia ___ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci
[Cocci] [PATCH v2] coccinelle: api: semantic patch to use pm_runtime_resume_and_get
pm_runtime_get_sync keeps a reference count on failure, which can lead to leaks. pm_runtime_resume_and_get drops the reference count in the failure case. This rule very conservatively follows the definition of pm_runtime_resume_and_get to address the cases where the reference count is unlikely to be needed in the failure case. pm_runtime_resume_and_get was introduced in commit dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter") Signed-off-by: Julia Lawall --- v2: better keyword scripts/coccinelle/api/pm_runtime_resume_and_get.cocci | 153 + 1 file changed, 153 insertions(+) diff --git a/scripts/coccinelle/api/pm_runtime_resume_and_get.cocci b/scripts/coccinelle/api/pm_runtime_resume_and_get.cocci new file mode 100644 index ..3387cb606f9b --- /dev/null +++ b/scripts/coccinelle/api/pm_runtime_resume_and_get.cocci @@ -0,0 +1,153 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Use pm_runtime_resume_and_get. +/// pm_runtime_get_sync keeps a reference count on failure, +/// which can lead to leaks. pm_runtime_resume_and_get +/// drops the reference count in the failure case. +/// This rule addresses the cases where the reference count +/// is unlikely to be needed in the failure case. +/// +// Confidence: High +// Copyright: (C) 2021 Julia Lawall, Inria +// URL: https://coccinelle.gitlabpages.inria.fr/website +// Options: --include-headers --no-includes +// Keywords: pm_runtime_get_sync + +virtual patch +virtual context +virtual org +virtual report + +@r0 depends on patch && !context && !org && !report@ +expression ret,e; +@@ + +- ret = pm_runtime_get_sync(e); ++ ret = pm_runtime_resume_and_get(e); +- if (ret < 0) +- pm_runtime_put_noidle(e); + +@r1 depends on patch && !context && !org && !report@ +expression ret,e; +statement S1,S2; +@@ + +- ret = pm_runtime_get_sync(e); ++ ret = pm_runtime_resume_and_get(e); + if (ret < 0) +- { +- pm_runtime_put_noidle(e); + S1 +- } + else S2 + +@r2 depends on patch && !context && !org && !report@ +expression ret,e; +statement S; +@@ + +- ret = pm_runtime_get_sync(e); ++ ret = pm_runtime_resume_and_get(e); + if (ret < 0) { +- pm_runtime_put_noidle(e); + ... + } else S + +@r3 depends on patch && !context && !org && !report@ +expression ret,e; +identifier f; +constant char[] c; +statement S; +@@ + +- ret = pm_runtime_get_sync(e); ++ ret = pm_runtime_resume_and_get(e); + if (ret < 0) +- { + f(...,c,...); +- pm_runtime_put_noidle(e); +- } + else S + +@r4 depends on patch && !context && !org && !report@ +expression ret,e; +identifier f; +constant char[] c; +statement S; +@@ + +- ret = pm_runtime_get_sync(e); ++ ret = pm_runtime_resume_and_get(e); + if (ret < 0) { + f(...,c,...); +- pm_runtime_put_noidle(e); + ... + } else S + +// + +@r2_context depends on !patch && (context || org || report)@ +statement S; +expression e, ret; +position j0, j1; +@@ + +* ret@j0 = pm_runtime_get_sync(e); + if (ret < 0) { +* pm_runtime_put_noidle@j1(e); + ... + } else S + +@r3_context depends on !patch && (context || org || report)@ +identifier f; +statement S; +constant char []c; +expression e, ret; +position j0, j1; +@@ + +* ret@j0 = pm_runtime_get_sync(e); + if (ret < 0) { + f(...,c,...); +* pm_runtime_put_noidle@j1(e); + ... + } else S + +// + +@script:python r2_org depends on org@ +j0 << r2_context.j0; +j1 << r2_context.j1; +@@ + +msg = "WARNING: opportunity for pm_runtime_get_sync" +coccilib.org.print_todo(j0[0], msg) +coccilib.org.print_link(j1[0], "") + +@script:python r3_org depends on org@ +j0 << r3_context.j0; +j1 << r3_context.j1; +@@ + +msg = "WARNING: opportunity for pm_runtime_get_sync" +coccilib.org.print_todo(j0[0], msg) +coccilib.org.print_link(j1[0], "") + +// + +@script:python r2_report depends on report@ +j0 << r2_context.j0; +j1 << r2_context.j1; +@@ + +msg = "WARNING: opportunity for pm_runtime_get_sync on line %s." % (j0[0].line) +coccilib.report.print_report(j0[0], msg) + +@script:python r3_report depends on report@ +j0 << r3_context.j0; +j1 << r3_context.j1; +@@ + +msg = "WARNING: opportunity for pm_runtime_get_sync on %s." % (j0[0].line) +coccilib.report.print_report(j0[0], msg) + ___ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci