Commit 377563c
revocable: fix SRCU index corruption by requiring caller-provided storage
The struct revocable handle stores the SRCU read-side index (idx) for
the duration of a resource access. If multiple threads share the same
struct revocable instance, they race on writing to the idx field,
corrupting the SRCU state and potentially causing unsafe unlocks.
Refactor the API to replace revocable_alloc()/revocable_free() with
revocable_init()/revocable_deinit(). This change requires the caller
to provide the storage for struct revocable.
By moving storage ownership to the caller, the API ensures that
concurrent users maintain their own private idx storage, eliminating
the race condition.
Reported-by: Johan Hovold <johan@kernel.org>
Closes: https://lore.kernel.org/all/20260124170535.11756-4-johan@kernel.org/
Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
Link: https://patch.msgid.link/20260129143733.45618-4-tzungbi@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>1 parent a243f7f commit 377563c
5 files changed
Lines changed: 102 additions & 113 deletions
File tree
- Documentation/driver-api/driver-model
- drivers/base
- include/linux
- tools/testing/selftests/drivers/base/revocable/test_modules
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
81 | 81 | | |
82 | 82 | | |
83 | 83 | | |
84 | | - | |
| 84 | + | |
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
88 | | - | |
| 88 | + | |
89 | 89 | | |
90 | 90 | | |
91 | | - | |
| 91 | + | |
92 | 92 | | |
93 | 93 | | |
94 | 94 | | |
| |||
104 | 104 | | |
105 | 105 | | |
106 | 106 | | |
107 | | - | |
| 107 | + | |
108 | 108 | | |
109 | 109 | | |
110 | 110 | | |
111 | | - | |
| 111 | + | |
112 | 112 | | |
113 | 113 | | |
114 | 114 | | |
| |||
129 | 129 | | |
130 | 130 | | |
131 | 131 | | |
132 | | - | |
| 132 | + | |
133 | 133 | | |
134 | 134 | | |
135 | 135 | | |
136 | | - | |
| 136 | + | |
137 | 137 | | |
138 | 138 | | |
139 | 139 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
76 | | - | |
77 | | - | |
78 | | - | |
79 | | - | |
80 | | - | |
81 | | - | |
82 | | - | |
83 | | - | |
84 | | - | |
85 | | - | |
86 | 76 | | |
87 | 77 | | |
88 | 78 | | |
| |||
145 | 135 | | |
146 | 136 | | |
147 | 137 | | |
148 | | - | |
| 138 | + | |
149 | 139 | | |
| 140 | + | |
150 | 141 | | |
151 | 142 | | |
152 | 143 | | |
153 | | - | |
| 144 | + | |
154 | 145 | | |
155 | | - | |
| 146 | + | |
156 | 147 | | |
157 | 148 | | |
158 | | - | |
159 | 149 | | |
160 | 150 | | |
161 | | - | |
| 151 | + | |
162 | 152 | | |
163 | 153 | | |
164 | 154 | | |
| |||
170 | 160 | | |
171 | 161 | | |
172 | 162 | | |
173 | | - | |
| 163 | + | |
174 | 164 | | |
175 | 165 | | |
176 | 166 | | |
177 | 167 | | |
178 | 168 | | |
179 | 169 | | |
180 | | - | |
| 170 | + | |
181 | 171 | | |
182 | 172 | | |
183 | 173 | | |
184 | | - | |
185 | | - | |
186 | | - | |
187 | | - | |
188 | | - | |
189 | | - | |
190 | 174 | | |
191 | | - | |
| 175 | + | |
192 | 176 | | |
193 | | - | |
| 177 | + | |
194 | 178 | | |
195 | 179 | | |
196 | | - | |
| 180 | + | |
197 | 181 | | |
198 | 182 | | |
199 | 183 | | |
200 | 184 | | |
201 | 185 | | |
202 | | - | |
| 186 | + | |
203 | 187 | | |
204 | 188 | | |
205 | 189 | | |
206 | 190 | | |
207 | | - | |
208 | 191 | | |
209 | | - | |
| 192 | + | |
210 | 193 | | |
211 | 194 | | |
212 | 195 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | | - | |
| 18 | + | |
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| |||
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
29 | | - | |
| 29 | + | |
30 | 30 | | |
| 31 | + | |
31 | 32 | | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
35 | | - | |
36 | | - | |
| 36 | + | |
| 37 | + | |
37 | 38 | | |
38 | | - | |
| 39 | + | |
39 | 40 | | |
40 | | - | |
| 41 | + | |
41 | 42 | | |
42 | | - | |
| 43 | + | |
43 | 44 | | |
44 | 45 | | |
45 | 46 | | |
46 | 47 | | |
47 | 48 | | |
48 | 49 | | |
49 | 50 | | |
50 | | - | |
| 51 | + | |
51 | 52 | | |
| 53 | + | |
52 | 54 | | |
53 | 55 | | |
54 | 56 | | |
55 | 57 | | |
56 | | - | |
57 | | - | |
| 58 | + | |
| 59 | + | |
58 | 60 | | |
59 | | - | |
| 61 | + | |
60 | 62 | | |
61 | | - | |
| 63 | + | |
62 | 64 | | |
63 | 65 | | |
64 | 66 | | |
65 | 67 | | |
66 | | - | |
| 68 | + | |
67 | 69 | | |
68 | | - | |
| 70 | + | |
69 | 71 | | |
70 | | - | |
| 72 | + | |
71 | 73 | | |
72 | 74 | | |
73 | 75 | | |
74 | 76 | | |
75 | 77 | | |
76 | | - | |
77 | 78 | | |
78 | 79 | | |
79 | 80 | | |
80 | 81 | | |
81 | 82 | | |
82 | | - | |
83 | | - | |
84 | | - | |
85 | 83 | | |
86 | | - | |
| 84 | + | |
87 | 85 | | |
88 | 86 | | |
89 | 87 | | |
90 | 88 | | |
91 | 89 | | |
92 | 90 | | |
93 | 91 | | |
94 | | - | |
| 92 | + | |
95 | 93 | | |
96 | 94 | | |
97 | | - | |
98 | | - | |
99 | 95 | | |
100 | 96 | | |
101 | 97 | | |
102 | 98 | | |
103 | 99 | | |
104 | | - | |
105 | 100 | | |
106 | 101 | | |
107 | 102 | | |
108 | 103 | | |
109 | 104 | | |
110 | 105 | | |
111 | | - | |
112 | | - | |
113 | | - | |
114 | 106 | | |
115 | | - | |
| 107 | + | |
116 | 108 | | |
117 | 109 | | |
118 | 110 | | |
| |||
122 | 114 | | |
123 | 115 | | |
124 | 116 | | |
125 | | - | |
| 117 | + | |
126 | 118 | | |
127 | 119 | | |
128 | 120 | | |
129 | 121 | | |
130 | | - | |
131 | | - | |
132 | 122 | | |
133 | 123 | | |
134 | 124 | | |
135 | 125 | | |
136 | 126 | | |
137 | 127 | | |
| 128 | + | |
138 | 129 | | |
139 | | - | |
| 130 | + | |
140 | 131 | | |
141 | 132 | | |
142 | 133 | | |
143 | 134 | | |
144 | | - | |
145 | | - | |
| 135 | + | |
| 136 | + | |
146 | 137 | | |
147 | 138 | | |
148 | 139 | | |
149 | | - | |
150 | | - | |
| 140 | + | |
| 141 | + | |
151 | 142 | | |
152 | 143 | | |
153 | 144 | | |
| |||
159 | 150 | | |
160 | 151 | | |
161 | 152 | | |
162 | | - | |
163 | | - | |
| 153 | + | |
| 154 | + | |
164 | 155 | | |
165 | 156 | | |
166 | 157 | | |
167 | 158 | | |
| 159 | + | |
| 160 | + | |
168 | 161 | | |
169 | 162 | | |
170 | 163 | | |
| |||
0 commit comments