Linux-libre 4.9.88-gnu
[librecmc/linux-libre.git] / scripts / coccinelle / api / setup_timer.cocci
1 /// Use setup_timer function instead of initializing timer with the function
2 /// and data fields
3 // Confidence: High
4 // Copyright: (C) 2016 Vaishali Thakkar, Oracle. GPLv2
5 // Options: --no-includes --include-headers
6 // Keywords: init_timer, setup_timer
7
8 virtual patch
9 virtual context
10 virtual org
11 virtual report
12
13 @match_immediate_function_data_after_init_timer
14 depends on patch && !context && !org && !report@
15 expression e, func, da;
16 @@
17
18 -init_timer (&e);
19 +setup_timer (&e, func, da);
20
21 (
22 -e.function = func;
23 -e.data = da;
24 |
25 -e.data = da;
26 -e.function = func;
27 )
28
29 @match_function_and_data_after_init_timer
30 depends on patch && !context && !org && !report@
31 expression e1, e2, e3, e4, e5, a, b;
32 @@
33
34 -init_timer (&e1);
35 +setup_timer (&e1, a, b);
36
37 ... when != a = e2
38     when != b = e3
39 (
40 -e1.function = a;
41 ... when != b = e4
42 -e1.data = b;
43 |
44 -e1.data = b;
45 ... when != a = e5
46 -e1.function = a;
47 )
48
49 @r1 exists@
50 identifier f;
51 position p;
52 @@
53
54 f(...) { ... when any
55   init_timer@p(...)
56   ... when any
57 }
58
59 @r2 exists@
60 identifier g != r1.f;
61 struct timer_list t;
62 expression e8;
63 @@
64
65 g(...) { ... when any
66   t.data = e8
67   ... when any
68 }
69
70 // It is dangerous to use setup_timer if data field is initialized
71 // in another function.
72
73 @script:python depends on r2@
74 p << r1.p;
75 @@
76
77 cocci.include_match(False)
78
79 @r3 depends on patch && !context && !org && !report@
80 expression e6, e7, c;
81 position r1.p;
82 @@
83
84 -init_timer@p (&e6);
85 +setup_timer (&e6, c, 0UL);
86 ... when != c = e7
87 -e6.function = c;
88
89 // ----------------------------------------------------------------------------
90
91 @match_immediate_function_data_after_init_timer_context
92 depends on !patch && (context || org || report)@
93 expression da, e, func;
94 position j0, j1, j2;
95 @@
96
97 * init_timer@j0 (&e);
98 (
99 * e@j1.function = func;
100 * e@j2.data = da;
101 |
102 * e@j1.data = da;
103 * e@j2.function = func;
104 )
105
106 @match_function_and_data_after_init_timer_context
107 depends on !patch &&
108 !match_immediate_function_data_after_init_timer_context &&
109  (context || org || report)@
110 expression a, b, e1, e2, e3, e4, e5;
111 position j0, j1, j2;
112 @@
113
114 * init_timer@j0 (&e1);
115 ... when != a = e2
116     when != b = e3
117 (
118 * e1@j1.function = a;
119 ... when != b = e4
120 * e1@j2.data = b;
121 |
122 * e1@j1.data = b;
123 ... when != a = e5
124 * e1@j2.function = a;
125 )
126
127 @r3_context depends on !patch &&
128 !match_immediate_function_data_after_init_timer_context &&
129 !match_function_and_data_after_init_timer_context &&
130  (context || org || report)@
131 expression c, e6, e7;
132 position r1.p;
133 position j0, j1;
134 @@
135
136 * init_timer@j0@p (&e6);
137 ... when != c = e7
138 * e6@j1.function = c;
139
140 // ----------------------------------------------------------------------------
141
142 @script:python match_immediate_function_data_after_init_timer_org
143 depends on org@
144 j0 << match_immediate_function_data_after_init_timer_context.j0;
145 j1 << match_immediate_function_data_after_init_timer_context.j1;
146 j2 << match_immediate_function_data_after_init_timer_context.j2;
147 @@
148
149 msg = "Use setup_timer function."
150 coccilib.org.print_todo(j0[0], msg)
151 coccilib.org.print_link(j1[0], "")
152 coccilib.org.print_link(j2[0], "")
153
154 @script:python match_function_and_data_after_init_timer_org depends on org@
155 j0 << match_function_and_data_after_init_timer_context.j0;
156 j1 << match_function_and_data_after_init_timer_context.j1;
157 j2 << match_function_and_data_after_init_timer_context.j2;
158 @@
159
160 msg = "Use setup_timer function."
161 coccilib.org.print_todo(j0[0], msg)
162 coccilib.org.print_link(j1[0], "")
163 coccilib.org.print_link(j2[0], "")
164
165 @script:python r3_org depends on org@
166 j0 << r3_context.j0;
167 j1 << r3_context.j1;
168 @@
169
170 msg = "Use setup_timer function."
171 coccilib.org.print_todo(j0[0], msg)
172 coccilib.org.print_link(j1[0], "")
173
174 // ----------------------------------------------------------------------------
175
176 @script:python match_immediate_function_data_after_init_timer_report
177 depends on report@
178 j0 << match_immediate_function_data_after_init_timer_context.j0;
179 j1 << match_immediate_function_data_after_init_timer_context.j1;
180 @@
181
182 msg = "Use setup_timer function for function on line %s." % (j1[0].line)
183 coccilib.report.print_report(j0[0], msg)
184
185 @script:python match_function_and_data_after_init_timer_report depends on report@
186 j0 << match_function_and_data_after_init_timer_context.j0;
187 j1 << match_function_and_data_after_init_timer_context.j1;
188 @@
189
190 msg = "Use setup_timer function for function on line %s." % (j1[0].line)
191 coccilib.report.print_report(j0[0], msg)
192
193 @script:python r3_report depends on report@
194 j0 << r3_context.j0;
195 j1 << r3_context.j1;
196 @@
197
198 msg = "Use setup_timer function for function on line %s." % (j1[0].line)
199 coccilib.report.print_report(j0[0], msg)