1/// Find functions that refer to GFP_KERNEL but are called with locks held.
2/// The proposed change of converting the GFP_KERNEL is not necessarily the
3/// correct one.  It may be desired to unlock the lock, or to not call the
4/// function under the lock in the first place.
5///
6// Confidence: Moderate
7// Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2.
8// Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2.
9// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.
10// URL: http://coccinelle.lip6.fr/
11// Comments:
12// Options: -no_includes -include_headers
13
14virtual patch
15
16@gfp exists@
17identifier fn;
18position p;
19@@
20
21fn(...) {
22 ... when != read_unlock_irq(...)
23     when != write_unlock_irq(...)
24     when != read_unlock_irqrestore(...)
25     when != write_unlock_irqrestore(...)
26     when != spin_unlock(...)
27     when != spin_unlock_irq(...)
28     when != spin_unlock_irqrestore(...)
29     when != local_irq_enable(...)
30     when any
31 GFP_KERNEL@p
32 ... when any
33}
34
35@locked@
36identifier gfp.fn;
37@@
38
39(
40read_lock_irq
41|
42write_lock_irq
43|
44read_lock_irqsave
45|
46write_lock_irqsave
47|
48spin_lock
49|
50spin_trylock
51|
52spin_lock_irq
53|
54spin_lock_irqsave
55|
56local_irq_disable
57)
58 (...)
59...  when != read_unlock_irq(...)
60     when != write_unlock_irq(...)
61     when != read_unlock_irqrestore(...)
62     when != write_unlock_irqrestore(...)
63     when != spin_unlock(...)
64     when != spin_unlock_irq(...)
65     when != spin_unlock_irqrestore(...)
66     when != local_irq_enable(...)
67fn(...)
68
69@depends on locked@
70position gfp.p;
71@@
72
73- GFP_KERNEL@p
74+ GFP_ATOMIC
75