OSDN Git Service

ARM: dts: at91: sama5d3: define clock rate range for tcb1
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / lib / assoc_array.c
1 /* Generic associative array implementation.
2  *
3  * See Documentation/assoc_array.txt for information.
4  *
5  * Copyright (C) 2013 Red Hat, Inc. All Rights Reserved.
6  * Written by David Howells (dhowells@redhat.com)
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public Licence
10  * as published by the Free Software Foundation; either version
11  * 2 of the Licence, or (at your option) any later version.
12  */
13 //#define DEBUG
14 #include <linux/rcupdate.h>
15 #include <linux/slab.h>
16 #include <linux/err.h>
17 #include <linux/assoc_array_priv.h>
18
19 /*
20  * Iterate over an associative array.  The caller must hold the RCU read lock
21  * or better.
22  */
23 static int assoc_array_subtree_iterate(const struct assoc_array_ptr *root,
24                                        const struct assoc_array_ptr *stop,
25                                        int (*iterator)(const void *leaf,
26                                                        void *iterator_data),
27                                        void *iterator_data)
28 {
29         const struct assoc_array_shortcut *shortcut;
30         const struct assoc_array_node *node;
31         const struct assoc_array_ptr *cursor, *ptr, *parent;
32         unsigned long has_meta;
33         int slot, ret;
34
35         cursor = root;
36
37 begin_node:
38         if (assoc_array_ptr_is_shortcut(cursor)) {
39                 /* Descend through a shortcut */
40                 shortcut = assoc_array_ptr_to_shortcut(cursor);
41                 smp_read_barrier_depends();
42                 cursor = ACCESS_ONCE(shortcut->next_node);
43         }
44
45         node = assoc_array_ptr_to_node(cursor);
46         smp_read_barrier_depends();
47         slot = 0;
48
49         /* We perform two passes of each node.
50          *
51          * The first pass does all the leaves in this node.  This means we
52          * don't miss any leaves if the node is split up by insertion whilst
53          * we're iterating over the branches rooted here (we may, however, see
54          * some leaves twice).
55          */
56         has_meta = 0;
57         for (; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
58                 ptr = ACCESS_ONCE(node->slots[slot]);
59                 has_meta |= (unsigned long)ptr;
60                 if (ptr && assoc_array_ptr_is_leaf(ptr)) {
61                         /* We need a barrier between the read of the pointer
62                          * and dereferencing the pointer - but only if we are
63                          * actually going to dereference it.
64                          */
65                         smp_read_barrier_depends();
66
67                         /* Invoke the callback */
68                         ret = iterator(assoc_array_ptr_to_leaf(ptr),
69                                        iterator_data);
70                         if (ret)
71                                 return ret;
72                 }
73         }
74
75         /* The second pass attends to all the metadata pointers.  If we follow
76          * one of these we may find that we don't come back here, but rather go
77          * back to a replacement node with the leaves in a different layout.
78          *
79          * We are guaranteed to make progress, however, as the slot number for
80          * a particular portion of the key space cannot change - and we
81          * continue at the back pointer + 1.
82          */
83         if (!(has_meta & ASSOC_ARRAY_PTR_META_TYPE))
84                 goto finished_node;
85         slot = 0;
86
87 continue_node:
88         node = assoc_array_ptr_to_node(cursor);
89         smp_read_barrier_depends();
90
91         for (; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
92                 ptr = ACCESS_ONCE(node->slots[slot]);
93                 if (assoc_array_ptr_is_meta(ptr)) {
94                         cursor = ptr;
95                         goto begin_node;
96                 }
97         }
98
99 finished_node:
100         /* Move up to the parent (may need to skip back over a shortcut) */
101         parent = ACCESS_ONCE(node->back_pointer);
102         slot = node->parent_slot;
103         if (parent == stop)
104                 return 0;
105
106         if (assoc_array_ptr_is_shortcut(parent)) {
107                 shortcut = assoc_array_ptr_to_shortcut(parent);
108                 smp_read_barrier_depends();
109                 cursor = parent;
110                 parent = ACCESS_ONCE(shortcut->back_pointer);
111                 slot = shortcut->parent_slot;
112                 if (parent == stop)
113                         return 0;
114         }
115
116         /* Ascend to next slot in parent node */
117         cursor = parent;
118         slot++;
119         goto continue_node;
120 }
121
122 /**
123  * assoc_array_iterate - Pass all objects in the array to a callback
124  * @array: The array to iterate over.
125  * @iterator: The callback function.
126  * @iterator_data: Private data for the callback function.
127  *
128  * Iterate over all the objects in an associative array.  Each one will be
129  * presented to the iterator function.
130  *
131  * If the array is being modified concurrently with the iteration then it is
132  * possible that some objects in the array will be passed to the iterator
133  * callback more than once - though every object should be passed at least
134  * once.  If this is undesirable then the caller must lock against modification
135  * for the duration of this function.
136  *
137  * The function will return 0 if no objects were in the array or else it will
138  * return the result of the last iterator function called.  Iteration stops
139  * immediately if any call to the iteration function results in a non-zero
140  * return.
141  *
142  * The caller should hold the RCU read lock or better if concurrent
143  * modification is possible.
144  */
145 int assoc_array_iterate(const struct assoc_array *array,
146                         int (*iterator)(const void *object,
147                                         void *iterator_data),
148                         void *iterator_data)
149 {
150         struct assoc_array_ptr *root = ACCESS_ONCE(array->root);
151
152         if (!root)
153                 return 0;
154         return assoc_array_subtree_iterate(root, NULL, iterator, iterator_data);
155 }
156
157 enum assoc_array_walk_status {
158         assoc_array_walk_tree_empty,
159         assoc_array_walk_found_terminal_node,
160         assoc_array_walk_found_wrong_shortcut,
161 };
162
163 struct assoc_array_walk_result {
164         struct {
165                 struct assoc_array_node *node;  /* Node in which leaf might be found */
166                 int             level;
167                 int             slot;
168         } terminal_node;
169         struct {
170                 struct assoc_array_shortcut *shortcut;
171                 int             level;
172                 int             sc_level;
173                 unsigned long   sc_segments;
174                 unsigned long   dissimilarity;
175         } wrong_shortcut;
176 };
177
178 /*
179  * Navigate through the internal tree looking for the closest node to the key.
180  */
181 static enum assoc_array_walk_status
182 assoc_array_walk(const struct assoc_array *array,
183                  const struct assoc_array_ops *ops,
184                  const void *index_key,
185                  struct assoc_array_walk_result *result)
186 {
187         struct assoc_array_shortcut *shortcut;
188         struct assoc_array_node *node;
189         struct assoc_array_ptr *cursor, *ptr;
190         unsigned long sc_segments, dissimilarity;
191         unsigned long segments;
192         int level, sc_level, next_sc_level;
193         int slot;
194
195         pr_devel("-->%s()\n", __func__);
196
197         cursor = ACCESS_ONCE(array->root);
198         if (!cursor)
199                 return assoc_array_walk_tree_empty;
200
201         level = 0;
202
203         /* Use segments from the key for the new leaf to navigate through the
204          * internal tree, skipping through nodes and shortcuts that are on
205          * route to the destination.  Eventually we'll come to a slot that is
206          * either empty or contains a leaf at which point we've found a node in
207          * which the leaf we're looking for might be found or into which it
208          * should be inserted.
209          */
210 jumped:
211         segments = ops->get_key_chunk(index_key, level);
212         pr_devel("segments[%d]: %lx\n", level, segments);
213
214         if (assoc_array_ptr_is_shortcut(cursor))
215                 goto follow_shortcut;
216
217 consider_node:
218         node = assoc_array_ptr_to_node(cursor);
219         smp_read_barrier_depends();
220
221         slot = segments >> (level & ASSOC_ARRAY_KEY_CHUNK_MASK);
222         slot &= ASSOC_ARRAY_FAN_MASK;
223         ptr = ACCESS_ONCE(node->slots[slot]);
224
225         pr_devel("consider slot %x [ix=%d type=%lu]\n",
226                  slot, level, (unsigned long)ptr & 3);
227
228         if (!assoc_array_ptr_is_meta(ptr)) {
229                 /* The node doesn't have a node/shortcut pointer in the slot
230                  * corresponding to the index key that we have to follow.
231                  */
232                 result->terminal_node.node = node;
233                 result->terminal_node.level = level;
234                 result->terminal_node.slot = slot;
235                 pr_devel("<--%s() = terminal_node\n", __func__);
236                 return assoc_array_walk_found_terminal_node;
237         }
238
239         if (assoc_array_ptr_is_node(ptr)) {
240                 /* There is a pointer to a node in the slot corresponding to
241                  * this index key segment, so we need to follow it.
242                  */
243                 cursor = ptr;
244                 level += ASSOC_ARRAY_LEVEL_STEP;
245                 if ((level & ASSOC_ARRAY_KEY_CHUNK_MASK) != 0)
246                         goto consider_node;
247                 goto jumped;
248         }
249
250         /* There is a shortcut in the slot corresponding to the index key
251          * segment.  We follow the shortcut if its partial index key matches
252          * this leaf's.  Otherwise we need to split the shortcut.
253          */
254         cursor = ptr;
255 follow_shortcut:
256         shortcut = assoc_array_ptr_to_shortcut(cursor);
257         smp_read_barrier_depends();
258         pr_devel("shortcut to %d\n", shortcut->skip_to_level);
259         sc_level = level + ASSOC_ARRAY_LEVEL_STEP;
260         BUG_ON(sc_level > shortcut->skip_to_level);
261
262         do {
263                 /* Check the leaf against the shortcut's index key a word at a
264                  * time, trimming the final word (the shortcut stores the index
265                  * key completely from the root to the shortcut's target).
266                  */
267                 if ((sc_level & ASSOC_ARRAY_KEY_CHUNK_MASK) == 0)
268                         segments = ops->get_key_chunk(index_key, sc_level);
269
270                 sc_segments = shortcut->index_key[sc_level >> ASSOC_ARRAY_KEY_CHUNK_SHIFT];
271                 dissimilarity = segments ^ sc_segments;
272
273                 if (round_up(sc_level, ASSOC_ARRAY_KEY_CHUNK_SIZE) > shortcut->skip_to_level) {
274                         /* Trim segments that are beyond the shortcut */
275                         int shift = shortcut->skip_to_level & ASSOC_ARRAY_KEY_CHUNK_MASK;
276                         dissimilarity &= ~(ULONG_MAX << shift);
277                         next_sc_level = shortcut->skip_to_level;
278                 } else {
279                         next_sc_level = sc_level + ASSOC_ARRAY_KEY_CHUNK_SIZE;
280                         next_sc_level = round_down(next_sc_level, ASSOC_ARRAY_KEY_CHUNK_SIZE);
281                 }
282
283                 if (dissimilarity != 0) {
284                         /* This shortcut points elsewhere */
285                         result->wrong_shortcut.shortcut = shortcut;
286                         result->wrong_shortcut.level = level;
287                         result->wrong_shortcut.sc_level = sc_level;
288                         result->wrong_shortcut.sc_segments = sc_segments;
289                         result->wrong_shortcut.dissimilarity = dissimilarity;
290                         return assoc_array_walk_found_wrong_shortcut;
291                 }
292
293                 sc_level = next_sc_level;
294         } while (sc_level < shortcut->skip_to_level);
295
296         /* The shortcut matches the leaf's index to this point. */
297         cursor = ACCESS_ONCE(shortcut->next_node);
298         if (((level ^ sc_level) & ~ASSOC_ARRAY_KEY_CHUNK_MASK) != 0) {
299                 level = sc_level;
300                 goto jumped;
301         } else {
302                 level = sc_level;
303                 goto consider_node;
304         }
305 }
306
307 /**
308  * assoc_array_find - Find an object by index key
309  * @array: The associative array to search.
310  * @ops: The operations to use.
311  * @index_key: The key to the object.
312  *
313  * Find an object in an associative array by walking through the internal tree
314  * to the node that should contain the object and then searching the leaves
315  * there.  NULL is returned if the requested object was not found in the array.
316  *
317  * The caller must hold the RCU read lock or better.
318  */
319 void *assoc_array_find(const struct assoc_array *array,
320                        const struct assoc_array_ops *ops,
321                        const void *index_key)
322 {
323         struct assoc_array_walk_result result;
324         const struct assoc_array_node *node;
325         const struct assoc_array_ptr *ptr;
326         const void *leaf;
327         int slot;
328
329         if (assoc_array_walk(array, ops, index_key, &result) !=
330             assoc_array_walk_found_terminal_node)
331                 return NULL;
332
333         node = result.terminal_node.node;
334         smp_read_barrier_depends();
335
336         /* If the target key is available to us, it's has to be pointed to by
337          * the terminal node.
338          */
339         for (slot = 0; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
340                 ptr = ACCESS_ONCE(node->slots[slot]);
341                 if (ptr && assoc_array_ptr_is_leaf(ptr)) {
342                         /* We need a barrier between the read of the pointer
343                          * and dereferencing the pointer - but only if we are
344                          * actually going to dereference it.
345                          */
346                         leaf = assoc_array_ptr_to_leaf(ptr);
347                         smp_read_barrier_depends();
348                         if (ops->compare_object(leaf, index_key))
349                                 return (void *)leaf;
350                 }
351         }
352
353         return NULL;
354 }
355
356 /*
357  * Destructively iterate over an associative array.  The caller must prevent
358  * other simultaneous accesses.
359  */
360 static void assoc_array_destroy_subtree(struct assoc_array_ptr *root,
361                                         const struct assoc_array_ops *ops)
362 {
363         struct assoc_array_shortcut *shortcut;
364         struct assoc_array_node *node;
365         struct assoc_array_ptr *cursor, *parent = NULL;
366         int slot = -1;
367
368         pr_devel("-->%s()\n", __func__);
369
370         cursor = root;
371         if (!cursor) {
372                 pr_devel("empty\n");
373                 return;
374         }
375
376 move_to_meta:
377         if (assoc_array_ptr_is_shortcut(cursor)) {
378                 /* Descend through a shortcut */
379                 pr_devel("[%d] shortcut\n", slot);
380                 BUG_ON(!assoc_array_ptr_is_shortcut(cursor));
381                 shortcut = assoc_array_ptr_to_shortcut(cursor);
382                 BUG_ON(shortcut->back_pointer != parent);
383                 BUG_ON(slot != -1 && shortcut->parent_slot != slot);
384                 parent = cursor;
385                 cursor = shortcut->next_node;
386                 slot = -1;
387                 BUG_ON(!assoc_array_ptr_is_node(cursor));
388         }
389
390         pr_devel("[%d] node\n", slot);
391         node = assoc_array_ptr_to_node(cursor);
392         BUG_ON(node->back_pointer != parent);
393         BUG_ON(slot != -1 && node->parent_slot != slot);
394         slot = 0;
395
396 continue_node:
397         pr_devel("Node %p [back=%p]\n", node, node->back_pointer);
398         for (; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
399                 struct assoc_array_ptr *ptr = node->slots[slot];
400                 if (!ptr)
401                         continue;
402                 if (assoc_array_ptr_is_meta(ptr)) {
403                         parent = cursor;
404                         cursor = ptr;
405                         goto move_to_meta;
406                 }
407
408                 if (ops) {
409                         pr_devel("[%d] free leaf\n", slot);
410                         ops->free_object(assoc_array_ptr_to_leaf(ptr));
411                 }
412         }
413
414         parent = node->back_pointer;
415         slot = node->parent_slot;
416         pr_devel("free node\n");
417         kfree(node);
418         if (!parent)
419                 return; /* Done */
420
421         /* Move back up to the parent (may need to free a shortcut on
422          * the way up) */
423         if (assoc_array_ptr_is_shortcut(parent)) {
424                 shortcut = assoc_array_ptr_to_shortcut(parent);
425                 BUG_ON(shortcut->next_node != cursor);
426                 cursor = parent;
427                 parent = shortcut->back_pointer;
428                 slot = shortcut->parent_slot;
429                 pr_devel("free shortcut\n");
430                 kfree(shortcut);
431                 if (!parent)
432                         return;
433
434                 BUG_ON(!assoc_array_ptr_is_node(parent));
435         }
436
437         /* Ascend to next slot in parent node */
438         pr_devel("ascend to %p[%d]\n", parent, slot);
439         cursor = parent;
440         node = assoc_array_ptr_to_node(cursor);
441         slot++;
442         goto continue_node;
443 }
444
445 /**
446  * assoc_array_destroy - Destroy an associative array
447  * @array: The array to destroy.
448  * @ops: The operations to use.
449  *
450  * Discard all metadata and free all objects in an associative array.  The
451  * array will be empty and ready to use again upon completion.  This function
452  * cannot fail.
453  *
454  * The caller must prevent all other accesses whilst this takes place as no
455  * attempt is made to adjust pointers gracefully to permit RCU readlock-holding
456  * accesses to continue.  On the other hand, no memory allocation is required.
457  */
458 void assoc_array_destroy(struct assoc_array *array,
459                          const struct assoc_array_ops *ops)
460 {
461         assoc_array_destroy_subtree(array->root, ops);
462         array->root = NULL;
463 }
464
465 /*
466  * Handle insertion into an empty tree.
467  */
468 static bool assoc_array_insert_in_empty_tree(struct assoc_array_edit *edit)
469 {
470         struct assoc_array_node *new_n0;
471
472         pr_devel("-->%s()\n", __func__);
473
474         new_n0 = kzalloc(sizeof(struct assoc_array_node), GFP_KERNEL);
475         if (!new_n0)
476                 return false;
477
478         edit->new_meta[0] = assoc_array_node_to_ptr(new_n0);
479         edit->leaf_p = &new_n0->slots[0];
480         edit->adjust_count_on = new_n0;
481         edit->set[0].ptr = &edit->array->root;
482         edit->set[0].to = assoc_array_node_to_ptr(new_n0);
483
484         pr_devel("<--%s() = ok [no root]\n", __func__);
485         return true;
486 }
487
488 /*
489  * Handle insertion into a terminal node.
490  */
491 static bool assoc_array_insert_into_terminal_node(struct assoc_array_edit *edit,
492                                                   const struct assoc_array_ops *ops,
493                                                   const void *index_key,
494                                                   struct assoc_array_walk_result *result)
495 {
496         struct assoc_array_shortcut *shortcut, *new_s0;
497         struct assoc_array_node *node, *new_n0, *new_n1, *side;
498         struct assoc_array_ptr *ptr;
499         unsigned long dissimilarity, base_seg, blank;
500         size_t keylen;
501         bool have_meta;
502         int level, diff;
503         int slot, next_slot, free_slot, i, j;
504
505         node    = result->terminal_node.node;
506         level   = result->terminal_node.level;
507         edit->segment_cache[ASSOC_ARRAY_FAN_OUT] = result->terminal_node.slot;
508
509         pr_devel("-->%s()\n", __func__);
510
511         /* We arrived at a node which doesn't have an onward node or shortcut
512          * pointer that we have to follow.  This means that (a) the leaf we
513          * want must go here (either by insertion or replacement) or (b) we
514          * need to split this node and insert in one of the fragments.
515          */
516         free_slot = -1;
517
518         /* Firstly, we have to check the leaves in this node to see if there's
519          * a matching one we should replace in place.
520          */
521         for (i = 0; i < ASSOC_ARRAY_FAN_OUT; i++) {
522                 ptr = node->slots[i];
523                 if (!ptr) {
524                         free_slot = i;
525                         continue;
526                 }
527                 if (assoc_array_ptr_is_leaf(ptr) &&
528                     ops->compare_object(assoc_array_ptr_to_leaf(ptr),
529                                         index_key)) {
530                         pr_devel("replace in slot %d\n", i);
531                         edit->leaf_p = &node->slots[i];
532                         edit->dead_leaf = node->slots[i];
533                         pr_devel("<--%s() = ok [replace]\n", __func__);
534                         return true;
535                 }
536         }
537
538         /* If there is a free slot in this node then we can just insert the
539          * leaf here.
540          */
541         if (free_slot >= 0) {
542                 pr_devel("insert in free slot %d\n", free_slot);
543                 edit->leaf_p = &node->slots[free_slot];
544                 edit->adjust_count_on = node;
545                 pr_devel("<--%s() = ok [insert]\n", __func__);
546                 return true;
547         }
548
549         /* The node has no spare slots - so we're either going to have to split
550          * it or insert another node before it.
551          *
552          * Whatever, we're going to need at least two new nodes - so allocate
553          * those now.  We may also need a new shortcut, but we deal with that
554          * when we need it.
555          */
556         new_n0 = kzalloc(sizeof(struct assoc_array_node), GFP_KERNEL);
557         if (!new_n0)
558                 return false;
559         edit->new_meta[0] = assoc_array_node_to_ptr(new_n0);
560         new_n1 = kzalloc(sizeof(struct assoc_array_node), GFP_KERNEL);
561         if (!new_n1)
562                 return false;
563         edit->new_meta[1] = assoc_array_node_to_ptr(new_n1);
564
565         /* We need to find out how similar the leaves are. */
566         pr_devel("no spare slots\n");
567         have_meta = false;
568         for (i = 0; i < ASSOC_ARRAY_FAN_OUT; i++) {
569                 ptr = node->slots[i];
570                 if (assoc_array_ptr_is_meta(ptr)) {
571                         edit->segment_cache[i] = 0xff;
572                         have_meta = true;
573                         continue;
574                 }
575                 base_seg = ops->get_object_key_chunk(
576                         assoc_array_ptr_to_leaf(ptr), level);
577                 base_seg >>= level & ASSOC_ARRAY_KEY_CHUNK_MASK;
578                 edit->segment_cache[i] = base_seg & ASSOC_ARRAY_FAN_MASK;
579         }
580
581         if (have_meta) {
582                 pr_devel("have meta\n");
583                 goto split_node;
584         }
585
586         /* The node contains only leaves */
587         dissimilarity = 0;
588         base_seg = edit->segment_cache[0];
589         for (i = 1; i < ASSOC_ARRAY_FAN_OUT; i++)
590                 dissimilarity |= edit->segment_cache[i] ^ base_seg;
591
592         pr_devel("only leaves; dissimilarity=%lx\n", dissimilarity);
593
594         if ((dissimilarity & ASSOC_ARRAY_FAN_MASK) == 0) {
595                 /* The old leaves all cluster in the same slot.  We will need
596                  * to insert a shortcut if the new node wants to cluster with them.
597                  */
598                 if ((edit->segment_cache[ASSOC_ARRAY_FAN_OUT] ^ base_seg) == 0)
599                         goto all_leaves_cluster_together;
600
601                 /* Otherwise all the old leaves cluster in the same slot, but
602                  * the new leaf wants to go into a different slot - so we
603                  * create a new node (n0) to hold the new leaf and a pointer to
604                  * a new node (n1) holding all the old leaves.
605                  *
606                  * This can be done by falling through to the node splitting
607                  * path.
608                  */
609                 pr_devel("present leaves cluster but not new leaf\n");
610         }
611
612 split_node:
613         pr_devel("split node\n");
614
615         /* We need to split the current node.  The node must contain anything
616          * from a single leaf (in the one leaf case, this leaf will cluster
617          * with the new leaf) and the rest meta-pointers, to all leaves, some
618          * of which may cluster.
619          *
620          * It won't contain the case in which all the current leaves plus the
621          * new leaves want to cluster in the same slot.
622          *
623          * We need to expel at least two leaves out of a set consisting of the
624          * leaves in the node and the new leaf.  The current meta pointers can
625          * just be copied as they shouldn't cluster with any of the leaves.
626          *
627          * We need a new node (n0) to replace the current one and a new node to
628          * take the expelled nodes (n1).
629          */
630         edit->set[0].to = assoc_array_node_to_ptr(new_n0);
631         new_n0->back_pointer = node->back_pointer;
632         new_n0->parent_slot = node->parent_slot;
633         new_n1->back_pointer = assoc_array_node_to_ptr(new_n0);
634         new_n1->parent_slot = -1; /* Need to calculate this */
635
636 do_split_node:
637         pr_devel("do_split_node\n");
638
639         new_n0->nr_leaves_on_branch = node->nr_leaves_on_branch;
640         new_n1->nr_leaves_on_branch = 0;
641
642         /* Begin by finding two matching leaves.  There have to be at least two
643          * that match - even if there are meta pointers - because any leaf that
644          * would match a slot with a meta pointer in it must be somewhere
645          * behind that meta pointer and cannot be here.  Further, given N
646          * remaining leaf slots, we now have N+1 leaves to go in them.
647          */
648         for (i = 0; i < ASSOC_ARRAY_FAN_OUT; i++) {
649                 slot = edit->segment_cache[i];
650                 if (slot != 0xff)
651                         for (j = i + 1; j < ASSOC_ARRAY_FAN_OUT + 1; j++)
652                                 if (edit->segment_cache[j] == slot)
653                                         goto found_slot_for_multiple_occupancy;
654         }
655 found_slot_for_multiple_occupancy:
656         pr_devel("same slot: %x %x [%02x]\n", i, j, slot);
657         BUG_ON(i >= ASSOC_ARRAY_FAN_OUT);
658         BUG_ON(j >= ASSOC_ARRAY_FAN_OUT + 1);
659         BUG_ON(slot >= ASSOC_ARRAY_FAN_OUT);
660
661         new_n1->parent_slot = slot;
662
663         /* Metadata pointers cannot change slot */
664         for (i = 0; i < ASSOC_ARRAY_FAN_OUT; i++)
665                 if (assoc_array_ptr_is_meta(node->slots[i]))
666                         new_n0->slots[i] = node->slots[i];
667                 else
668                         new_n0->slots[i] = NULL;
669         BUG_ON(new_n0->slots[slot] != NULL);
670         new_n0->slots[slot] = assoc_array_node_to_ptr(new_n1);
671
672         /* Filter the leaf pointers between the new nodes */
673         free_slot = -1;
674         next_slot = 0;
675         for (i = 0; i < ASSOC_ARRAY_FAN_OUT; i++) {
676                 if (assoc_array_ptr_is_meta(node->slots[i]))
677                         continue;
678                 if (edit->segment_cache[i] == slot) {
679                         new_n1->slots[next_slot++] = node->slots[i];
680                         new_n1->nr_leaves_on_branch++;
681                 } else {
682                         do {
683                                 free_slot++;
684                         } while (new_n0->slots[free_slot] != NULL);
685                         new_n0->slots[free_slot] = node->slots[i];
686                 }
687         }
688
689         pr_devel("filtered: f=%x n=%x\n", free_slot, next_slot);
690
691         if (edit->segment_cache[ASSOC_ARRAY_FAN_OUT] != slot) {
692                 do {
693                         free_slot++;
694                 } while (new_n0->slots[free_slot] != NULL);
695                 edit->leaf_p = &new_n0->slots[free_slot];
696                 edit->adjust_count_on = new_n0;
697         } else {
698                 edit->leaf_p = &new_n1->slots[next_slot++];
699                 edit->adjust_count_on = new_n1;
700         }
701
702         BUG_ON(next_slot <= 1);
703
704         edit->set_backpointers_to = assoc_array_node_to_ptr(new_n0);
705         for (i = 0; i < ASSOC_ARRAY_FAN_OUT; i++) {
706                 if (edit->segment_cache[i] == 0xff) {
707                         ptr = node->slots[i];
708                         BUG_ON(assoc_array_ptr_is_leaf(ptr));
709                         if (assoc_array_ptr_is_node(ptr)) {
710                                 side = assoc_array_ptr_to_node(ptr);
711                                 edit->set_backpointers[i] = &side->back_pointer;
712                         } else {
713                                 shortcut = assoc_array_ptr_to_shortcut(ptr);
714                                 edit->set_backpointers[i] = &shortcut->back_pointer;
715                         }
716                 }
717         }
718
719         ptr = node->back_pointer;
720         if (!ptr)
721                 edit->set[0].ptr = &edit->array->root;
722         else if (assoc_array_ptr_is_node(ptr))
723                 edit->set[0].ptr = &assoc_array_ptr_to_node(ptr)->slots[node->parent_slot];
724         else
725                 edit->set[0].ptr = &assoc_array_ptr_to_shortcut(ptr)->next_node;
726         edit->excised_meta[0] = assoc_array_node_to_ptr(node);
727         pr_devel("<--%s() = ok [split node]\n", __func__);
728         return true;
729
730 all_leaves_cluster_together:
731         /* All the leaves, new and old, want to cluster together in this node
732          * in the same slot, so we have to replace this node with a shortcut to
733          * skip over the identical parts of the key and then place a pair of
734          * nodes, one inside the other, at the end of the shortcut and
735          * distribute the keys between them.
736          *
737          * Firstly we need to work out where the leaves start diverging as a
738          * bit position into their keys so that we know how big the shortcut
739          * needs to be.
740          *
741          * We only need to make a single pass of N of the N+1 leaves because if
742          * any keys differ between themselves at bit X then at least one of
743          * them must also differ with the base key at bit X or before.
744          */
745         pr_devel("all leaves cluster together\n");
746         diff = INT_MAX;
747         for (i = 0; i < ASSOC_ARRAY_FAN_OUT; i++) {
748                 int x = ops->diff_objects(assoc_array_ptr_to_leaf(node->slots[i]),
749                                           index_key);
750                 if (x < diff) {
751                         BUG_ON(x < 0);
752                         diff = x;
753                 }
754         }
755         BUG_ON(diff == INT_MAX);
756         BUG_ON(diff < level + ASSOC_ARRAY_LEVEL_STEP);
757
758         keylen = round_up(diff, ASSOC_ARRAY_KEY_CHUNK_SIZE);
759         keylen >>= ASSOC_ARRAY_KEY_CHUNK_SHIFT;
760
761         new_s0 = kzalloc(sizeof(struct assoc_array_shortcut) +
762                          keylen * sizeof(unsigned long), GFP_KERNEL);
763         if (!new_s0)
764                 return false;
765         edit->new_meta[2] = assoc_array_shortcut_to_ptr(new_s0);
766
767         edit->set[0].to = assoc_array_shortcut_to_ptr(new_s0);
768         new_s0->back_pointer = node->back_pointer;
769         new_s0->parent_slot = node->parent_slot;
770         new_s0->next_node = assoc_array_node_to_ptr(new_n0);
771         new_n0->back_pointer = assoc_array_shortcut_to_ptr(new_s0);
772         new_n0->parent_slot = 0;
773         new_n1->back_pointer = assoc_array_node_to_ptr(new_n0);
774         new_n1->parent_slot = -1; /* Need to calculate this */
775
776         new_s0->skip_to_level = level = diff & ~ASSOC_ARRAY_LEVEL_STEP_MASK;
777         pr_devel("skip_to_level = %d [diff %d]\n", level, diff);
778         BUG_ON(level <= 0);
779
780         for (i = 0; i < keylen; i++)
781                 new_s0->index_key[i] =
782                         ops->get_key_chunk(index_key, i * ASSOC_ARRAY_KEY_CHUNK_SIZE);
783
784         if (level & ASSOC_ARRAY_KEY_CHUNK_MASK) {
785                 blank = ULONG_MAX << (level & ASSOC_ARRAY_KEY_CHUNK_MASK);
786                 pr_devel("blank off [%zu] %d: %lx\n", keylen - 1, level, blank);
787                 new_s0->index_key[keylen - 1] &= ~blank;
788         }
789
790         /* This now reduces to a node splitting exercise for which we'll need
791          * to regenerate the disparity table.
792          */
793         for (i = 0; i < ASSOC_ARRAY_FAN_OUT; i++) {
794                 ptr = node->slots[i];
795                 base_seg = ops->get_object_key_chunk(assoc_array_ptr_to_leaf(ptr),
796                                                      level);
797                 base_seg >>= level & ASSOC_ARRAY_KEY_CHUNK_MASK;
798                 edit->segment_cache[i] = base_seg & ASSOC_ARRAY_FAN_MASK;
799         }
800
801         base_seg = ops->get_key_chunk(index_key, level);
802         base_seg >>= level & ASSOC_ARRAY_KEY_CHUNK_MASK;
803         edit->segment_cache[ASSOC_ARRAY_FAN_OUT] = base_seg & ASSOC_ARRAY_FAN_MASK;
804         goto do_split_node;
805 }
806
807 /*
808  * Handle insertion into the middle of a shortcut.
809  */
810 static bool assoc_array_insert_mid_shortcut(struct assoc_array_edit *edit,
811                                             const struct assoc_array_ops *ops,
812                                             struct assoc_array_walk_result *result)
813 {
814         struct assoc_array_shortcut *shortcut, *new_s0, *new_s1;
815         struct assoc_array_node *node, *new_n0, *side;
816         unsigned long sc_segments, dissimilarity, blank;
817         size_t keylen;
818         int level, sc_level, diff;
819         int sc_slot;
820
821         shortcut        = result->wrong_shortcut.shortcut;
822         level           = result->wrong_shortcut.level;
823         sc_level        = result->wrong_shortcut.sc_level;
824         sc_segments     = result->wrong_shortcut.sc_segments;
825         dissimilarity   = result->wrong_shortcut.dissimilarity;
826
827         pr_devel("-->%s(ix=%d dis=%lx scix=%d)\n",
828                  __func__, level, dissimilarity, sc_level);
829
830         /* We need to split a shortcut and insert a node between the two
831          * pieces.  Zero-length pieces will be dispensed with entirely.
832          *
833          * First of all, we need to find out in which level the first
834          * difference was.
835          */
836         diff = __ffs(dissimilarity);
837         diff &= ~ASSOC_ARRAY_LEVEL_STEP_MASK;
838         diff += sc_level & ~ASSOC_ARRAY_KEY_CHUNK_MASK;
839         pr_devel("diff=%d\n", diff);
840
841         if (!shortcut->back_pointer) {
842                 edit->set[0].ptr = &edit->array->root;
843         } else if (assoc_array_ptr_is_node(shortcut->back_pointer)) {
844                 node = assoc_array_ptr_to_node(shortcut->back_pointer);
845                 edit->set[0].ptr = &node->slots[shortcut->parent_slot];
846         } else {
847                 BUG();
848         }
849
850         edit->excised_meta[0] = assoc_array_shortcut_to_ptr(shortcut);
851
852         /* Create a new node now since we're going to need it anyway */
853         new_n0 = kzalloc(sizeof(struct assoc_array_node), GFP_KERNEL);
854         if (!new_n0)
855                 return false;
856         edit->new_meta[0] = assoc_array_node_to_ptr(new_n0);
857         edit->adjust_count_on = new_n0;
858
859         /* Insert a new shortcut before the new node if this segment isn't of
860          * zero length - otherwise we just connect the new node directly to the
861          * parent.
862          */
863         level += ASSOC_ARRAY_LEVEL_STEP;
864         if (diff > level) {
865                 pr_devel("pre-shortcut %d...%d\n", level, diff);
866                 keylen = round_up(diff, ASSOC_ARRAY_KEY_CHUNK_SIZE);
867                 keylen >>= ASSOC_ARRAY_KEY_CHUNK_SHIFT;
868
869                 new_s0 = kzalloc(sizeof(struct assoc_array_shortcut) +
870                                  keylen * sizeof(unsigned long), GFP_KERNEL);
871                 if (!new_s0)
872                         return false;
873                 edit->new_meta[1] = assoc_array_shortcut_to_ptr(new_s0);
874                 edit->set[0].to = assoc_array_shortcut_to_ptr(new_s0);
875                 new_s0->back_pointer = shortcut->back_pointer;
876                 new_s0->parent_slot = shortcut->parent_slot;
877                 new_s0->next_node = assoc_array_node_to_ptr(new_n0);
878                 new_s0->skip_to_level = diff;
879
880                 new_n0->back_pointer = assoc_array_shortcut_to_ptr(new_s0);
881                 new_n0->parent_slot = 0;
882
883                 memcpy(new_s0->index_key, shortcut->index_key,
884                        keylen * sizeof(unsigned long));
885
886                 blank = ULONG_MAX << (diff & ASSOC_ARRAY_KEY_CHUNK_MASK);
887                 pr_devel("blank off [%zu] %d: %lx\n", keylen - 1, diff, blank);
888                 new_s0->index_key[keylen - 1] &= ~blank;
889         } else {
890                 pr_devel("no pre-shortcut\n");
891                 edit->set[0].to = assoc_array_node_to_ptr(new_n0);
892                 new_n0->back_pointer = shortcut->back_pointer;
893                 new_n0->parent_slot = shortcut->parent_slot;
894         }
895
896         side = assoc_array_ptr_to_node(shortcut->next_node);
897         new_n0->nr_leaves_on_branch = side->nr_leaves_on_branch;
898
899         /* We need to know which slot in the new node is going to take a
900          * metadata pointer.
901          */
902         sc_slot = sc_segments >> (diff & ASSOC_ARRAY_KEY_CHUNK_MASK);
903         sc_slot &= ASSOC_ARRAY_FAN_MASK;
904
905         pr_devel("new slot %lx >> %d -> %d\n",
906                  sc_segments, diff & ASSOC_ARRAY_KEY_CHUNK_MASK, sc_slot);
907
908         /* Determine whether we need to follow the new node with a replacement
909          * for the current shortcut.  We could in theory reuse the current
910          * shortcut if its parent slot number doesn't change - but that's a
911          * 1-in-16 chance so not worth expending the code upon.
912          */
913         level = diff + ASSOC_ARRAY_LEVEL_STEP;
914         if (level < shortcut->skip_to_level) {
915                 pr_devel("post-shortcut %d...%d\n", level, shortcut->skip_to_level);
916                 keylen = round_up(shortcut->skip_to_level, ASSOC_ARRAY_KEY_CHUNK_SIZE);
917                 keylen >>= ASSOC_ARRAY_KEY_CHUNK_SHIFT;
918
919                 new_s1 = kzalloc(sizeof(struct assoc_array_shortcut) +
920                                  keylen * sizeof(unsigned long), GFP_KERNEL);
921                 if (!new_s1)
922                         return false;
923                 edit->new_meta[2] = assoc_array_shortcut_to_ptr(new_s1);
924
925                 new_s1->back_pointer = assoc_array_node_to_ptr(new_n0);
926                 new_s1->parent_slot = sc_slot;
927                 new_s1->next_node = shortcut->next_node;
928                 new_s1->skip_to_level = shortcut->skip_to_level;
929
930                 new_n0->slots[sc_slot] = assoc_array_shortcut_to_ptr(new_s1);
931
932                 memcpy(new_s1->index_key, shortcut->index_key,
933                        keylen * sizeof(unsigned long));
934
935                 edit->set[1].ptr = &side->back_pointer;
936                 edit->set[1].to = assoc_array_shortcut_to_ptr(new_s1);
937         } else {
938                 pr_devel("no post-shortcut\n");
939
940                 /* We don't have to replace the pointed-to node as long as we
941                  * use memory barriers to make sure the parent slot number is
942                  * changed before the back pointer (the parent slot number is
943                  * irrelevant to the old parent shortcut).
944                  */
945                 new_n0->slots[sc_slot] = shortcut->next_node;
946                 edit->set_parent_slot[0].p = &side->parent_slot;
947                 edit->set_parent_slot[0].to = sc_slot;
948                 edit->set[1].ptr = &side->back_pointer;
949                 edit->set[1].to = assoc_array_node_to_ptr(new_n0);
950         }
951
952         /* Install the new leaf in a spare slot in the new node. */
953         if (sc_slot == 0)
954                 edit->leaf_p = &new_n0->slots[1];
955         else
956                 edit->leaf_p = &new_n0->slots[0];
957
958         pr_devel("<--%s() = ok [split shortcut]\n", __func__);
959         return edit;
960 }
961
962 /**
963  * assoc_array_insert - Script insertion of an object into an associative array
964  * @array: The array to insert into.
965  * @ops: The operations to use.
966  * @index_key: The key to insert at.
967  * @object: The object to insert.
968  *
969  * Precalculate and preallocate a script for the insertion or replacement of an
970  * object in an associative array.  This results in an edit script that can
971  * either be applied or cancelled.
972  *
973  * The function returns a pointer to an edit script or -ENOMEM.
974  *
975  * The caller should lock against other modifications and must continue to hold
976  * the lock until assoc_array_apply_edit() has been called.
977  *
978  * Accesses to the tree may take place concurrently with this function,
979  * provided they hold the RCU read lock.
980  */
981 struct assoc_array_edit *assoc_array_insert(struct assoc_array *array,
982                                             const struct assoc_array_ops *ops,
983                                             const void *index_key,
984                                             void *object)
985 {
986         struct assoc_array_walk_result result;
987         struct assoc_array_edit *edit;
988
989         pr_devel("-->%s()\n", __func__);
990
991         /* The leaf pointer we're given must not have the bottom bit set as we
992          * use those for type-marking the pointer.  NULL pointers are also not
993          * allowed as they indicate an empty slot but we have to allow them
994          * here as they can be updated later.
995          */
996         BUG_ON(assoc_array_ptr_is_meta(object));
997
998         edit = kzalloc(sizeof(struct assoc_array_edit), GFP_KERNEL);
999         if (!edit)
1000                 return ERR_PTR(-ENOMEM);
1001         edit->array = array;
1002         edit->ops = ops;
1003         edit->leaf = assoc_array_leaf_to_ptr(object);
1004         edit->adjust_count_by = 1;
1005
1006         switch (assoc_array_walk(array, ops, index_key, &result)) {
1007         case assoc_array_walk_tree_empty:
1008                 /* Allocate a root node if there isn't one yet */
1009                 if (!assoc_array_insert_in_empty_tree(edit))
1010                         goto enomem;
1011                 return edit;
1012
1013         case assoc_array_walk_found_terminal_node:
1014                 /* We found a node that doesn't have a node/shortcut pointer in
1015                  * the slot corresponding to the index key that we have to
1016                  * follow.
1017                  */
1018                 if (!assoc_array_insert_into_terminal_node(edit, ops, index_key,
1019                                                            &result))
1020                         goto enomem;
1021                 return edit;
1022
1023         case assoc_array_walk_found_wrong_shortcut:
1024                 /* We found a shortcut that didn't match our key in a slot we
1025                  * needed to follow.
1026                  */
1027                 if (!assoc_array_insert_mid_shortcut(edit, ops, &result))
1028                         goto enomem;
1029                 return edit;
1030         }
1031
1032 enomem:
1033         /* Clean up after an out of memory error */
1034         pr_devel("enomem\n");
1035         assoc_array_cancel_edit(edit);
1036         return ERR_PTR(-ENOMEM);
1037 }
1038
1039 /**
1040  * assoc_array_insert_set_object - Set the new object pointer in an edit script
1041  * @edit: The edit script to modify.
1042  * @object: The object pointer to set.
1043  *
1044  * Change the object to be inserted in an edit script.  The object pointed to
1045  * by the old object is not freed.  This must be done prior to applying the
1046  * script.
1047  */
1048 void assoc_array_insert_set_object(struct assoc_array_edit *edit, void *object)
1049 {
1050         BUG_ON(!object);
1051         edit->leaf = assoc_array_leaf_to_ptr(object);
1052 }
1053
1054 struct assoc_array_delete_collapse_context {
1055         struct assoc_array_node *node;
1056         const void              *skip_leaf;
1057         int                     slot;
1058 };
1059
1060 /*
1061  * Subtree collapse to node iterator.
1062  */
1063 static int assoc_array_delete_collapse_iterator(const void *leaf,
1064                                                 void *iterator_data)
1065 {
1066         struct assoc_array_delete_collapse_context *collapse = iterator_data;
1067
1068         if (leaf == collapse->skip_leaf)
1069                 return 0;
1070
1071         BUG_ON(collapse->slot >= ASSOC_ARRAY_FAN_OUT);
1072
1073         collapse->node->slots[collapse->slot++] = assoc_array_leaf_to_ptr(leaf);
1074         return 0;
1075 }
1076
1077 /**
1078  * assoc_array_delete - Script deletion of an object from an associative array
1079  * @array: The array to search.
1080  * @ops: The operations to use.
1081  * @index_key: The key to the object.
1082  *
1083  * Precalculate and preallocate a script for the deletion of an object from an
1084  * associative array.  This results in an edit script that can either be
1085  * applied or cancelled.
1086  *
1087  * The function returns a pointer to an edit script if the object was found,
1088  * NULL if the object was not found or -ENOMEM.
1089  *
1090  * The caller should lock against other modifications and must continue to hold
1091  * the lock until assoc_array_apply_edit() has been called.
1092  *
1093  * Accesses to the tree may take place concurrently with this function,
1094  * provided they hold the RCU read lock.
1095  */
1096 struct assoc_array_edit *assoc_array_delete(struct assoc_array *array,
1097                                             const struct assoc_array_ops *ops,
1098                                             const void *index_key)
1099 {
1100         struct assoc_array_delete_collapse_context collapse;
1101         struct assoc_array_walk_result result;
1102         struct assoc_array_node *node, *new_n0;
1103         struct assoc_array_edit *edit;
1104         struct assoc_array_ptr *ptr;
1105         bool has_meta;
1106         int slot, i;
1107
1108         pr_devel("-->%s()\n", __func__);
1109
1110         edit = kzalloc(sizeof(struct assoc_array_edit), GFP_KERNEL);
1111         if (!edit)
1112                 return ERR_PTR(-ENOMEM);
1113         edit->array = array;
1114         edit->ops = ops;
1115         edit->adjust_count_by = -1;
1116
1117         switch (assoc_array_walk(array, ops, index_key, &result)) {
1118         case assoc_array_walk_found_terminal_node:
1119                 /* We found a node that should contain the leaf we've been
1120                  * asked to remove - *if* it's in the tree.
1121                  */
1122                 pr_devel("terminal_node\n");
1123                 node = result.terminal_node.node;
1124
1125                 for (slot = 0; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
1126                         ptr = node->slots[slot];
1127                         if (ptr &&
1128                             assoc_array_ptr_is_leaf(ptr) &&
1129                             ops->compare_object(assoc_array_ptr_to_leaf(ptr),
1130                                                 index_key))
1131                                 goto found_leaf;
1132                 }
1133         case assoc_array_walk_tree_empty:
1134         case assoc_array_walk_found_wrong_shortcut:
1135         default:
1136                 assoc_array_cancel_edit(edit);
1137                 pr_devel("not found\n");
1138                 return NULL;
1139         }
1140
1141 found_leaf:
1142         BUG_ON(array->nr_leaves_on_tree <= 0);
1143
1144         /* In the simplest form of deletion we just clear the slot and release
1145          * the leaf after a suitable interval.
1146          */
1147         edit->dead_leaf = node->slots[slot];
1148         edit->set[0].ptr = &node->slots[slot];
1149         edit->set[0].to = NULL;
1150         edit->adjust_count_on = node;
1151
1152         /* If that concludes erasure of the last leaf, then delete the entire
1153          * internal array.
1154          */
1155         if (array->nr_leaves_on_tree == 1) {
1156                 edit->set[1].ptr = &array->root;
1157                 edit->set[1].to = NULL;
1158                 edit->adjust_count_on = NULL;
1159                 edit->excised_subtree = array->root;
1160                 pr_devel("all gone\n");
1161                 return edit;
1162         }
1163
1164         /* However, we'd also like to clear up some metadata blocks if we
1165          * possibly can.
1166          *
1167          * We go for a simple algorithm of: if this node has FAN_OUT or fewer
1168          * leaves in it, then attempt to collapse it - and attempt to
1169          * recursively collapse up the tree.
1170          *
1171          * We could also try and collapse in partially filled subtrees to take
1172          * up space in this node.
1173          */
1174         if (node->nr_leaves_on_branch <= ASSOC_ARRAY_FAN_OUT + 1) {
1175                 struct assoc_array_node *parent, *grandparent;
1176                 struct assoc_array_ptr *ptr;
1177
1178                 /* First of all, we need to know if this node has metadata so
1179                  * that we don't try collapsing if all the leaves are already
1180                  * here.
1181                  */
1182                 has_meta = false;
1183                 for (i = 0; i < ASSOC_ARRAY_FAN_OUT; i++) {
1184                         ptr = node->slots[i];
1185                         if (assoc_array_ptr_is_meta(ptr)) {
1186                                 has_meta = true;
1187                                 break;
1188                         }
1189                 }
1190
1191                 pr_devel("leaves: %ld [m=%d]\n",
1192                          node->nr_leaves_on_branch - 1, has_meta);
1193
1194                 /* Look further up the tree to see if we can collapse this node
1195                  * into a more proximal node too.
1196                  */
1197                 parent = node;
1198         collapse_up:
1199                 pr_devel("collapse subtree: %ld\n", parent->nr_leaves_on_branch);
1200
1201                 ptr = parent->back_pointer;
1202                 if (!ptr)
1203                         goto do_collapse;
1204                 if (assoc_array_ptr_is_shortcut(ptr)) {
1205                         struct assoc_array_shortcut *s = assoc_array_ptr_to_shortcut(ptr);
1206                         ptr = s->back_pointer;
1207                         if (!ptr)
1208                                 goto do_collapse;
1209                 }
1210
1211                 grandparent = assoc_array_ptr_to_node(ptr);
1212                 if (grandparent->nr_leaves_on_branch <= ASSOC_ARRAY_FAN_OUT + 1) {
1213                         parent = grandparent;
1214                         goto collapse_up;
1215                 }
1216
1217         do_collapse:
1218                 /* There's no point collapsing if the original node has no meta
1219                  * pointers to discard and if we didn't merge into one of that
1220                  * node's ancestry.
1221                  */
1222                 if (has_meta || parent != node) {
1223                         node = parent;
1224
1225                         /* Create a new node to collapse into */
1226                         new_n0 = kzalloc(sizeof(struct assoc_array_node), GFP_KERNEL);
1227                         if (!new_n0)
1228                                 goto enomem;
1229                         edit->new_meta[0] = assoc_array_node_to_ptr(new_n0);
1230
1231                         new_n0->back_pointer = node->back_pointer;
1232                         new_n0->parent_slot = node->parent_slot;
1233                         new_n0->nr_leaves_on_branch = node->nr_leaves_on_branch;
1234                         edit->adjust_count_on = new_n0;
1235
1236                         collapse.node = new_n0;
1237                         collapse.skip_leaf = assoc_array_ptr_to_leaf(edit->dead_leaf);
1238                         collapse.slot = 0;
1239                         assoc_array_subtree_iterate(assoc_array_node_to_ptr(node),
1240                                                     node->back_pointer,
1241                                                     assoc_array_delete_collapse_iterator,
1242                                                     &collapse);
1243                         pr_devel("collapsed %d,%lu\n", collapse.slot, new_n0->nr_leaves_on_branch);
1244                         BUG_ON(collapse.slot != new_n0->nr_leaves_on_branch - 1);
1245
1246                         if (!node->back_pointer) {
1247                                 edit->set[1].ptr = &array->root;
1248                         } else if (assoc_array_ptr_is_leaf(node->back_pointer)) {
1249                                 BUG();
1250                         } else if (assoc_array_ptr_is_node(node->back_pointer)) {
1251                                 struct assoc_array_node *p =
1252                                         assoc_array_ptr_to_node(node->back_pointer);
1253                                 edit->set[1].ptr = &p->slots[node->parent_slot];
1254                         } else if (assoc_array_ptr_is_shortcut(node->back_pointer)) {
1255                                 struct assoc_array_shortcut *s =
1256                                         assoc_array_ptr_to_shortcut(node->back_pointer);
1257                                 edit->set[1].ptr = &s->next_node;
1258                         }
1259                         edit->set[1].to = assoc_array_node_to_ptr(new_n0);
1260                         edit->excised_subtree = assoc_array_node_to_ptr(node);
1261                 }
1262         }
1263
1264         return edit;
1265
1266 enomem:
1267         /* Clean up after an out of memory error */
1268         pr_devel("enomem\n");
1269         assoc_array_cancel_edit(edit);
1270         return ERR_PTR(-ENOMEM);
1271 }
1272
1273 /**
1274  * assoc_array_clear - Script deletion of all objects from an associative array
1275  * @array: The array to clear.
1276  * @ops: The operations to use.
1277  *
1278  * Precalculate and preallocate a script for the deletion of all the objects
1279  * from an associative array.  This results in an edit script that can either
1280  * be applied or cancelled.
1281  *
1282  * The function returns a pointer to an edit script if there are objects to be
1283  * deleted, NULL if there are no objects in the array or -ENOMEM.
1284  *
1285  * The caller should lock against other modifications and must continue to hold
1286  * the lock until assoc_array_apply_edit() has been called.
1287  *
1288  * Accesses to the tree may take place concurrently with this function,
1289  * provided they hold the RCU read lock.
1290  */
1291 struct assoc_array_edit *assoc_array_clear(struct assoc_array *array,
1292                                            const struct assoc_array_ops *ops)
1293 {
1294         struct assoc_array_edit *edit;
1295
1296         pr_devel("-->%s()\n", __func__);
1297
1298         if (!array->root)
1299                 return NULL;
1300
1301         edit = kzalloc(sizeof(struct assoc_array_edit), GFP_KERNEL);
1302         if (!edit)
1303                 return ERR_PTR(-ENOMEM);
1304         edit->array = array;
1305         edit->ops = ops;
1306         edit->set[1].ptr = &array->root;
1307         edit->set[1].to = NULL;
1308         edit->excised_subtree = array->root;
1309         edit->ops_for_excised_subtree = ops;
1310         pr_devel("all gone\n");
1311         return edit;
1312 }
1313
1314 /*
1315  * Handle the deferred destruction after an applied edit.
1316  */
1317 static void assoc_array_rcu_cleanup(struct rcu_head *head)
1318 {
1319         struct assoc_array_edit *edit =
1320                 container_of(head, struct assoc_array_edit, rcu);
1321         int i;
1322
1323         pr_devel("-->%s()\n", __func__);
1324
1325         if (edit->dead_leaf)
1326                 edit->ops->free_object(assoc_array_ptr_to_leaf(edit->dead_leaf));
1327         for (i = 0; i < ARRAY_SIZE(edit->excised_meta); i++)
1328                 if (edit->excised_meta[i])
1329                         kfree(assoc_array_ptr_to_node(edit->excised_meta[i]));
1330
1331         if (edit->excised_subtree) {
1332                 BUG_ON(assoc_array_ptr_is_leaf(edit->excised_subtree));
1333                 if (assoc_array_ptr_is_node(edit->excised_subtree)) {
1334                         struct assoc_array_node *n =
1335                                 assoc_array_ptr_to_node(edit->excised_subtree);
1336                         n->back_pointer = NULL;
1337                 } else {
1338                         struct assoc_array_shortcut *s =
1339                                 assoc_array_ptr_to_shortcut(edit->excised_subtree);
1340                         s->back_pointer = NULL;
1341                 }
1342                 assoc_array_destroy_subtree(edit->excised_subtree,
1343                                             edit->ops_for_excised_subtree);
1344         }
1345
1346         kfree(edit);
1347 }
1348
1349 /**
1350  * assoc_array_apply_edit - Apply an edit script to an associative array
1351  * @edit: The script to apply.
1352  *
1353  * Apply an edit script to an associative array to effect an insertion,
1354  * deletion or clearance.  As the edit script includes preallocated memory,
1355  * this is guaranteed not to fail.
1356  *
1357  * The edit script, dead objects and dead metadata will be scheduled for
1358  * destruction after an RCU grace period to permit those doing read-only
1359  * accesses on the array to continue to do so under the RCU read lock whilst
1360  * the edit is taking place.
1361  */
1362 void assoc_array_apply_edit(struct assoc_array_edit *edit)
1363 {
1364         struct assoc_array_shortcut *shortcut;
1365         struct assoc_array_node *node;
1366         struct assoc_array_ptr *ptr;
1367         int i;
1368
1369         pr_devel("-->%s()\n", __func__);
1370
1371         smp_wmb();
1372         if (edit->leaf_p)
1373                 *edit->leaf_p = edit->leaf;
1374
1375         smp_wmb();
1376         for (i = 0; i < ARRAY_SIZE(edit->set_parent_slot); i++)
1377                 if (edit->set_parent_slot[i].p)
1378                         *edit->set_parent_slot[i].p = edit->set_parent_slot[i].to;
1379
1380         smp_wmb();
1381         for (i = 0; i < ARRAY_SIZE(edit->set_backpointers); i++)
1382                 if (edit->set_backpointers[i])
1383                         *edit->set_backpointers[i] = edit->set_backpointers_to;
1384
1385         smp_wmb();
1386         for (i = 0; i < ARRAY_SIZE(edit->set); i++)
1387                 if (edit->set[i].ptr)
1388                         *edit->set[i].ptr = edit->set[i].to;
1389
1390         if (edit->array->root == NULL) {
1391                 edit->array->nr_leaves_on_tree = 0;
1392         } else if (edit->adjust_count_on) {
1393                 node = edit->adjust_count_on;
1394                 for (;;) {
1395                         node->nr_leaves_on_branch += edit->adjust_count_by;
1396
1397                         ptr = node->back_pointer;
1398                         if (!ptr)
1399                                 break;
1400                         if (assoc_array_ptr_is_shortcut(ptr)) {
1401                                 shortcut = assoc_array_ptr_to_shortcut(ptr);
1402                                 ptr = shortcut->back_pointer;
1403                                 if (!ptr)
1404                                         break;
1405                         }
1406                         BUG_ON(!assoc_array_ptr_is_node(ptr));
1407                         node = assoc_array_ptr_to_node(ptr);
1408                 }
1409
1410                 edit->array->nr_leaves_on_tree += edit->adjust_count_by;
1411         }
1412
1413         call_rcu(&edit->rcu, assoc_array_rcu_cleanup);
1414 }
1415
1416 /**
1417  * assoc_array_cancel_edit - Discard an edit script.
1418  * @edit: The script to discard.
1419  *
1420  * Free an edit script and all the preallocated data it holds without making
1421  * any changes to the associative array it was intended for.
1422  *
1423  * NOTE!  In the case of an insertion script, this does _not_ release the leaf
1424  * that was to be inserted.  That is left to the caller.
1425  */
1426 void assoc_array_cancel_edit(struct assoc_array_edit *edit)
1427 {
1428         struct assoc_array_ptr *ptr;
1429         int i;
1430
1431         pr_devel("-->%s()\n", __func__);
1432
1433         /* Clean up after an out of memory error */
1434         for (i = 0; i < ARRAY_SIZE(edit->new_meta); i++) {
1435                 ptr = edit->new_meta[i];
1436                 if (ptr) {
1437                         if (assoc_array_ptr_is_node(ptr))
1438                                 kfree(assoc_array_ptr_to_node(ptr));
1439                         else
1440                                 kfree(assoc_array_ptr_to_shortcut(ptr));
1441                 }
1442         }
1443         kfree(edit);
1444 }
1445
1446 /**
1447  * assoc_array_gc - Garbage collect an associative array.
1448  * @array: The array to clean.
1449  * @ops: The operations to use.
1450  * @iterator: A callback function to pass judgement on each object.
1451  * @iterator_data: Private data for the callback function.
1452  *
1453  * Collect garbage from an associative array and pack down the internal tree to
1454  * save memory.
1455  *
1456  * The iterator function is asked to pass judgement upon each object in the
1457  * array.  If it returns false, the object is discard and if it returns true,
1458  * the object is kept.  If it returns true, it must increment the object's
1459  * usage count (or whatever it needs to do to retain it) before returning.
1460  *
1461  * This function returns 0 if successful or -ENOMEM if out of memory.  In the
1462  * latter case, the array is not changed.
1463  *
1464  * The caller should lock against other modifications and must continue to hold
1465  * the lock until assoc_array_apply_edit() has been called.
1466  *
1467  * Accesses to the tree may take place concurrently with this function,
1468  * provided they hold the RCU read lock.
1469  */
1470 int assoc_array_gc(struct assoc_array *array,
1471                    const struct assoc_array_ops *ops,
1472                    bool (*iterator)(void *object, void *iterator_data),
1473                    void *iterator_data)
1474 {
1475         struct assoc_array_shortcut *shortcut, *new_s;
1476         struct assoc_array_node *node, *new_n;
1477         struct assoc_array_edit *edit;
1478         struct assoc_array_ptr *cursor, *ptr;
1479         struct assoc_array_ptr *new_root, *new_parent, **new_ptr_pp;
1480         unsigned long nr_leaves_on_tree;
1481         int keylen, slot, nr_free, next_slot, i;
1482
1483         pr_devel("-->%s()\n", __func__);
1484
1485         if (!array->root)
1486                 return 0;
1487
1488         edit = kzalloc(sizeof(struct assoc_array_edit), GFP_KERNEL);
1489         if (!edit)
1490                 return -ENOMEM;
1491         edit->array = array;
1492         edit->ops = ops;
1493         edit->ops_for_excised_subtree = ops;
1494         edit->set[0].ptr = &array->root;
1495         edit->excised_subtree = array->root;
1496
1497         new_root = new_parent = NULL;
1498         new_ptr_pp = &new_root;
1499         cursor = array->root;
1500
1501 descend:
1502         /* If this point is a shortcut, then we need to duplicate it and
1503          * advance the target cursor.
1504          */
1505         if (assoc_array_ptr_is_shortcut(cursor)) {
1506                 shortcut = assoc_array_ptr_to_shortcut(cursor);
1507                 keylen = round_up(shortcut->skip_to_level, ASSOC_ARRAY_KEY_CHUNK_SIZE);
1508                 keylen >>= ASSOC_ARRAY_KEY_CHUNK_SHIFT;
1509                 new_s = kmalloc(sizeof(struct assoc_array_shortcut) +
1510                                 keylen * sizeof(unsigned long), GFP_KERNEL);
1511                 if (!new_s)
1512                         goto enomem;
1513                 pr_devel("dup shortcut %p -> %p\n", shortcut, new_s);
1514                 memcpy(new_s, shortcut, (sizeof(struct assoc_array_shortcut) +
1515                                          keylen * sizeof(unsigned long)));
1516                 new_s->back_pointer = new_parent;
1517                 new_s->parent_slot = shortcut->parent_slot;
1518                 *new_ptr_pp = new_parent = assoc_array_shortcut_to_ptr(new_s);
1519                 new_ptr_pp = &new_s->next_node;
1520                 cursor = shortcut->next_node;
1521         }
1522
1523         /* Duplicate the node at this position */
1524         node = assoc_array_ptr_to_node(cursor);
1525         new_n = kzalloc(sizeof(struct assoc_array_node), GFP_KERNEL);
1526         if (!new_n)
1527                 goto enomem;
1528         pr_devel("dup node %p -> %p\n", node, new_n);
1529         new_n->back_pointer = new_parent;
1530         new_n->parent_slot = node->parent_slot;
1531         *new_ptr_pp = new_parent = assoc_array_node_to_ptr(new_n);
1532         new_ptr_pp = NULL;
1533         slot = 0;
1534
1535 continue_node:
1536         /* Filter across any leaves and gc any subtrees */
1537         for (; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
1538                 ptr = node->slots[slot];
1539                 if (!ptr)
1540                         continue;
1541
1542                 if (assoc_array_ptr_is_leaf(ptr)) {
1543                         if (iterator(assoc_array_ptr_to_leaf(ptr),
1544                                      iterator_data))
1545                                 /* The iterator will have done any reference
1546                                  * counting on the object for us.
1547                                  */
1548                                 new_n->slots[slot] = ptr;
1549                         continue;
1550                 }
1551
1552                 new_ptr_pp = &new_n->slots[slot];
1553                 cursor = ptr;
1554                 goto descend;
1555         }
1556
1557         pr_devel("-- compress node %p --\n", new_n);
1558
1559         /* Count up the number of empty slots in this node and work out the
1560          * subtree leaf count.
1561          */
1562         new_n->nr_leaves_on_branch = 0;
1563         nr_free = 0;
1564         for (slot = 0; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
1565                 ptr = new_n->slots[slot];
1566                 if (!ptr)
1567                         nr_free++;
1568                 else if (assoc_array_ptr_is_leaf(ptr))
1569                         new_n->nr_leaves_on_branch++;
1570         }
1571         pr_devel("free=%d, leaves=%lu\n", nr_free, new_n->nr_leaves_on_branch);
1572
1573         /* See what we can fold in */
1574         next_slot = 0;
1575         for (slot = 0; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
1576                 struct assoc_array_shortcut *s;
1577                 struct assoc_array_node *child;
1578
1579                 ptr = new_n->slots[slot];
1580                 if (!ptr || assoc_array_ptr_is_leaf(ptr))
1581                         continue;
1582
1583                 s = NULL;
1584                 if (assoc_array_ptr_is_shortcut(ptr)) {
1585                         s = assoc_array_ptr_to_shortcut(ptr);
1586                         ptr = s->next_node;
1587                 }
1588
1589                 child = assoc_array_ptr_to_node(ptr);
1590                 new_n->nr_leaves_on_branch += child->nr_leaves_on_branch;
1591
1592                 if (child->nr_leaves_on_branch <= nr_free + 1) {
1593                         /* Fold the child node into this one */
1594                         pr_devel("[%d] fold node %lu/%d [nx %d]\n",
1595                                  slot, child->nr_leaves_on_branch, nr_free + 1,
1596                                  next_slot);
1597
1598                         /* We would already have reaped an intervening shortcut
1599                          * on the way back up the tree.
1600                          */
1601                         BUG_ON(s);
1602
1603                         new_n->slots[slot] = NULL;
1604                         nr_free++;
1605                         if (slot < next_slot)
1606                                 next_slot = slot;
1607                         for (i = 0; i < ASSOC_ARRAY_FAN_OUT; i++) {
1608                                 struct assoc_array_ptr *p = child->slots[i];
1609                                 if (!p)
1610                                         continue;
1611                                 BUG_ON(assoc_array_ptr_is_meta(p));
1612                                 while (new_n->slots[next_slot])
1613                                         next_slot++;
1614                                 BUG_ON(next_slot >= ASSOC_ARRAY_FAN_OUT);
1615                                 new_n->slots[next_slot++] = p;
1616                                 nr_free--;
1617                         }
1618                         kfree(child);
1619                 } else {
1620                         pr_devel("[%d] retain node %lu/%d [nx %d]\n",
1621                                  slot, child->nr_leaves_on_branch, nr_free + 1,
1622                                  next_slot);
1623                 }
1624         }
1625
1626         pr_devel("after: %lu\n", new_n->nr_leaves_on_branch);
1627
1628         nr_leaves_on_tree = new_n->nr_leaves_on_branch;
1629
1630         /* Excise this node if it is singly occupied by a shortcut */
1631         if (nr_free == ASSOC_ARRAY_FAN_OUT - 1) {
1632                 for (slot = 0; slot < ASSOC_ARRAY_FAN_OUT; slot++)
1633                         if ((ptr = new_n->slots[slot]))
1634                                 break;
1635
1636                 if (assoc_array_ptr_is_meta(ptr) &&
1637                     assoc_array_ptr_is_shortcut(ptr)) {
1638                         pr_devel("excise node %p with 1 shortcut\n", new_n);
1639                         new_s = assoc_array_ptr_to_shortcut(ptr);
1640                         new_parent = new_n->back_pointer;
1641                         slot = new_n->parent_slot;
1642                         kfree(new_n);
1643                         if (!new_parent) {
1644                                 new_s->back_pointer = NULL;
1645                                 new_s->parent_slot = 0;
1646                                 new_root = ptr;
1647                                 goto gc_complete;
1648                         }
1649
1650                         if (assoc_array_ptr_is_shortcut(new_parent)) {
1651                                 /* We can discard any preceding shortcut also */
1652                                 struct assoc_array_shortcut *s =
1653                                         assoc_array_ptr_to_shortcut(new_parent);
1654
1655                                 pr_devel("excise preceding shortcut\n");
1656
1657                                 new_parent = new_s->back_pointer = s->back_pointer;
1658                                 slot = new_s->parent_slot = s->parent_slot;
1659                                 kfree(s);
1660                                 if (!new_parent) {
1661                                         new_s->back_pointer = NULL;
1662                                         new_s->parent_slot = 0;
1663                                         new_root = ptr;
1664                                         goto gc_complete;
1665                                 }
1666                         }
1667
1668                         new_s->back_pointer = new_parent;
1669                         new_s->parent_slot = slot;
1670                         new_n = assoc_array_ptr_to_node(new_parent);
1671                         new_n->slots[slot] = ptr;
1672                         goto ascend_old_tree;
1673                 }
1674         }
1675
1676         /* Excise any shortcuts we might encounter that point to nodes that
1677          * only contain leaves.
1678          */
1679         ptr = new_n->back_pointer;
1680         if (!ptr)
1681                 goto gc_complete;
1682
1683         if (assoc_array_ptr_is_shortcut(ptr)) {
1684                 new_s = assoc_array_ptr_to_shortcut(ptr);
1685                 new_parent = new_s->back_pointer;
1686                 slot = new_s->parent_slot;
1687
1688                 if (new_n->nr_leaves_on_branch <= ASSOC_ARRAY_FAN_OUT) {
1689                         struct assoc_array_node *n;
1690
1691                         pr_devel("excise shortcut\n");
1692                         new_n->back_pointer = new_parent;
1693                         new_n->parent_slot = slot;
1694                         kfree(new_s);
1695                         if (!new_parent) {
1696                                 new_root = assoc_array_node_to_ptr(new_n);
1697                                 goto gc_complete;
1698                         }
1699
1700                         n = assoc_array_ptr_to_node(new_parent);
1701                         n->slots[slot] = assoc_array_node_to_ptr(new_n);
1702                 }
1703         } else {
1704                 new_parent = ptr;
1705         }
1706         new_n = assoc_array_ptr_to_node(new_parent);
1707
1708 ascend_old_tree:
1709         ptr = node->back_pointer;
1710         if (assoc_array_ptr_is_shortcut(ptr)) {
1711                 shortcut = assoc_array_ptr_to_shortcut(ptr);
1712                 slot = shortcut->parent_slot;
1713                 cursor = shortcut->back_pointer;
1714                 if (!cursor)
1715                         goto gc_complete;
1716         } else {
1717                 slot = node->parent_slot;
1718                 cursor = ptr;
1719         }
1720         BUG_ON(!cursor);
1721         node = assoc_array_ptr_to_node(cursor);
1722         slot++;
1723         goto continue_node;
1724
1725 gc_complete:
1726         edit->set[0].to = new_root;
1727         assoc_array_apply_edit(edit);
1728         array->nr_leaves_on_tree = nr_leaves_on_tree;
1729         return 0;
1730
1731 enomem:
1732         pr_devel("enomem\n");
1733         assoc_array_destroy_subtree(new_root, edit->ops);
1734         kfree(edit);
1735         return -ENOMEM;
1736 }