Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[cris-mirror.git] / scripts / coccinelle / locks / call_kern.cocci
blob669b24436248d33a5fde8694375c8528de752f08
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) 2012 Nicolas Palix.  GPLv2.
8 // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.  GPLv2.
9 // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.  GPLv2.
10 // URL: http://coccinelle.lip6.fr/
11 // Comments:
12 // Options: --no-includes --include-headers
14 virtual patch
15 virtual context
16 virtual org
17 virtual report
19 @gfp exists@
20 identifier fn;
21 position p;
24 fn(...) {
25  ... when != read_unlock_irq(...)
26      when != write_unlock_irq(...)
27      when != read_unlock_irqrestore(...)
28      when != write_unlock_irqrestore(...)
29      when != spin_unlock(...)
30      when != spin_unlock_irq(...)
31      when != spin_unlock_irqrestore(...)
32      when != local_irq_enable(...)
33      when any
34  GFP_KERNEL@p
35  ... when any
38 @locked exists@
39 identifier gfp.fn;
40 position p1,p2;
44 read_lock_irq@p1
46 write_lock_irq@p1
48 read_lock_irqsave@p1
50 write_lock_irqsave@p1
52 spin_lock@p1
54 spin_trylock@p1
56 spin_lock_irq@p1
58 spin_lock_irqsave@p1
60 local_irq_disable@p1
62  (...)
63 ...  when != read_unlock_irq(...)
64      when != write_unlock_irq(...)
65      when != read_unlock_irqrestore(...)
66      when != write_unlock_irqrestore(...)
67      when != spin_unlock(...)
68      when != spin_unlock_irq(...)
69      when != spin_unlock_irqrestore(...)
70      when != local_irq_enable(...)
71 fn@p2(...)
73 @depends on locked && patch@
74 position gfp.p;
77 - GFP_KERNEL@p
78 + GFP_ATOMIC
80 @depends on locked && !patch@
81 position gfp.p;
84 * GFP_KERNEL@p
86 @script:python depends on !patch && org@
87 p << gfp.p;
88 fn << gfp.fn;
89 p1 << locked.p1;
90 p2 << locked.p2;
93 cocci.print_main("lock",p1)
94 cocci.print_secs("call",p2)
95 cocci.print_secs("GFP_KERNEL",p)
97 @script:python depends on !patch && report@
98 p << gfp.p;
99 fn << gfp.fn;
100 p1 << locked.p1;
101 p2 << locked.p2;
104 msg = "ERROR: function %s called on line %s inside lock on line %s but uses GFP_KERNEL" % (fn,p2[0].line,p1[0].line)
105 coccilib.report.print_report(p[0], msg)