Merge tag 'selinux-pr-20190726' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / scripts / coccinelle / locks / call_kern.cocci
1 // SPDX-License-Identifier: GPL-2.0-only
2 /// Find functions that refer to GFP_KERNEL but are called with locks held.
3 //# The proposed change of converting the GFP_KERNEL is not necessarily the
4 //# correct one.  It may be desired to unlock the lock, or to not call the
5 //# function under the lock in the first place.
6 ///
7 // Confidence: Moderate
8 // Copyright: (C) 2012 Nicolas Palix.
9 // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
10 // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
11 // URL: http://coccinelle.lip6.fr/
12 // Comments:
13 // Options: --no-includes --include-headers
14
15 virtual patch
16 virtual context
17 virtual org
18 virtual report
19
20 @gfp exists@
21 identifier fn;
22 position p;
23 @@
24
25 fn(...) {
26  ... when != read_unlock_irq(...)
27      when != write_unlock_irq(...)
28      when != read_unlock_irqrestore(...)
29      when != write_unlock_irqrestore(...)
30      when != spin_unlock(...)
31      when != spin_unlock_irq(...)
32      when != spin_unlock_irqrestore(...)
33      when != local_irq_enable(...)
34      when any
35  GFP_KERNEL@p
36  ... when any
37 }
38
39 @locked exists@
40 identifier gfp.fn;
41 position p1,p2;
42 @@
43
44 (
45 read_lock_irq@p1
46 |
47 write_lock_irq@p1
48 |
49 read_lock_irqsave@p1
50 |
51 write_lock_irqsave@p1
52 |
53 spin_lock@p1
54 |
55 spin_trylock@p1
56 |
57 spin_lock_irq@p1
58 |
59 spin_lock_irqsave@p1
60 |
61 local_irq_disable@p1
62 )
63  (...)
64 ...  when != read_unlock_irq(...)
65      when != write_unlock_irq(...)
66      when != read_unlock_irqrestore(...)
67      when != write_unlock_irqrestore(...)
68      when != spin_unlock(...)
69      when != spin_unlock_irq(...)
70      when != spin_unlock_irqrestore(...)
71      when != local_irq_enable(...)
72 fn@p2(...)
73
74 @depends on locked && patch@
75 position gfp.p;
76 @@
77
78 - GFP_KERNEL@p
79 + GFP_ATOMIC
80
81 @depends on locked && !patch@
82 position gfp.p;
83 @@
84
85 * GFP_KERNEL@p
86
87 @script:python depends on !patch && org@
88 p << gfp.p;
89 fn << gfp.fn;
90 p1 << locked.p1;
91 p2 << locked.p2;
92 @@
93
94 cocci.print_main("lock",p1)
95 cocci.print_secs("call",p2)
96 cocci.print_secs("GFP_KERNEL",p)
97
98 @script:python depends on !patch && report@
99 p << gfp.p;
100 fn << gfp.fn;
101 p1 << locked.p1;
102 p2 << locked.p2;
103 @@
104
105 msg = "ERROR: function %s called on line %s inside lock on line %s but uses GFP_KERNEL" % (fn,p2[0].line,p1[0].line)
106 coccilib.report.print_report(p[0], msg)