Merge tag 'block-5.11-2021-01-10' of git://git.kernel.dk/linux-block
[linux/fpc-iii.git] / scripts / coccinelle / locks / call_kern.cocci
blob5ca0d81b0015f29db7d2bfafeb36794aca037cb1
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
15 virtual patch
16 virtual context
17 virtual org
18 virtual report
20 @gfp exists@
21 identifier fn;
22 position p;
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
39 @locked exists@
40 identifier gfp.fn;
41 position p1,p2;
45 read_lock_irq@p1
47 write_lock_irq@p1
49 read_lock_irqsave@p1
51 write_lock_irqsave@p1
53 spin_lock@p1
55 spin_trylock@p1
57 spin_lock_irq@p1
59 spin_lock_irqsave@p1
61 local_irq_disable@p1
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(...)
74 @depends on locked && patch@
75 position gfp.p;
78 - GFP_KERNEL@p
79 + GFP_ATOMIC
81 @depends on locked && !patch@
82 position gfp.p;
85 * GFP_KERNEL@p
87 @script:python depends on !patch && org@
88 p << gfp.p;
89 fn << gfp.fn;
90 p1 << locked.p1;
91 p2 << locked.p2;
94 cocci.print_main("lock",p1)
95 cocci.print_secs("call",p2)
96 cocci.print_secs("GFP_KERNEL",p)
98 @script:python depends on !patch && report@
99 p << gfp.p;
100 fn << gfp.fn;
101 p1 << locked.p1;
102 p2 << locked.p2;
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)