xref: /openbmc/linux/scripts/coccinelle/locks/call_kern.cocci (revision e105007c1271243568d58c8a4285b19c8eea48d1)
1*e105007cSNicolas Palix/// Find functions that refer to GFP_KERNEL but are called with locks held.
2*e105007cSNicolas Palix/// The proposed change of converting the GFP_KERNEL is not necessarily the
3*e105007cSNicolas Palix/// correct one.  It may be desired to unlock the lock, or to not call the
4*e105007cSNicolas Palix/// function under the lock in the first place.
5*e105007cSNicolas Palix///
6*e105007cSNicolas Palix// Confidence: Moderate
7*e105007cSNicolas Palix// Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2.
8*e105007cSNicolas Palix// Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2.
9*e105007cSNicolas Palix// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.
10*e105007cSNicolas Palix// URL: http://coccinelle.lip6.fr/
11*e105007cSNicolas Palix// Comments:
12*e105007cSNicolas Palix// Options: -no_includes -include_headers
13*e105007cSNicolas Palix
14*e105007cSNicolas Palixvirtual patch
15*e105007cSNicolas Palix
16*e105007cSNicolas Palix@gfp exists@
17*e105007cSNicolas Palixidentifier fn;
18*e105007cSNicolas Palixposition p;
19*e105007cSNicolas Palix@@
20*e105007cSNicolas Palix
21*e105007cSNicolas Palixfn(...) {
22*e105007cSNicolas Palix ... when != read_unlock_irq(...)
23*e105007cSNicolas Palix     when != write_unlock_irq(...)
24*e105007cSNicolas Palix     when != read_unlock_irqrestore(...)
25*e105007cSNicolas Palix     when != write_unlock_irqrestore(...)
26*e105007cSNicolas Palix     when != spin_unlock(...)
27*e105007cSNicolas Palix     when != spin_unlock_irq(...)
28*e105007cSNicolas Palix     when != spin_unlock_irqrestore(...)
29*e105007cSNicolas Palix     when != local_irq_enable(...)
30*e105007cSNicolas Palix     when any
31*e105007cSNicolas Palix GFP_KERNEL@p
32*e105007cSNicolas Palix ... when any
33*e105007cSNicolas Palix}
34*e105007cSNicolas Palix
35*e105007cSNicolas Palix@locked@
36*e105007cSNicolas Palixidentifier gfp.fn;
37*e105007cSNicolas Palix@@
38*e105007cSNicolas Palix
39*e105007cSNicolas Palix(
40*e105007cSNicolas Palixread_lock_irq
41*e105007cSNicolas Palix|
42*e105007cSNicolas Palixwrite_lock_irq
43*e105007cSNicolas Palix|
44*e105007cSNicolas Palixread_lock_irqsave
45*e105007cSNicolas Palix|
46*e105007cSNicolas Palixwrite_lock_irqsave
47*e105007cSNicolas Palix|
48*e105007cSNicolas Palixspin_lock
49*e105007cSNicolas Palix|
50*e105007cSNicolas Palixspin_trylock
51*e105007cSNicolas Palix|
52*e105007cSNicolas Palixspin_lock_irq
53*e105007cSNicolas Palix|
54*e105007cSNicolas Palixspin_lock_irqsave
55*e105007cSNicolas Palix|
56*e105007cSNicolas Palixlocal_irq_disable
57*e105007cSNicolas Palix)
58*e105007cSNicolas Palix (...)
59*e105007cSNicolas Palix...  when != read_unlock_irq(...)
60*e105007cSNicolas Palix     when != write_unlock_irq(...)
61*e105007cSNicolas Palix     when != read_unlock_irqrestore(...)
62*e105007cSNicolas Palix     when != write_unlock_irqrestore(...)
63*e105007cSNicolas Palix     when != spin_unlock(...)
64*e105007cSNicolas Palix     when != spin_unlock_irq(...)
65*e105007cSNicolas Palix     when != spin_unlock_irqrestore(...)
66*e105007cSNicolas Palix     when != local_irq_enable(...)
67*e105007cSNicolas Palixfn(...)
68*e105007cSNicolas Palix
69*e105007cSNicolas Palix@depends on locked@
70*e105007cSNicolas Palixposition gfp.p;
71*e105007cSNicolas Palix@@
72*e105007cSNicolas Palix
73*e105007cSNicolas Palix- GFP_KERNEL@p
74*e105007cSNicolas Palix+ GFP_ATOMIC
75