Commit | Line | Data |
---|---|---|
7f904d7e | 1 | // SPDX-License-Identifier: GPL-2.0-only |
e105007c | 2 | /// Find functions that refer to GFP_KERNEL but are called with locks held. |
29a36d4d JL |
3 | //# The proposed change of converting the GFP_KERNEL is not necessarily the |
4 | //# correct one. It may be desired to unlock the lock, or to not call the | |
5 | //# function under the lock in the first place. | |
e105007c NP |
6 | /// |
7 | // Confidence: Moderate | |
7f904d7e TG |
8 | // Copyright: (C) 2012 Nicolas Palix. |
9 | // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. | |
10 | // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. | |
f01701ce | 11 | // URL: https://coccinelle.gitlabpages.inria.fr/website |
e105007c | 12 | // Comments: |
93f14468 | 13 | // Options: --no-includes --include-headers |
e105007c NP |
14 | |
15 | virtual patch | |
29a36d4d JL |
16 | virtual context |
17 | virtual org | |
18 | virtual report | |
e105007c NP |
19 | |
20 | @gfp exists@ | |
21 | identifier fn; | |
22 | position p; | |
23 | @@ | |
24 | ||
25 | fn(...) { | |
26 | ... when != read_unlock_irq(...) | |
27 | when != write_unlock_irq(...) | |
28 | when != read_unlock_irqrestore(...) | |
29 | when != write_unlock_irqrestore(...) | |
30 | when != spin_unlock(...) | |
31 | when != spin_unlock_irq(...) | |
32 | when != spin_unlock_irqrestore(...) | |
33 | when != local_irq_enable(...) | |
34 | when any | |
35 | GFP_KERNEL@p | |
36 | ... when any | |
37 | } | |
38 | ||
29a36d4d | 39 | @locked exists@ |
e105007c | 40 | identifier gfp.fn; |
29a36d4d | 41 | position p1,p2; |
e105007c NP |
42 | @@ |
43 | ||
44 | ( | |
29a36d4d | 45 | read_lock_irq@p1 |
e105007c | 46 | | |
29a36d4d | 47 | write_lock_irq@p1 |
e105007c | 48 | | |
29a36d4d | 49 | read_lock_irqsave@p1 |
e105007c | 50 | | |
29a36d4d | 51 | write_lock_irqsave@p1 |
e105007c | 52 | | |
29a36d4d | 53 | spin_lock@p1 |
e105007c | 54 | | |
29a36d4d | 55 | spin_trylock@p1 |
e105007c | 56 | | |
29a36d4d | 57 | spin_lock_irq@p1 |
e105007c | 58 | | |
29a36d4d | 59 | spin_lock_irqsave@p1 |
e105007c | 60 | | |
29a36d4d | 61 | local_irq_disable@p1 |
e105007c NP |
62 | ) |
63 | (...) | |
64 | ... when != read_unlock_irq(...) | |
65 | when != write_unlock_irq(...) | |
66 | when != read_unlock_irqrestore(...) | |
67 | when != write_unlock_irqrestore(...) | |
68 | when != spin_unlock(...) | |
69 | when != spin_unlock_irq(...) | |
70 | when != spin_unlock_irqrestore(...) | |
71 | when != local_irq_enable(...) | |
29a36d4d | 72 | fn@p2(...) |
e105007c | 73 | |
29a36d4d | 74 | @depends on locked && patch@ |
e105007c NP |
75 | position gfp.p; |
76 | @@ | |
77 | ||
78 | - GFP_KERNEL@p | |
79 | + GFP_ATOMIC | |
29a36d4d JL |
80 | |
81 | @depends on locked && !patch@ | |
82 | position gfp.p; | |
83 | @@ | |
84 | ||
85 | * GFP_KERNEL@p | |
86 | ||
87 | @script:python depends on !patch && org@ | |
88 | p << gfp.p; | |
89 | fn << gfp.fn; | |
90 | p1 << locked.p1; | |
91 | p2 << locked.p2; | |
92 | @@ | |
93 | ||
94 | cocci.print_main("lock",p1) | |
95 | cocci.print_secs("call",p2) | |
96 | cocci.print_secs("GFP_KERNEL",p) | |
97 | ||
98 | @script:python depends on !patch && report@ | |
99 | p << gfp.p; | |
100 | fn << gfp.fn; | |
101 | p1 << locked.p1; | |
102 | p2 << locked.p2; | |
103 | @@ | |
104 | ||
105 | msg = "ERROR: function %s called on line %s inside lock on line %s but uses GFP_KERNEL" % (fn,p2[0].line,p1[0].line) | |
106 | coccilib.report.print_report(p[0], msg) |