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