Commit e105007c1271243568d58c8a4285b19c8eea48d1
Committed by
Michal Marek
1 parent
7703692ef8
Exists in
master
and in
7 other branches
Coccinelle: Add locks/call_kern.cocci
Find functions that refer to GFP_KERNEL but are called with locks held. The proposed change of converting the GFP_KERNEL is not necessarily the correct one. It may be desired to unlock the lock, or to not call the function under the lock in the first place. Signed-off-by: Nicolas Palix <npalix@diku.dk> Signed-off-by: Julia Lawall <julia@diku.dk> Signed-off-by: Michal Marek <mmarek@suse.cz>
Showing 1 changed file with 74 additions and 0 deletions Side-by-side Diff
scripts/coccinelle/locks/call_kern.cocci
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 | + | |
14 | +virtual patch | |
15 | + | |
16 | +@gfp exists@ | |
17 | +identifier fn; | |
18 | +position p; | |
19 | +@@ | |
20 | + | |
21 | +fn(...) { | |
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@ | |
36 | +identifier gfp.fn; | |
37 | +@@ | |
38 | + | |
39 | +( | |
40 | +read_lock_irq | |
41 | +| | |
42 | +write_lock_irq | |
43 | +| | |
44 | +read_lock_irqsave | |
45 | +| | |
46 | +write_lock_irqsave | |
47 | +| | |
48 | +spin_lock | |
49 | +| | |
50 | +spin_trylock | |
51 | +| | |
52 | +spin_lock_irq | |
53 | +| | |
54 | +spin_lock_irqsave | |
55 | +| | |
56 | +local_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(...) | |
67 | +fn(...) | |
68 | + | |
69 | +@depends on locked@ | |
70 | +position gfp.p; | |
71 | +@@ | |
72 | + | |
73 | +- GFP_KERNEL@p | |
74 | ++ GFP_ATOMIC |