xref: /openbmc/linux/scripts/coccinelle/locks/call_kern.cocci (revision 29a36d4dec6cf7ad72e6e3337bf954096cbbb4cf)
1e105007cSNicolas Palix/// Find functions that refer to GFP_KERNEL but are called with locks held.
2*29a36d4dSJulia Lawall//# The proposed change of converting the GFP_KERNEL is not necessarily the
3*29a36d4dSJulia Lawall//# correct one.  It may be desired to unlock the lock, or to not call the
4*29a36d4dSJulia Lawall//# function under the lock in the first place.
5e105007cSNicolas Palix///
6e105007cSNicolas Palix// Confidence: Moderate
7*29a36d4dSJulia Lawall// Copyright: (C) 2012 Nicolas Palix.  GPLv2.
8*29a36d4dSJulia Lawall// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.  GPLv2.
9*29a36d4dSJulia Lawall// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.  GPLv2.
10e105007cSNicolas Palix// URL: http://coccinelle.lip6.fr/
11e105007cSNicolas Palix// Comments:
12e105007cSNicolas Palix// Options: -no_includes -include_headers
13e105007cSNicolas Palix
14e105007cSNicolas Palixvirtual patch
15*29a36d4dSJulia Lawallvirtual context
16*29a36d4dSJulia Lawallvirtual org
17*29a36d4dSJulia Lawallvirtual report
18e105007cSNicolas Palix
19e105007cSNicolas Palix@gfp exists@
20e105007cSNicolas Palixidentifier fn;
21e105007cSNicolas Palixposition p;
22e105007cSNicolas Palix@@
23e105007cSNicolas Palix
24e105007cSNicolas Palixfn(...) {
25e105007cSNicolas Palix ... when != read_unlock_irq(...)
26e105007cSNicolas Palix     when != write_unlock_irq(...)
27e105007cSNicolas Palix     when != read_unlock_irqrestore(...)
28e105007cSNicolas Palix     when != write_unlock_irqrestore(...)
29e105007cSNicolas Palix     when != spin_unlock(...)
30e105007cSNicolas Palix     when != spin_unlock_irq(...)
31e105007cSNicolas Palix     when != spin_unlock_irqrestore(...)
32e105007cSNicolas Palix     when != local_irq_enable(...)
33e105007cSNicolas Palix     when any
34e105007cSNicolas Palix GFP_KERNEL@p
35e105007cSNicolas Palix ... when any
36e105007cSNicolas Palix}
37e105007cSNicolas Palix
38*29a36d4dSJulia Lawall@locked exists@
39e105007cSNicolas Palixidentifier gfp.fn;
40*29a36d4dSJulia Lawallposition p1,p2;
41e105007cSNicolas Palix@@
42e105007cSNicolas Palix
43e105007cSNicolas Palix(
44*29a36d4dSJulia Lawallread_lock_irq@p1
45e105007cSNicolas Palix|
46*29a36d4dSJulia Lawallwrite_lock_irq@p1
47e105007cSNicolas Palix|
48*29a36d4dSJulia Lawallread_lock_irqsave@p1
49e105007cSNicolas Palix|
50*29a36d4dSJulia Lawallwrite_lock_irqsave@p1
51e105007cSNicolas Palix|
52*29a36d4dSJulia Lawallspin_lock@p1
53e105007cSNicolas Palix|
54*29a36d4dSJulia Lawallspin_trylock@p1
55e105007cSNicolas Palix|
56*29a36d4dSJulia Lawallspin_lock_irq@p1
57e105007cSNicolas Palix|
58*29a36d4dSJulia Lawallspin_lock_irqsave@p1
59e105007cSNicolas Palix|
60*29a36d4dSJulia Lawalllocal_irq_disable@p1
61e105007cSNicolas Palix)
62e105007cSNicolas Palix (...)
63e105007cSNicolas Palix...  when != read_unlock_irq(...)
64e105007cSNicolas Palix     when != write_unlock_irq(...)
65e105007cSNicolas Palix     when != read_unlock_irqrestore(...)
66e105007cSNicolas Palix     when != write_unlock_irqrestore(...)
67e105007cSNicolas Palix     when != spin_unlock(...)
68e105007cSNicolas Palix     when != spin_unlock_irq(...)
69e105007cSNicolas Palix     when != spin_unlock_irqrestore(...)
70e105007cSNicolas Palix     when != local_irq_enable(...)
71*29a36d4dSJulia Lawallfn@p2(...)
72e105007cSNicolas Palix
73*29a36d4dSJulia Lawall@depends on locked && patch@
74e105007cSNicolas Palixposition gfp.p;
75e105007cSNicolas Palix@@
76e105007cSNicolas Palix
77e105007cSNicolas Palix- GFP_KERNEL@p
78e105007cSNicolas Palix+ GFP_ATOMIC
79*29a36d4dSJulia Lawall
80*29a36d4dSJulia Lawall@depends on locked && !patch@
81*29a36d4dSJulia Lawallposition gfp.p;
82*29a36d4dSJulia Lawall@@
83*29a36d4dSJulia Lawall
84*29a36d4dSJulia Lawall* GFP_KERNEL@p
85*29a36d4dSJulia Lawall
86*29a36d4dSJulia Lawall@script:python depends on !patch && org@
87*29a36d4dSJulia Lawallp << gfp.p;
88*29a36d4dSJulia Lawallfn << gfp.fn;
89*29a36d4dSJulia Lawallp1 << locked.p1;
90*29a36d4dSJulia Lawallp2 << locked.p2;
91*29a36d4dSJulia Lawall@@
92*29a36d4dSJulia Lawall
93*29a36d4dSJulia Lawallcocci.print_main("lock",p1)
94*29a36d4dSJulia Lawallcocci.print_secs("call",p2)
95*29a36d4dSJulia Lawallcocci.print_secs("GFP_KERNEL",p)
96*29a36d4dSJulia Lawall
97*29a36d4dSJulia Lawall@script:python depends on !patch && report@
98*29a36d4dSJulia Lawallp << gfp.p;
99*29a36d4dSJulia Lawallfn << gfp.fn;
100*29a36d4dSJulia Lawallp1 << locked.p1;
101*29a36d4dSJulia Lawallp2 << locked.p2;
102*29a36d4dSJulia Lawall@@
103*29a36d4dSJulia Lawall
104*29a36d4dSJulia Lawallmsg = "ERROR: function %s called on line %s inside lock on line %s but uses GFP_KERNEL" % (fn,p2[0].line,p1[0].line)
105*29a36d4dSJulia Lawallcoccilib.report.print_report(p[0], msg)
106