-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
scripts: Coccinelle script for pm_runtime_* return checks with IS_ERR…
…_VALUE As indicated by Sekhar in [1], there seems to be a tendency to use IS_ERR_VALUE to check the error result for pm_runtime_* functions which make no sense considering commit c48cd65 (ARM: OMAP: use consistent error checking) - the error values can either be < 0 for error OR 0, 1 in cases where we have success. So, setup a coccinelle script to help identify the same. [1] http://marc.info/?t=138472678100003&r=1&w=2 Cc: Russell King <rmk+kernel@arm.linux.org.uk> Reported-by: Sekhar Nori <nsekhar@ti.com> Signed-off-by: Nishanth Menon <nm@ti.com> Acked-by: Julia Lawall <julia.lawall@lip6.fr> Signed-off-by: Michal Marek <mmarek@suse.cz>
- Loading branch information
Nishanth Menon
authored and
Michal Marek
committed
Jan 3, 2014
1 parent
37e2c2a
commit 79f0345
Showing
1 changed file
with
109 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
/// Make sure pm_runtime_* calls does not use unnecessary IS_ERR_VALUE | ||
// | ||
// Keywords: pm_runtime | ||
// Confidence: Medium | ||
// Copyright (C) 2013 Texas Instruments Incorporated - GPLv2. | ||
// URL: http://coccinelle.lip6.fr/ | ||
// Options: --include-headers | ||
|
||
virtual patch | ||
virtual context | ||
virtual org | ||
virtual report | ||
|
||
//---------------------------------------------------------- | ||
// Detection | ||
//---------------------------------------------------------- | ||
|
||
@runtime_bad_err_handle exists@ | ||
expression ret; | ||
@@ | ||
( | ||
ret = \(pm_runtime_idle\| | ||
pm_runtime_suspend\| | ||
pm_runtime_autosuspend\| | ||
pm_runtime_resume\| | ||
pm_request_idle\| | ||
pm_request_resume\| | ||
pm_request_autosuspend\| | ||
pm_runtime_get\| | ||
pm_runtime_get_sync\| | ||
pm_runtime_put\| | ||
pm_runtime_put_autosuspend\| | ||
pm_runtime_put_sync\| | ||
pm_runtime_put_sync_suspend\| | ||
pm_runtime_put_sync_autosuspend\| | ||
pm_runtime_set_active\| | ||
pm_schedule_suspend\| | ||
pm_runtime_barrier\| | ||
pm_generic_runtime_suspend\| | ||
pm_generic_runtime_resume\)(...); | ||
... | ||
IS_ERR_VALUE(ret) | ||
... | ||
) | ||
|
||
//---------------------------------------------------------- | ||
// For context mode | ||
//---------------------------------------------------------- | ||
|
||
@depends on runtime_bad_err_handle && context@ | ||
identifier pm_runtime_api; | ||
expression ret; | ||
@@ | ||
( | ||
ret = pm_runtime_api(...); | ||
... | ||
* IS_ERR_VALUE(ret) | ||
... | ||
) | ||
|
||
//---------------------------------------------------------- | ||
// For patch mode | ||
//---------------------------------------------------------- | ||
|
||
@depends on runtime_bad_err_handle && patch@ | ||
identifier pm_runtime_api; | ||
expression ret; | ||
@@ | ||
( | ||
ret = pm_runtime_api(...); | ||
... | ||
- IS_ERR_VALUE(ret) | ||
+ ret < 0 | ||
... | ||
) | ||
|
||
//---------------------------------------------------------- | ||
// For org and report mode | ||
//---------------------------------------------------------- | ||
|
||
@r depends on runtime_bad_err_handle exists@ | ||
position p1, p2; | ||
identifier pm_runtime_api; | ||
expression ret; | ||
@@ | ||
( | ||
ret = pm_runtime_api@p1(...); | ||
... | ||
IS_ERR_VALUE@p2(ret) | ||
... | ||
) | ||
|
||
@script:python depends on org@ | ||
p1 << r.p1; | ||
p2 << r.p2; | ||
pm_runtime_api << r.pm_runtime_api; | ||
@@ | ||
cocci.print_main(pm_runtime_api,p1) | ||
cocci.print_secs("IS_ERR_VALUE",p2) | ||
@script:python depends on report@ | ||
p1 << r.p1; | ||
p2 << r.p2; | ||
pm_runtime_api << r.pm_runtime_api; | ||
@@ | ||
msg = "%s returns < 0 as error. Unecessary IS_ERR_VALUE at line %s" % (pm_runtime_api, p2[0].line) | ||
coccilib.report.print_report(p1[0],msg) |