xref: /openbmc/linux/scripts/coccinelle/locks/call_kern.cocci (revision 93f14468491747d6d3efd0b3a42785b1d51a127a)
1e105007cSNicolas Palix/// Find functions that refer to GFP_KERNEL but are called with locks held.
229a36d4dSJulia Lawall//# The proposed change of converting the GFP_KERNEL is not necessarily the
329a36d4dSJulia Lawall//# correct one.  It may be desired to unlock the lock, or to not call the
429a36d4dSJulia Lawall//# function under the lock in the first place.
5e105007cSNicolas Palix///
6e105007cSNicolas Palix// Confidence: Moderate
729a36d4dSJulia Lawall// Copyright: (C) 2012 Nicolas Palix.  GPLv2.
829a36d4dSJulia Lawall// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.  GPLv2.
929a36d4dSJulia Lawall// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.  GPLv2.
10e105007cSNicolas Palix// URL: http://coccinelle.lip6.fr/
11e105007cSNicolas Palix// Comments:
12*93f14468SNicolas Palix// Options: --no-includes --include-headers
13e105007cSNicolas Palix
14e105007cSNicolas Palixvirtual patch
1529a36d4dSJulia Lawallvirtual context
1629a36d4dSJulia Lawallvirtual org
1729a36d4dSJulia 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
3829a36d4dSJulia Lawall@locked exists@
39e105007cSNicolas Palixidentifier gfp.fn;
4029a36d4dSJulia Lawallposition p1,p2;
41e105007cSNicolas Palix@@
42e105007cSNicolas Palix
43e105007cSNicolas Palix(
4429a36d4dSJulia Lawallread_lock_irq@p1
45e105007cSNicolas Palix|
4629a36d4dSJulia Lawallwrite_lock_irq@p1
47e105007cSNicolas Palix|
4829a36d4dSJulia Lawallread_lock_irqsave@p1
49e105007cSNicolas Palix|
5029a36d4dSJulia Lawallwrite_lock_irqsave@p1
51e105007cSNicolas Palix|
5229a36d4dSJulia Lawallspin_lock@p1
53e105007cSNicolas Palix|
5429a36d4dSJulia Lawallspin_trylock@p1
55e105007cSNicolas Palix|
5629a36d4dSJulia Lawallspin_lock_irq@p1
57e105007cSNicolas Palix|
5829a36d4dSJulia Lawallspin_lock_irqsave@p1
59e105007cSNicolas Palix|
6029a36d4dSJulia 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(...)
7129a36d4dSJulia Lawallfn@p2(...)
72e105007cSNicolas Palix
7329a36d4dSJulia Lawall@depends on locked && patch@
74e105007cSNicolas Palixposition gfp.p;
75e105007cSNicolas Palix@@
76e105007cSNicolas Palix
77e105007cSNicolas Palix- GFP_KERNEL@p
78e105007cSNicolas Palix+ GFP_ATOMIC
7929a36d4dSJulia Lawall
8029a36d4dSJulia Lawall@depends on locked && !patch@
8129a36d4dSJulia Lawallposition gfp.p;
8229a36d4dSJulia Lawall@@
8329a36d4dSJulia Lawall
8429a36d4dSJulia Lawall* GFP_KERNEL@p
8529a36d4dSJulia Lawall
8629a36d4dSJulia Lawall@script:python depends on !patch && org@
8729a36d4dSJulia Lawallp << gfp.p;
8829a36d4dSJulia Lawallfn << gfp.fn;
8929a36d4dSJulia Lawallp1 << locked.p1;
9029a36d4dSJulia Lawallp2 << locked.p2;
9129a36d4dSJulia Lawall@@
9229a36d4dSJulia Lawall
9329a36d4dSJulia Lawallcocci.print_main("lock",p1)
9429a36d4dSJulia Lawallcocci.print_secs("call",p2)
9529a36d4dSJulia Lawallcocci.print_secs("GFP_KERNEL",p)
9629a36d4dSJulia Lawall
9729a36d4dSJulia Lawall@script:python depends on !patch && report@
9829a36d4dSJulia Lawallp << gfp.p;
9929a36d4dSJulia Lawallfn << gfp.fn;
10029a36d4dSJulia Lawallp1 << locked.p1;
10129a36d4dSJulia Lawallp2 << locked.p2;
10229a36d4dSJulia Lawall@@
10329a36d4dSJulia Lawall
10429a36d4dSJulia Lawallmsg = "ERROR: function %s called on line %s inside lock on line %s but uses GFP_KERNEL" % (fn,p2[0].line,p1[0].line)
10529a36d4dSJulia Lawallcoccilib.report.print_report(p[0], msg)
106