hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/of/base.c
....@@ -130,31 +130,34 @@
130130 /*
131131 * Caller must hold devtree_lock.
132132 */
133
-static void __of_free_phandle_cache(void)
133
+static struct device_node** __of_free_phandle_cache(void)
134134 {
135135 u32 cache_entries = phandle_cache_mask + 1;
136136 u32 k;
137
+ struct device_node **shadow;
137138
138139 if (!phandle_cache)
139
- return;
140
+ return NULL;
140141
141142 for (k = 0; k < cache_entries; k++)
142143 of_node_put(phandle_cache[k]);
143144
144
- kfree(phandle_cache);
145
+ shadow = phandle_cache;
145146 phandle_cache = NULL;
147
+ return shadow;
146148 }
147149
148150 int of_free_phandle_cache(void)
149151 {
150152 unsigned long flags;
153
+ struct device_node **shadow;
151154
152155 raw_spin_lock_irqsave(&devtree_lock, flags);
153156
154
- __of_free_phandle_cache();
157
+ shadow = __of_free_phandle_cache();
155158
156159 raw_spin_unlock_irqrestore(&devtree_lock, flags);
157
-
160
+ kfree(shadow);
158161 return 0;
159162 }
160163 #if !defined(CONFIG_MODULES)
....@@ -189,10 +192,11 @@
189192 u32 cache_entries;
190193 struct device_node *np;
191194 u32 phandles = 0;
195
+ struct device_node **shadow;
192196
193197 raw_spin_lock_irqsave(&devtree_lock, flags);
194198
195
- __of_free_phandle_cache();
199
+ shadow = __of_free_phandle_cache();
196200
197201 for_each_of_allnodes(np)
198202 if (np->phandle && np->phandle != OF_PHANDLE_ILLEGAL)
....@@ -200,12 +204,14 @@
200204
201205 if (!phandles)
202206 goto out;
207
+ raw_spin_unlock_irqrestore(&devtree_lock, flags);
203208
204209 cache_entries = roundup_pow_of_two(phandles);
205210 phandle_cache_mask = cache_entries - 1;
206211
207212 phandle_cache = kcalloc(cache_entries, sizeof(*phandle_cache),
208213 GFP_ATOMIC);
214
+ raw_spin_lock_irqsave(&devtree_lock, flags);
209215 if (!phandle_cache)
210216 goto out;
211217
....@@ -217,6 +223,7 @@
217223
218224 out:
219225 raw_spin_unlock_irqrestore(&devtree_lock, flags);
226
+ kfree(shadow);
220227 }
221228
222229 void __init of_core_init(void)