187 node->count = 0;
188
189 kmem_cache_free(radix_tree_node_cachep, node);
190}
191
192static inline void
193radix_tree_node_free(struct radix_tree_node *node)
194{
195 call_rcu(&node->rcu_head, radix_tree_node_rcu_free);
196}
197
198
199
200
201
202
203
204int radix_tree_preload(gfp_t gfp_mask)
205{
206 struct radix_tree_preload *rtp;
207 struct radix_tree_node *node;
208 int ret = -ENOMEM;
209
210 preempt_disable();
211 rtp = &__get_cpu_var(radix_tree_preloads);
212 while (rtp->nr < ARRAY_SIZE(rtp->nodes)) {
213 preempt_enable();
214 node = kmem_cache_alloc(radix_tree_node_cachep, gfp_mask);
215 if (node == NULL)
216 goto out;
217 preempt_disable();
218 rtp = &__get_cpu_var(radix_tree_preloads);
219 if (rtp->nr < ARRAY_SIZE(rtp->nodes))
220 rtp->nodes[rtp->nr++] = node;
221 else
222 kmem_cache_free(radix_tree_node_cachep, node);
223 }
224 ret = 0;
225out:
226 return ret;
227}