mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-28 07:13:34 +00:00
coccinelle: semantic patches related to devm_ functions (part 1)
devm_ functions allocate memory that is to remain allocated until the device is detached. This patch checks for opportunities for using the function devm_request_and_ioremap. Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr> Signed-off-by: Michal Marek <mmarek@suse.cz>
This commit is contained in:
parent
f95ab20972
commit
22e0059af3
1 changed files with 105 additions and 0 deletions
105
scripts/coccinelle/api/devm_request_and_ioremap.cocci
Normal file
105
scripts/coccinelle/api/devm_request_and_ioremap.cocci
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
/// Reimplement a call to devm_request_mem_region followed by a call to ioremap
|
||||||
|
/// or ioremap_nocache by a call to devm_request_and_ioremap.
|
||||||
|
/// Devm_request_and_ioremap was introduced in
|
||||||
|
/// 72f8c0bfa0de64c68ee59f40eb9b2683bffffbb0. It makes the code much more
|
||||||
|
/// concise.
|
||||||
|
///
|
||||||
|
///
|
||||||
|
// Confidence: High
|
||||||
|
// Copyright: (C) 2011 Julia Lawall, INRIA/LIP6. GPLv2.
|
||||||
|
// Copyright: (C) 2011 Gilles Muller, INRIA/LiP6. GPLv2.
|
||||||
|
// URL: http://coccinelle.lip6.fr/
|
||||||
|
// Comments:
|
||||||
|
// Options: -no_includes -include_headers
|
||||||
|
|
||||||
|
virtual patch
|
||||||
|
virtual org
|
||||||
|
virtual report
|
||||||
|
virtual context
|
||||||
|
|
||||||
|
@nm@
|
||||||
|
expression myname;
|
||||||
|
identifier i;
|
||||||
|
@@
|
||||||
|
|
||||||
|
struct platform_driver i = { .driver = { .name = myname } };
|
||||||
|
|
||||||
|
@depends on patch@
|
||||||
|
expression dev,res,size;
|
||||||
|
@@
|
||||||
|
|
||||||
|
-if (!devm_request_mem_region(dev, res->start, size,
|
||||||
|
- \(res->name\|dev_name(dev)\))) {
|
||||||
|
- ...
|
||||||
|
- return ...;
|
||||||
|
-}
|
||||||
|
... when != res->start
|
||||||
|
(
|
||||||
|
-devm_ioremap(dev,res->start,size)
|
||||||
|
+devm_request_and_ioremap(dev,res)
|
||||||
|
|
|
||||||
|
-devm_ioremap_nocache(dev,res->start,size)
|
||||||
|
+devm_request_and_ioremap(dev,res)
|
||||||
|
)
|
||||||
|
... when any
|
||||||
|
when != res->start
|
||||||
|
|
||||||
|
// this rule is separate from the previous one, because a single file can
|
||||||
|
// have multiple values of myname
|
||||||
|
@depends on patch@
|
||||||
|
expression dev,res,size;
|
||||||
|
expression nm.myname;
|
||||||
|
@@
|
||||||
|
|
||||||
|
-if (!devm_request_mem_region(dev, res->start, size,myname)) {
|
||||||
|
- ...
|
||||||
|
- return ...;
|
||||||
|
-}
|
||||||
|
... when != res->start
|
||||||
|
(
|
||||||
|
-devm_ioremap(dev,res->start,size)
|
||||||
|
+devm_request_and_ioremap(dev,res)
|
||||||
|
|
|
||||||
|
-devm_ioremap_nocache(dev,res->start,size)
|
||||||
|
+devm_request_and_ioremap(dev,res)
|
||||||
|
)
|
||||||
|
... when any
|
||||||
|
when != res->start
|
||||||
|
|
||||||
|
|
||||||
|
@pb depends on org || report || context@
|
||||||
|
expression dev,res,size;
|
||||||
|
expression nm.myname;
|
||||||
|
position p1,p2;
|
||||||
|
@@
|
||||||
|
|
||||||
|
*if
|
||||||
|
(!devm_request_mem_region@p1(dev, res->start, size,
|
||||||
|
\(res->name\|dev_name(dev)\|myname\))) {
|
||||||
|
...
|
||||||
|
return ...;
|
||||||
|
}
|
||||||
|
... when != res->start
|
||||||
|
(
|
||||||
|
*devm_ioremap@p2(dev,res->start,size)
|
||||||
|
|
|
||||||
|
*devm_ioremap_nocache@p2(dev,res->start,size)
|
||||||
|
)
|
||||||
|
... when any
|
||||||
|
when != res->start
|
||||||
|
|
||||||
|
@script:python depends on org@
|
||||||
|
p1 << pb.p1;
|
||||||
|
p2 << pb.p2;
|
||||||
|
@@
|
||||||
|
|
||||||
|
cocci.print_main("INFO: replace by devm_request_and_ioremap",p1)
|
||||||
|
cocci.print_secs("",p2)
|
||||||
|
|
||||||
|
@script:python depends on report@
|
||||||
|
p1 << pb.p1;
|
||||||
|
p2 << pb.p2;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg = "INFO: devm_request_mem_region followed by ioremap on line %s can be replaced by devm_request_and_ioremap" % (p2[0].line)
|
||||||
|
coccilib.report.print_report(p1[0],msg)
|
Loading…
Reference in a new issue