GNU Linux-libre 5.19-rc6-gnu
[releases.git] / scripts / coccinelle / api / atomic_as_refcounter.cocci
1 // SPDX-License-Identifier: GPL-2.0-only
2 // Check if refcount_t type and API should be used
3 // instead of atomic_t type when dealing with refcounters
4 //
5 // Copyright (c) 2016-2017, Elena Reshetova, Intel Corporation
6 //
7 // Confidence: Moderate
8 // URL: http://coccinelle.lip6.fr/
9 // Options: --include-headers --very-quiet
10
11 virtual report
12
13 @r1 exists@
14 identifier a, x;
15 position p1, p2;
16 identifier fname =~ ".*free.*";
17 identifier fname2 =~ ".*destroy.*";
18 identifier fname3 =~ ".*del.*";
19 identifier fname4 =~ ".*queue_work.*";
20 identifier fname5 =~ ".*schedule_work.*";
21 identifier fname6 =~ ".*call_rcu.*";
22
23 @@
24
25 (
26  atomic_dec_and_test@p1(&(a)->x)
27 |
28  atomic_dec_and_lock@p1(&(a)->x, ...)
29 |
30  atomic_long_dec_and_lock@p1(&(a)->x, ...)
31 |
32  atomic_long_dec_and_test@p1(&(a)->x)
33 |
34  atomic64_dec_and_test@p1(&(a)->x)
35 |
36  local_dec_and_test@p1(&(a)->x)
37 )
38 ...
39 (
40  fname@p2(a, ...);
41 |
42  fname2@p2(...);
43 |
44  fname3@p2(...);
45 |
46  fname4@p2(...);
47 |
48  fname5@p2(...);
49 |
50  fname6@p2(...);
51 )
52
53
54 @script:python depends on report@
55 p1 << r1.p1;
56 p2 << r1.p2;
57 @@
58 msg = "atomic_dec_and_test variation before object free at line %s."
59 coccilib.report.print_report(p1[0], msg % (p2[0].line))
60
61 @r4 exists@
62 identifier a, x, y;
63 position p1, p2;
64 identifier fname =~ ".*free.*";
65
66 @@
67
68 (
69  atomic_dec_and_test@p1(&(a)->x)
70 |
71  atomic_dec_and_lock@p1(&(a)->x, ...)
72 |
73  atomic_long_dec_and_lock@p1(&(a)->x, ...)
74 |
75  atomic_long_dec_and_test@p1(&(a)->x)
76 |
77  atomic64_dec_and_test@p1(&(a)->x)
78 |
79  local_dec_and_test@p1(&(a)->x)
80 )
81 ...
82 y=a
83 ...
84 fname@p2(y, ...);
85
86
87 @script:python depends on report@
88 p1 << r4.p1;
89 p2 << r4.p2;
90 @@
91 msg = "atomic_dec_and_test variation before object free at line %s."
92 coccilib.report.print_report(p1[0], msg % (p2[0].line))
93
94 @r2 exists@
95 identifier a, x;
96 position p1;
97 @@
98
99 (
100 atomic_add_unless(&(a)->x,-1,1)@p1
101 |
102 atomic_long_add_unless(&(a)->x,-1,1)@p1
103 |
104 atomic64_add_unless(&(a)->x,-1,1)@p1
105 )
106
107 @script:python depends on report@
108 p1 << r2.p1;
109 @@
110 msg = "atomic_add_unless"
111 coccilib.report.print_report(p1[0], msg)
112
113 @r3 exists@
114 identifier x;
115 position p1;
116 @@
117
118 (
119 x = atomic_add_return@p1(-1, ...);
120 |
121 x = atomic_long_add_return@p1(-1, ...);
122 |
123 x = atomic64_add_return@p1(-1, ...);
124 )
125
126 @script:python depends on report@
127 p1 << r3.p1;
128 @@
129 msg = "x = atomic_add_return(-1, ...)"
130 coccilib.report.print_report(p1[0], msg)