From: Julia Lawall <Julia.Lawall@inria.fr> To: Julia Lawall <Julia.Lawall@inria.fr>, Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>, Mauro Carvalho Chehab <mchehab+huawei@kernel.org> Cc: kernel-janitors@vger.kernel.org, Gilles Muller <Gilles.Muller@inria.fr>, Nicolas Palix <nicolas.palix@imag.fr>, Michal Marek <michal.lkml@markovi.net>, cocci@systeme.lip6.fr, linux-kernel@vger.kernel.org Subject: [PATCH v2] coccinelle: api: semantic patch to use pm_runtime_resume_and_get Date: Mon, 26 Apr 2021 20:54:04 +0200 [thread overview] Message-ID: <20210426185404.2466195-1-Julia.Lawall@inria.fr> (raw) 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 <Julia.Lawall@inria.fr> --- 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 000000000000..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) +
WARNING: multiple messages have this Message-ID (diff)
From: Julia Lawall <Julia.Lawall@inria.fr> To: Julia Lawall <Julia.Lawall@inria.fr>, Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>, Mauro Carvalho Chehab <mchehab+huawei@kernel.org> Cc: Michal Marek <michal.lkml@markovi.net>, kernel-janitors@vger.kernel.org, Nicolas Palix <nicolas.palix@imag.fr>, linux-kernel@vger.kernel.org, cocci@systeme.lip6.fr Subject: [Cocci] [PATCH v2] coccinelle: api: semantic patch to use pm_runtime_resume_and_get Date: Mon, 26 Apr 2021 20:54:04 +0200 [thread overview] Message-ID: <20210426185404.2466195-1-Julia.Lawall@inria.fr> (raw) 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 <Julia.Lawall@inria.fr> --- 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 000000000000..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
next reply other threads:[~2021-04-26 19:46 UTC|newest] Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-04-26 18:54 Julia Lawall [this message] 2021-04-26 18:54 ` [Cocci] [PATCH v2] coccinelle: api: semantic patch to use pm_runtime_resume_and_get Julia Lawall 2021-04-27 13:18 ` Johan Hovold 2021-04-27 13:18 ` [Cocci] " Johan Hovold 2021-04-27 13:22 ` Rafael J. Wysocki 2021-04-27 13:22 ` [Cocci] " Rafael J. Wysocki 2021-04-27 13:44 ` Julia Lawall 2021-04-27 13:44 ` [Cocci] " Julia Lawall 2021-04-27 15:01 ` Johan Hovold 2021-04-27 15:01 ` [Cocci] " Johan Hovold
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=20210426185404.2466195-1-Julia.Lawall@inria.fr \ --to=julia.lawall@inria.fr \ --cc=Gilles.Muller@inria.fr \ --cc=cocci@systeme.lip6.fr \ --cc=kernel-janitors@vger.kernel.org \ --cc=krzysztof.kozlowski@canonical.com \ --cc=linux-kernel@vger.kernel.org \ --cc=mchehab+huawei@kernel.org \ --cc=michal.lkml@markovi.net \ --cc=nicolas.palix@imag.fr \ /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: linkBe 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.