diff options
Diffstat (limited to 'scripts/coccinelle/locks/call_kern.cocci')
-rw-r--r-- | scripts/coccinelle/locks/call_kern.cocci | 67 |
1 files changed, 49 insertions, 18 deletions
diff --git a/scripts/coccinelle/locks/call_kern.cocci b/scripts/coccinelle/locks/call_kern.cocci index 00af5344a68f..8f10b49603c3 100644 --- a/scripts/coccinelle/locks/call_kern.cocci +++ b/scripts/coccinelle/locks/call_kern.cocci | |||
@@ -1,17 +1,20 @@ | |||
1 | /// Find functions that refer to GFP_KERNEL but are called with locks held. | 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 | 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 | 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. | 4 | //# function under the lock in the first place. |
5 | /// | 5 | /// |
6 | // Confidence: Moderate | 6 | // Confidence: Moderate |
7 | // Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2. | 7 | // Copyright: (C) 2012 Nicolas Palix. GPLv2. |
8 | // Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2. | 8 | // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. |
9 | // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2. | 9 | // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. |
10 | // URL: http://coccinelle.lip6.fr/ | 10 | // URL: http://coccinelle.lip6.fr/ |
11 | // Comments: | 11 | // Comments: |
12 | // Options: -no_includes -include_headers | 12 | // Options: -no_includes -include_headers |
13 | 13 | ||
14 | virtual patch | 14 | virtual patch |
15 | virtual context | ||
16 | virtual org | ||
17 | virtual report | ||
15 | 18 | ||
16 | @gfp exists@ | 19 | @gfp exists@ |
17 | identifier fn; | 20 | identifier fn; |
@@ -32,28 +35,29 @@ fn(...) { | |||
32 | ... when any | 35 | ... when any |
33 | } | 36 | } |
34 | 37 | ||
35 | @locked@ | 38 | @locked exists@ |
36 | identifier gfp.fn; | 39 | identifier gfp.fn; |
40 | position p1,p2; | ||
37 | @@ | 41 | @@ |
38 | 42 | ||
39 | ( | 43 | ( |
40 | read_lock_irq | 44 | read_lock_irq@p1 |
41 | | | 45 | | |
42 | write_lock_irq | 46 | write_lock_irq@p1 |
43 | | | 47 | | |
44 | read_lock_irqsave | 48 | read_lock_irqsave@p1 |
45 | | | 49 | | |
46 | write_lock_irqsave | 50 | write_lock_irqsave@p1 |
47 | | | 51 | | |
48 | spin_lock | 52 | spin_lock@p1 |
49 | | | 53 | | |
50 | spin_trylock | 54 | spin_trylock@p1 |
51 | | | 55 | | |
52 | spin_lock_irq | 56 | spin_lock_irq@p1 |
53 | | | 57 | | |
54 | spin_lock_irqsave | 58 | spin_lock_irqsave@p1 |
55 | | | 59 | | |
56 | local_irq_disable | 60 | local_irq_disable@p1 |
57 | ) | 61 | ) |
58 | (...) | 62 | (...) |
59 | ... when != read_unlock_irq(...) | 63 | ... when != read_unlock_irq(...) |
@@ -64,11 +68,38 @@ local_irq_disable | |||
64 | when != spin_unlock_irq(...) | 68 | when != spin_unlock_irq(...) |
65 | when != spin_unlock_irqrestore(...) | 69 | when != spin_unlock_irqrestore(...) |
66 | when != local_irq_enable(...) | 70 | when != local_irq_enable(...) |
67 | fn(...) | 71 | fn@p2(...) |
68 | 72 | ||
69 | @depends on locked@ | 73 | @depends on locked && patch@ |
70 | position gfp.p; | 74 | position gfp.p; |
71 | @@ | 75 | @@ |
72 | 76 | ||
73 | - GFP_KERNEL@p | 77 | - GFP_KERNEL@p |
74 | + GFP_ATOMIC | 78 | + GFP_ATOMIC |
79 | |||
80 | @depends on locked && !patch@ | ||
81 | position gfp.p; | ||
82 | @@ | ||
83 | |||
84 | * GFP_KERNEL@p | ||
85 | |||
86 | @script:python depends on !patch && org@ | ||
87 | p << gfp.p; | ||
88 | fn << gfp.fn; | ||
89 | p1 << locked.p1; | ||
90 | p2 << locked.p2; | ||
91 | @@ | ||
92 | |||
93 | cocci.print_main("lock",p1) | ||
94 | cocci.print_secs("call",p2) | ||
95 | cocci.print_secs("GFP_KERNEL",p) | ||
96 | |||
97 | @script:python depends on !patch && report@ | ||
98 | p << gfp.p; | ||
99 | fn << gfp.fn; | ||
100 | p1 << locked.p1; | ||
101 | p2 << locked.p2; | ||
102 | @@ | ||
103 | |||
104 | msg = "ERROR: function %s called on line %s inside lock on line %s but uses GFP_KERNEL" % (fn,p2[0].line,p1[0].line) | ||
105 | coccilib.report.print_report(p[0], msg) | ||