xref: /dflybsd-src/test/cocci/unlock_return.cocci (revision d5a7158eca527110a20ffdf1b1db59be1300a679)
149357869SSascha Wildner//
2da3a745fSSascha Wildner// Look for missing lock releases before returning from an error path.
3da3a745fSSascha Wildner//
4b348c75dSSascha Wildner// Target: DragonFly
5da3a745fSSascha Wildner// Copyright:  2012 - LIP6/INRIA
6da3a745fSSascha Wildner// License:  Licensed under ISC. See LICENSE or http://www.isc.org/software/license
7da3a745fSSascha Wildner// Author: Julia Lawall <Julia.Lawall@lip6.fr>
8b348c75dSSascha Wildner//         (original code, adapted for DragonFly by swildner)
9da3a745fSSascha Wildner// URL: http://coccinelle.lip6.fr/
10da3a745fSSascha Wildner// URL: http://coccinellery.org/
1149357869SSascha Wildner//
12cfa4e38fSSascha Wildner// Applies to kernel code.
13cfa4e38fSSascha Wildner//
1449357869SSascha Wildner// NOTES
1549357869SSascha Wildner// -----
1649357869SSascha Wildner// * The results of running this patch have to be carefully reviewed.
1749357869SSascha Wildner//   Some functions legally return with the lock held, even if the
1849357869SSascha Wildner//   below pattern matches. Some other functions begin with the lock
19cfa4e38fSSascha Wildner//   held, only to release and then reacquire it again.
2049357869SSascha Wildner//
2149357869SSascha Wildner// * Consider using -timeout because it might run a long time
2249357869SSascha Wildner//   (indefinitely?) on some files.
2349357869SSascha Wildner//
2449357869SSascha Wildner
25*d5a7158eSSascha Wildner// ACPI_SERIAL_BEGIN(...) / ACPI_SERIAL_END(...)
26*d5a7158eSSascha Wildner//
27*d5a7158eSSascha Wildner@rcu_ACPI_SERIAL_BEGIN exists@
28*d5a7158eSSascha Wildnerposition p1;
29*d5a7158eSSascha Wildnerexpression E;
30*d5a7158eSSascha Wildner@@
31*d5a7158eSSascha Wildner
32*d5a7158eSSascha WildnerACPI_SERIAL_BEGIN@p1(E);
33*d5a7158eSSascha Wildner...
34*d5a7158eSSascha WildnerACPI_SERIAL_END(E);
35*d5a7158eSSascha Wildner
36*d5a7158eSSascha Wildner@exists@
37*d5a7158eSSascha Wildnerposition rcu_ACPI_SERIAL_BEGIN.p1;
38*d5a7158eSSascha Wildnerexpression E;
39*d5a7158eSSascha Wildner@@
40*d5a7158eSSascha Wildner
41*d5a7158eSSascha Wildner*ACPI_SERIAL_BEGIN@p1(E);
42*d5a7158eSSascha Wildner... when != ACPI_SERIAL_END(E);
43*d5a7158eSSascha Wildner?*return ...;
44*d5a7158eSSascha Wildner
4549357869SSascha Wildner// crit_enter() / crit_exit()
4649357869SSascha Wildner//
47da3a745fSSascha Wildner@rcu_crit_enter exists@
48da3a745fSSascha Wildnerposition p1;
4949357869SSascha Wildner@@
50da3a745fSSascha Wildner
51da3a745fSSascha Wildnercrit_enter@p1();
52da3a745fSSascha Wildner...
5349357869SSascha Wildnercrit_exit();
54da3a745fSSascha Wildner
55da3a745fSSascha Wildner@exists@
56da3a745fSSascha Wildnerposition rcu_crit_enter.p1;
57da3a745fSSascha Wildner@@
58da3a745fSSascha Wildner
59da3a745fSSascha Wildner*crit_enter@p1();
60da3a745fSSascha Wildner... when != crit_exit();
61da3a745fSSascha Wildner?*return ...;
6249357869SSascha Wildner
6349357869SSascha Wildner// get_mplock() / rel_mplock()
6449357869SSascha Wildner//
65da3a745fSSascha Wildner@rcu_get_mplock exists@
66da3a745fSSascha Wildnerposition p1;
6749357869SSascha Wildner@@
68da3a745fSSascha Wildner
69da3a745fSSascha Wildnerget_mplock@p1();
70da3a745fSSascha Wildner...
7149357869SSascha Wildnerrel_mplock();
72da3a745fSSascha Wildner
73da3a745fSSascha Wildner@exists@
74da3a745fSSascha Wildnerposition rcu_get_mplock.p1;
75da3a745fSSascha Wildner@@
76da3a745fSSascha Wildner
77da3a745fSSascha Wildner*get_mplock@p1();
78da3a745fSSascha Wildner... when != rel_mplock();
79da3a745fSSascha Wildner?*return ...;
8049357869SSascha Wildner
8149357869SSascha Wildner// lockmgr(..., {LK_EXCLUSIVE,LK_SHARED}) / lockmgr(..., LK_RELEASE)
8249357869SSascha Wildner//
83da3a745fSSascha Wildner@rcu_lockmgr exists@
84da3a745fSSascha Wildnerposition p1;
85da3a745fSSascha Wildnerexpression E;
8649357869SSascha Wildner@@
87da3a745fSSascha Wildner
88da3a745fSSascha Wildnerlockmgr@p1(E,\(LK_SHARED\|LK_EXCLUSIVE\));
89da3a745fSSascha Wildner...
90da3a745fSSascha Wildnerlockmgr(E,LK_RELEASE);
91da3a745fSSascha Wildner
92da3a745fSSascha Wildner@exists@
93da3a745fSSascha Wildnerposition rcu_lockmgr.p1;
94da3a745fSSascha Wildnerexpression E;
9549357869SSascha Wildner@@
96da3a745fSSascha Wildner
97da3a745fSSascha Wildner*lockmgr@p1(E,\(LK_SHARED\|LK_EXCLUSIVE\));
98da3a745fSSascha Wildner... when != lockmgr(E,LK_RELEASE);
99da3a745fSSascha Wildner?*return ...;
10049357869SSascha Wildner
10149357869SSascha Wildner// lwkt_gettoken(...) / lwkt_reltoken(...)
10249357869SSascha Wildner//
103da3a745fSSascha Wildner@rcu_lwkt_gettoken exists@
104da3a745fSSascha Wildnerposition p1;
105da3a745fSSascha Wildnerexpression E;
10649357869SSascha Wildner@@
107da3a745fSSascha Wildner
108da3a745fSSascha Wildnerlwkt_gettoken@p1(E);
109da3a745fSSascha Wildner...
110da3a745fSSascha Wildnerlwkt_reltoken(E);
111da3a745fSSascha Wildner
112da3a745fSSascha Wildner@exists@
113da3a745fSSascha Wildnerposition rcu_lwkt_gettoken.p1;
114da3a745fSSascha Wildnerexpression E;
11549357869SSascha Wildner@@
116da3a745fSSascha Wildner
117da3a745fSSascha Wildner*lwkt_gettoken@p1(E);
118da3a745fSSascha Wildner... when != lwkt_reltoken(E);
119da3a745fSSascha Wildner?*return ...;
12049357869SSascha Wildner
12149357869SSascha Wildner// lwkt_serialize_enter(...) / lwkt_serialize_exit(...)
12249357869SSascha Wildner//
123da3a745fSSascha Wildner@rcu_lwkt_serialize_enter exists@
124da3a745fSSascha Wildnerposition p1;
125da3a745fSSascha Wildnerexpression E;
12649357869SSascha Wildner@@
127da3a745fSSascha Wildner
128da3a745fSSascha Wildnerlwkt_serialize_enter@p1(E);
129da3a745fSSascha Wildner...
130da3a745fSSascha Wildnerlwkt_serialize_exit(E);
131da3a745fSSascha Wildner
132da3a745fSSascha Wildner@exists@
133da3a745fSSascha Wildnerposition rcu_lwkt_serialize_enter.p1;
134da3a745fSSascha Wildnerexpression E;
13549357869SSascha Wildner@@
136da3a745fSSascha Wildner
137da3a745fSSascha Wildner*lwkt_serialize_enter@p1(E);
138da3a745fSSascha Wildner... when != lwkt_serialize_exit(E);
139da3a745fSSascha Wildner?*return ...;
14049357869SSascha Wildner
14166632c1aSSascha Wildner// nlookup_init(...) / nlookup_done(...)
14266632c1aSSascha Wildner//
14366632c1aSSascha Wildner@rcu_nlookup_init exists@
14466632c1aSSascha Wildnerposition p1;
14566632c1aSSascha Wildnerexpression E;
14666632c1aSSascha Wildner@@
14766632c1aSSascha Wildner
14866632c1aSSascha Wildnernlookup_init@p1(E,...);
14966632c1aSSascha Wildner...
15066632c1aSSascha Wildnernlookup_done(E);
15166632c1aSSascha Wildner
15266632c1aSSascha Wildner@exists@
15366632c1aSSascha Wildnerposition rcu_nlookup_init.p1;
15466632c1aSSascha Wildnerexpression E;
15566632c1aSSascha Wildner@@
15666632c1aSSascha Wildner
15766632c1aSSascha Wildner*nlookup_init@p1(E,...);
15866632c1aSSascha Wildner... when != nlookup_done(E);
15966632c1aSSascha Wildner?*return ...;
16066632c1aSSascha Wildner
16149357869SSascha Wildner// spin_lock(...) / spin_unlock(...)
16249357869SSascha Wildner//
163da3a745fSSascha Wildner@rcu_spin_lock exists@
164da3a745fSSascha Wildnerposition p1;
165da3a745fSSascha Wildnerexpression E;
16649357869SSascha Wildner@@
167da3a745fSSascha Wildner
168da3a745fSSascha Wildnerspin_lock@p1(E);
169da3a745fSSascha Wildner...
170da3a745fSSascha Wildnerspin_unlock(E);
171da3a745fSSascha Wildner
172da3a745fSSascha Wildner@exists@
173da3a745fSSascha Wildnerposition rcu_spin_lock.p1;
174da3a745fSSascha Wildnerexpression E;
17549357869SSascha Wildner@@
176da3a745fSSascha Wildner
177da3a745fSSascha Wildner*spin_lock@p1(E);
178da3a745fSSascha Wildner... when != spin_unlock(E);
179da3a745fSSascha Wildner?*return ...;
180be55a667SSascha Wildner
181be55a667SSascha Wildner// vm_object_hold(...) / vm_object_drop(...)
182be55a667SSascha Wildner//
183da3a745fSSascha Wildner@rcu_vm_object_hold exists@
184da3a745fSSascha Wildnerposition p1;
185da3a745fSSascha Wildnerexpression E;
186be55a667SSascha Wildner@@
187da3a745fSSascha Wildner
188da3a745fSSascha Wildnervm_object_hold@p1(E);
189da3a745fSSascha Wildner...
190da3a745fSSascha Wildnervm_object_drop(E);
191da3a745fSSascha Wildner
192da3a745fSSascha Wildner@exists@
193da3a745fSSascha Wildnerposition rcu_vm_object_hold.p1;
194da3a745fSSascha Wildnerexpression E;
195be55a667SSascha Wildner@@
196da3a745fSSascha Wildner
197da3a745fSSascha Wildner*vm_object_hold@p1(E);
198da3a745fSSascha Wildner... when != vm_object_drop(E);
199da3a745fSSascha Wildner?*return ...;
200b348c75dSSascha Wildner
201b348c75dSSascha Wildner// vn_lock(...) / vn_unlock(...)
202b348c75dSSascha Wildner//
203b348c75dSSascha Wildner@rcu_vn_lock exists@
204b348c75dSSascha Wildnerposition p1;
205b348c75dSSascha Wildnerexpression E;
206b348c75dSSascha Wildner@@
207b348c75dSSascha Wildner
208b348c75dSSascha Wildner(
209b348c75dSSascha Wildnervn_lock@p1(E,...);
210b348c75dSSascha Wildner|
211b348c75dSSascha Wildnervget@p1(E);
212b348c75dSSascha Wildner)
213b348c75dSSascha Wildner...
214b348c75dSSascha Wildner(
215b348c75dSSascha Wildnervn_unlock(E);
216b348c75dSSascha Wildner|
217b348c75dSSascha Wildnervput(E);
218b348c75dSSascha Wildner)
219b348c75dSSascha Wildner
220b348c75dSSascha Wildner@exists@
221b348c75dSSascha Wildnerposition rcu_vn_lock.p1;
222b348c75dSSascha Wildnerexpression E;
223b348c75dSSascha Wildner@@
224b348c75dSSascha Wildner
225b348c75dSSascha Wildner(
226b348c75dSSascha Wildner*vn_lock@p1(E,...);
227b348c75dSSascha Wildner|
228b348c75dSSascha Wildner*vget@p1(E);
229b348c75dSSascha Wildner)
230b348c75dSSascha Wildner... when != \(vn_unlock\|vput\)(E);
231b348c75dSSascha Wildner?*return ...;
232b348c75dSSascha Wildner
23366632c1aSSascha Wildner// wlan_serialize_enter() / wlan_serialize_exit()
234b348c75dSSascha Wildner//
235b348c75dSSascha Wildner@rcu_wlan_serialize_enter exists@
236b348c75dSSascha Wildnerposition p1;
237b348c75dSSascha Wildner@@
238b348c75dSSascha Wildner
239b348c75dSSascha Wildnerwlan_serialize_enter@p1();
240b348c75dSSascha Wildner...
241b348c75dSSascha Wildnerwlan_serialize_exit();
242b348c75dSSascha Wildner
243b348c75dSSascha Wildner@exists@
244b348c75dSSascha Wildnerposition rcu_wlan_serialize_enter.p1;
245b348c75dSSascha Wildner@@
246b348c75dSSascha Wildner
247b348c75dSSascha Wildner*wlan_serialize_enter@p1();
248b348c75dSSascha Wildner... when != wlan_serialize_exit();
249b348c75dSSascha Wildner?*return ...;
250