Blame view
scripts/coccinelle/locks/call_kern.cocci
2.11 KB
e105007c1 Coccinelle: Add l... |
1 |
/// Find functions that refer to GFP_KERNEL but are called with locks held. |
29a36d4de scripts/coccinell... |
2 3 4 |
//# 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. |
e105007c1 Coccinelle: Add l... |
5 6 |
/// // Confidence: Moderate |
29a36d4de scripts/coccinell... |
7 8 9 |
// Copyright: (C) 2012 Nicolas Palix. GPLv2. // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. |
e105007c1 Coccinelle: Add l... |
10 11 12 13 14 |
// URL: http://coccinelle.lip6.fr/ // Comments: // Options: -no_includes -include_headers virtual patch |
29a36d4de scripts/coccinell... |
15 16 17 |
virtual context virtual org virtual report |
e105007c1 Coccinelle: Add l... |
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
@gfp exists@ identifier fn; position p; @@ fn(...) { ... when != read_unlock_irq(...) when != write_unlock_irq(...) when != read_unlock_irqrestore(...) when != write_unlock_irqrestore(...) when != spin_unlock(...) when != spin_unlock_irq(...) when != spin_unlock_irqrestore(...) when != local_irq_enable(...) when any GFP_KERNEL@p ... when any } |
29a36d4de scripts/coccinell... |
37 |
@locked exists@ |
e105007c1 Coccinelle: Add l... |
38 |
identifier gfp.fn; |
29a36d4de scripts/coccinell... |
39 |
position p1,p2; |
e105007c1 Coccinelle: Add l... |
40 41 42 |
@@ ( |
29a36d4de scripts/coccinell... |
43 |
read_lock_irq@p1 |
e105007c1 Coccinelle: Add l... |
44 |
| |
29a36d4de scripts/coccinell... |
45 |
write_lock_irq@p1 |
e105007c1 Coccinelle: Add l... |
46 |
| |
29a36d4de scripts/coccinell... |
47 |
read_lock_irqsave@p1 |
e105007c1 Coccinelle: Add l... |
48 |
| |
29a36d4de scripts/coccinell... |
49 |
write_lock_irqsave@p1 |
e105007c1 Coccinelle: Add l... |
50 |
| |
29a36d4de scripts/coccinell... |
51 |
spin_lock@p1 |
e105007c1 Coccinelle: Add l... |
52 |
| |
29a36d4de scripts/coccinell... |
53 |
spin_trylock@p1 |
e105007c1 Coccinelle: Add l... |
54 |
| |
29a36d4de scripts/coccinell... |
55 |
spin_lock_irq@p1 |
e105007c1 Coccinelle: Add l... |
56 |
| |
29a36d4de scripts/coccinell... |
57 |
spin_lock_irqsave@p1 |
e105007c1 Coccinelle: Add l... |
58 |
| |
29a36d4de scripts/coccinell... |
59 |
local_irq_disable@p1 |
e105007c1 Coccinelle: Add l... |
60 61 62 63 64 65 66 67 68 69 |
) (...) ... when != read_unlock_irq(...) when != write_unlock_irq(...) when != read_unlock_irqrestore(...) when != write_unlock_irqrestore(...) when != spin_unlock(...) when != spin_unlock_irq(...) when != spin_unlock_irqrestore(...) when != local_irq_enable(...) |
29a36d4de scripts/coccinell... |
70 |
fn@p2(...) |
e105007c1 Coccinelle: Add l... |
71 |
|
29a36d4de scripts/coccinell... |
72 |
@depends on locked && patch@ |
e105007c1 Coccinelle: Add l... |
73 74 75 76 77 |
position gfp.p; @@ - GFP_KERNEL@p + GFP_ATOMIC |
29a36d4de scripts/coccinell... |
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
@depends on locked && !patch@ position gfp.p; @@ * GFP_KERNEL@p @script:python depends on !patch && org@ p << gfp.p; fn << gfp.fn; p1 << locked.p1; p2 << locked.p2; @@ cocci.print_main("lock",p1) cocci.print_secs("call",p2) cocci.print_secs("GFP_KERNEL",p) @script:python depends on !patch && report@ p << gfp.p; fn << gfp.fn; p1 << locked.p1; p2 << locked.p2; @@ msg = "ERROR: function %s called on line %s inside lock on line %s but uses GFP_KERNEL" % (fn,p2[0].line,p1[0].line) coccilib.report.print_report(p[0], msg) |