update Coccinelle URL
[linux-2.6-block.git] / scripts / coccinelle / locks / call_kern.cocci
CommitLineData
7f904d7e 1// SPDX-License-Identifier: GPL-2.0-only
e105007c 2/// Find functions that refer to GFP_KERNEL but are called with locks held.
29a36d4d
JL
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.
e105007c
NP
6///
7// Confidence: Moderate
7f904d7e
TG
8// Copyright: (C) 2012 Nicolas Palix.
9// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
10// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
f01701ce 11// URL: https://coccinelle.gitlabpages.inria.fr/website
e105007c 12// Comments:
93f14468 13// Options: --no-includes --include-headers
e105007c
NP
14
15virtual patch
29a36d4d
JL
16virtual context
17virtual org
18virtual report
e105007c
NP
19
20@gfp exists@
21identifier fn;
22position p;
23@@
24
25fn(...) {
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
29a36d4d 39@locked exists@
e105007c 40identifier gfp.fn;
29a36d4d 41position p1,p2;
e105007c
NP
42@@
43
44(
29a36d4d 45read_lock_irq@p1
e105007c 46|
29a36d4d 47write_lock_irq@p1
e105007c 48|
29a36d4d 49read_lock_irqsave@p1
e105007c 50|
29a36d4d 51write_lock_irqsave@p1
e105007c 52|
29a36d4d 53spin_lock@p1
e105007c 54|
29a36d4d 55spin_trylock@p1
e105007c 56|
29a36d4d 57spin_lock_irq@p1
e105007c 58|
29a36d4d 59spin_lock_irqsave@p1
e105007c 60|
29a36d4d 61local_irq_disable@p1
e105007c
NP
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(...)
29a36d4d 72fn@p2(...)
e105007c 73
29a36d4d 74@depends on locked && patch@
e105007c
NP
75position gfp.p;
76@@
77
78- GFP_KERNEL@p
79+ GFP_ATOMIC
29a36d4d
JL
80
81@depends on locked && !patch@
82position gfp.p;
83@@
84
85* GFP_KERNEL@p
86
87@script:python depends on !patch && org@
88p << gfp.p;
89fn << gfp.fn;
90p1 << locked.p1;
91p2 << locked.p2;
92@@
93
94cocci.print_main("lock",p1)
95cocci.print_secs("call",p2)
96cocci.print_secs("GFP_KERNEL",p)
97
98@script:python depends on !patch && report@
99p << gfp.p;
100fn << gfp.fn;
101p1 << locked.p1;
102p2 << locked.p2;
103@@
104
105msg = "ERROR: function %s called on line %s inside lock on line %s but uses GFP_KERNEL" % (fn,p2[0].line,p1[0].line)
106coccilib.report.print_report(p[0], msg)