forked from torvalds/linux
-
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.
Merge branch 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/…
…mmarek/kbuild Pull kbuild misc updates from Michal Marek: "The non-critical part of kbuild for v4.6-rc1: - coccinelle cleanup and a new patch - make tags rule for kprobe helpers - make rpm fix to avoid spurious grub2 entries - make rpm support for %postun script (Fedora only at the moment)" * 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild: kbuild/mkspec: clean boot loader configuration on rpm removal kbuild/mkspec: fix grub2 installkernel issue Coccinelle: Add api/setup_timer.cocci coccinelle: bugon: reduce rule applicability Coccinelle: pm_runtime: reduce rule applicability Coccinelle: array_size: reduce rule applicability Coccinelle: reduce rule applicability scripts/tags.sh: add regex to map kprobe helpers scripts/coccinelle: modernize &
- Loading branch information
Showing
8 changed files
with
215 additions
and
9 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
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,199 @@ | ||
/// Use setup_timer function instead of initializing timer with the function | ||
/// and data fields | ||
// Confidence: High | ||
// Copyright: (C) 2016 Vaishali Thakkar, Oracle. GPLv2 | ||
// Options: --no-includes --include-headers | ||
// Keywords: init_timer, setup_timer | ||
|
||
virtual patch | ||
virtual context | ||
virtual org | ||
virtual report | ||
|
||
@match_immediate_function_data_after_init_timer | ||
depends on patch && !context && !org && !report@ | ||
expression e, func, da; | ||
@@ | ||
-init_timer (&e); | ||
+setup_timer (&e, func, da); | ||
( | ||
-e.function = func; | ||
-e.data = da; | ||
| | ||
-e.data = da; | ||
-e.function = func; | ||
) | ||
@match_function_and_data_after_init_timer | ||
depends on patch && !context && !org && !report@ | ||
expression e1, e2, e3, e4, e5, a, b; | ||
@@ | ||
|
||
-init_timer (&e1); | ||
+setup_timer (&e1, a, b); | ||
|
||
... when != a = e2 | ||
when != b = e3 | ||
( | ||
-e1.function = a; | ||
... when != b = e4 | ||
-e1.data = b; | ||
| | ||
-e1.data = b; | ||
... when != a = e5 | ||
-e1.function = a; | ||
) | ||
|
||
@r1 exists@ | ||
identifier f; | ||
position p; | ||
@@ | ||
|
||
f(...) { ... when any | ||
init_timer@p(...) | ||
... when any | ||
} | ||
|
||
@r2 exists@ | ||
identifier g != r1.f; | ||
struct timer_list t; | ||
expression e8; | ||
@@ | ||
|
||
g(...) { ... when any | ||
t.data = e8 | ||
... when any | ||
} | ||
|
||
// It is dangerous to use setup_timer if data field is initialized | ||
// in another function. | ||
|
||
@script:python depends on r2@ | ||
p << r1.p; | ||
@@ | ||
cocci.include_match(False) | ||
@r3 depends on patch && !context && !org && !report@ | ||
expression e6, e7, c; | ||
position r1.p; | ||
@@ | ||
|
||
-init_timer@p (&e6); | ||
+setup_timer (&e6, c, 0UL); | ||
... when != c = e7 | ||
-e6.function = c; | ||
|
||
// ---------------------------------------------------------------------------- | ||
|
||
@match_immediate_function_data_after_init_timer_context | ||
depends on !patch && (context || org || report)@ | ||
expression da, e, func; | ||
position j0, j1, j2; | ||
@@ | ||
* init_timer@j0 (&e); | ||
( | ||
* [email protected] = func; | ||
* [email protected] = da; | ||
| | ||
* [email protected] = da; | ||
* [email protected] = func; | ||
) | ||
@match_function_and_data_after_init_timer_context | ||
depends on !patch && | ||
!match_immediate_function_data_after_init_timer_context && | ||
(context || org || report)@ | ||
expression a, b, e1, e2, e3, e4, e5; | ||
position j0, j1, j2; | ||
@@ | ||
|
||
* init_timer@j0 (&e1); | ||
... when != a = e2 | ||
when != b = e3 | ||
( | ||
* [email protected] = a; | ||
... when != b = e4 | ||
* [email protected] = b; | ||
| | ||
* [email protected] = b; | ||
... when != a = e5 | ||
* [email protected] = a; | ||
) | ||
|
||
@r3_context depends on !patch && | ||
!match_immediate_function_data_after_init_timer_context && | ||
!match_function_and_data_after_init_timer_context && | ||
(context || org || report)@ | ||
expression c, e6, e7; | ||
position r1.p; | ||
position j0, j1; | ||
@@ | ||
* init_timer@j0@p (&e6); | ||
... when != c = e7 | ||
* [email protected] = c; | ||
// ---------------------------------------------------------------------------- | ||
@script:python match_immediate_function_data_after_init_timer_org | ||
depends on org@ | ||
j0 << match_immediate_function_data_after_init_timer_context.j0; | ||
j1 << match_immediate_function_data_after_init_timer_context.j1; | ||
j2 << match_immediate_function_data_after_init_timer_context.j2; | ||
@@ | ||
|
||
msg = "Use setup_timer function." | ||
coccilib.org.print_todo(j0[0], msg) | ||
coccilib.org.print_link(j1[0], "") | ||
coccilib.org.print_link(j2[0], "") | ||
|
||
@script:python match_function_and_data_after_init_timer_org depends on org@ | ||
j0 << match_function_and_data_after_init_timer_context.j0; | ||
j1 << match_function_and_data_after_init_timer_context.j1; | ||
j2 << match_function_and_data_after_init_timer_context.j2; | ||
@@ | ||
msg = "Use setup_timer function." | ||
coccilib.org.print_todo(j0[0], msg) | ||
coccilib.org.print_link(j1[0], "") | ||
coccilib.org.print_link(j2[0], "") | ||
@script:python r3_org depends on org@ | ||
j0 << r3_context.j0; | ||
j1 << r3_context.j1; | ||
@@ | ||
msg = "Use setup_timer function." | ||
coccilib.org.print_todo(j0[0], msg) | ||
coccilib.org.print_link(j1[0], "") | ||
// ---------------------------------------------------------------------------- | ||
@script:python match_immediate_function_data_after_init_timer_report | ||
depends on report@ | ||
j0 << match_immediate_function_data_after_init_timer_context.j0; | ||
j1 << match_immediate_function_data_after_init_timer_context.j1; | ||
@@ | ||
msg = "Use setup_timer function for function on line %s." % (j1[0].line) | ||
coccilib.report.print_report(j0[0], msg) | ||
@script:python match_function_and_data_after_init_timer_report depends on report@ | ||
j0 << match_function_and_data_after_init_timer_context.j0; | ||
j1 << match_function_and_data_after_init_timer_context.j1; | ||
@@ | ||
|
||
msg = "Use setup_timer function for function on line %s." % (j1[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 = "Use setup_timer function for function on line %s." % (j1[0].line) | ||
coccilib.report.print_report(j0[0], msg) |
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 |
---|---|---|
|
@@ -123,7 +123,7 @@ list_remove_head(x,c,...) | |
| | ||
sizeof(<+...c...+>) | ||
| | ||
&c->member | ||
&c->member | ||
| | ||
c = E | ||
| | ||
|
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
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
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
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
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