lib/bitmap.c: fix remaining space computation in bitmap_print_to_pagebuf
[sfrench/cifs-2.6.git] / lib / radix-tree.c
index bc03ecc4dfd2f69c8638cbff3270bc55793b7f6b..1106bb6aa01e977de26bcb1235080b00b0e4a067 100644 (file)
 #include <linux/rcupdate.h>
 #include <linux/slab.h>
 #include <linux/string.h>
+#include <linux/xarray.h>
 
 
-/* Number of nodes in fully populated tree of given height */
-static unsigned long height_to_maxnodes[RADIX_TREE_MAX_PATH + 1] __read_mostly;
-
 /*
  * Radix tree node cache.
  */
-static struct kmem_cache *radix_tree_node_cachep;
+struct kmem_cache *radix_tree_node_cachep;
 
 /*
  * The radix tree is variable-height, so an insert operation not only has
@@ -98,24 +96,7 @@ static inline void *node_to_entry(void *ptr)
        return (void *)((unsigned long)ptr | RADIX_TREE_INTERNAL_NODE);
 }
 
-#define RADIX_TREE_RETRY       node_to_entry(NULL)
-
-#ifdef CONFIG_RADIX_TREE_MULTIORDER
-/* Sibling slots point directly to another slot in the same node */
-static inline
-bool is_sibling_entry(const struct radix_tree_node *parent, void *node)
-{
-       void __rcu **ptr = node;
-       return (parent->slots <= ptr) &&
-                       (ptr < parent->slots + RADIX_TREE_MAP_SIZE);
-}
-#else
-static inline
-bool is_sibling_entry(const struct radix_tree_node *parent, void *node)
-{
-       return false;
-}
-#endif
+#define RADIX_TREE_RETRY       XA_RETRY_ENTRY
 
 static inline unsigned long
 get_slot_offset(const struct radix_tree_node *parent, void __rcu **slot)
@@ -129,24 +110,13 @@ static unsigned int radix_tree_descend(const struct radix_tree_node *parent,
        unsigned int offset = (index >> parent->shift) & RADIX_TREE_MAP_MASK;
        void __rcu **entry = rcu_dereference_raw(parent->slots[offset]);
 
-#ifdef CONFIG_RADIX_TREE_MULTIORDER
-       if (radix_tree_is_internal_node(entry)) {
-               if (is_sibling_entry(parent, entry)) {
-                       void __rcu **sibentry;
-                       sibentry = (void __rcu **) entry_to_node(entry);
-                       offset = get_slot_offset(parent, sibentry);
-                       entry = rcu_dereference_raw(*sibentry);
-               }
-       }
-#endif
-
        *nodep = (void *)entry;
        return offset;
 }
 
 static inline gfp_t root_gfp_mask(const struct radix_tree_root *root)
 {
-       return root->gfp_mask & (__GFP_BITS_MASK & ~GFP_ZONEMASK);
+       return root->xa_flags & (__GFP_BITS_MASK & ~GFP_ZONEMASK);
 }
 
 static inline void tag_set(struct radix_tree_node *node, unsigned int tag,
@@ -169,32 +139,32 @@ static inline int tag_get(const struct radix_tree_node *node, unsigned int tag,
 
 static inline void root_tag_set(struct radix_tree_root *root, unsigned tag)
 {
-       root->gfp_mask |= (__force gfp_t)(1 << (tag + ROOT_TAG_SHIFT));
+       root->xa_flags |= (__force gfp_t)(1 << (tag + ROOT_TAG_SHIFT));
 }
 
 static inline void root_tag_clear(struct radix_tree_root *root, unsigned tag)
 {
-       root->gfp_mask &= (__force gfp_t)~(1 << (tag + ROOT_TAG_SHIFT));
+       root->xa_flags &= (__force gfp_t)~(1 << (tag + ROOT_TAG_SHIFT));
 }
 
 static inline void root_tag_clear_all(struct radix_tree_root *root)
 {
-       root->gfp_mask &= (1 << ROOT_TAG_SHIFT) - 1;
+       root->xa_flags &= (__force gfp_t)((1 << ROOT_TAG_SHIFT) - 1);
 }
 
 static inline int root_tag_get(const struct radix_tree_root *root, unsigned tag)
 {
-       return (__force int)root->gfp_mask & (1 << (tag + ROOT_TAG_SHIFT));
+       return (__force int)root->xa_flags & (1 << (tag + ROOT_TAG_SHIFT));
 }
 
 static inline unsigned root_tags_get(const struct radix_tree_root *root)
 {
-       return (__force unsigned)root->gfp_mask >> ROOT_TAG_SHIFT;
+       return (__force unsigned)root->xa_flags >> ROOT_TAG_SHIFT;
 }
 
 static inline bool is_idr(const struct radix_tree_root *root)
 {
-       return !!(root->gfp_mask & ROOT_IS_IDR);
+       return !!(root->xa_flags & ROOT_IS_IDR);
 }
 
 /*
@@ -254,7 +224,7 @@ radix_tree_find_next_bit(struct radix_tree_node *node, unsigned int tag,
 
 static unsigned int iter_offset(const struct radix_tree_iter *iter)
 {
-       return (iter->index >> iter_shift(iter)) & RADIX_TREE_MAP_MASK;
+       return iter->index & RADIX_TREE_MAP_MASK;
 }
 
 /*
@@ -277,99 +247,6 @@ static unsigned long next_index(unsigned long index,
        return (index & ~node_maxindex(node)) + (offset << node->shift);
 }
 
-#ifndef __KERNEL__
-static void dump_node(struct radix_tree_node *node, unsigned long index)
-{
-       unsigned long i;
-
-       pr_debug("radix node: %p offset %d indices %lu-%lu parent %p tags %lx %lx %lx shift %d count %d exceptional %d\n",
-               node, node->offset, index, index | node_maxindex(node),
-               node->parent,
-               node->tags[0][0], node->tags[1][0], node->tags[2][0],
-               node->shift, node->count, node->exceptional);
-
-       for (i = 0; i < RADIX_TREE_MAP_SIZE; i++) {
-               unsigned long first = index | (i << node->shift);
-               unsigned long last = first | ((1UL << node->shift) - 1);
-               void *entry = node->slots[i];
-               if (!entry)
-                       continue;
-               if (entry == RADIX_TREE_RETRY) {
-                       pr_debug("radix retry offset %ld indices %lu-%lu parent %p\n",
-                                       i, first, last, node);
-               } else if (!radix_tree_is_internal_node(entry)) {
-                       pr_debug("radix entry %p offset %ld indices %lu-%lu parent %p\n",
-                                       entry, i, first, last, node);
-               } else if (is_sibling_entry(node, entry)) {
-                       pr_debug("radix sblng %p offset %ld indices %lu-%lu parent %p val %p\n",
-                                       entry, i, first, last, node,
-                                       *(void **)entry_to_node(entry));
-               } else {
-                       dump_node(entry_to_node(entry), first);
-               }
-       }
-}
-
-/* For debug */
-static void radix_tree_dump(struct radix_tree_root *root)
-{
-       pr_debug("radix root: %p rnode %p tags %x\n",
-                       root, root->rnode,
-                       root->gfp_mask >> ROOT_TAG_SHIFT);
-       if (!radix_tree_is_internal_node(root->rnode))
-               return;
-       dump_node(entry_to_node(root->rnode), 0);
-}
-
-static void dump_ida_node(void *entry, unsigned long index)
-{
-       unsigned long i;
-
-       if (!entry)
-               return;
-
-       if (radix_tree_is_internal_node(entry)) {
-               struct radix_tree_node *node = entry_to_node(entry);
-
-               pr_debug("ida node: %p offset %d indices %lu-%lu parent %p free %lx shift %d count %d\n",
-                       node, node->offset, index * IDA_BITMAP_BITS,
-                       ((index | node_maxindex(node)) + 1) *
-                               IDA_BITMAP_BITS - 1,
-                       node->parent, node->tags[0][0], node->shift,
-                       node->count);
-               for (i = 0; i < RADIX_TREE_MAP_SIZE; i++)
-                       dump_ida_node(node->slots[i],
-                                       index | (i << node->shift));
-       } else if (radix_tree_exceptional_entry(entry)) {
-               pr_debug("ida excp: %p offset %d indices %lu-%lu data %lx\n",
-                               entry, (int)(index & RADIX_TREE_MAP_MASK),
-                               index * IDA_BITMAP_BITS,
-                               index * IDA_BITMAP_BITS + BITS_PER_LONG -
-                                       RADIX_TREE_EXCEPTIONAL_SHIFT,
-                               (unsigned long)entry >>
-                                       RADIX_TREE_EXCEPTIONAL_SHIFT);
-       } else {
-               struct ida_bitmap *bitmap = entry;
-
-               pr_debug("ida btmp: %p offset %d indices %lu-%lu data", bitmap,
-                               (int)(index & RADIX_TREE_MAP_MASK),
-                               index * IDA_BITMAP_BITS,
-                               (index + 1) * IDA_BITMAP_BITS - 1);
-               for (i = 0; i < IDA_BITMAP_LONGS; i++)
-                       pr_cont(" %lx", bitmap->bitmap[i]);
-               pr_cont("\n");
-       }
-}
-
-static void ida_dump(struct ida *ida)
-{
-       struct radix_tree_root *root = &ida->ida_rt;
-       pr_debug("ida: %p node %p free %d\n", ida, root->rnode,
-                               root->gfp_mask >> ROOT_TAG_SHIFT);
-       dump_ida_node(root->rnode, 0);
-}
-#endif
-
 /*
  * This assumes that the caller has performed appropriate preallocation, and
  * that the caller has pinned this thread of control to the current CPU.
@@ -378,7 +255,7 @@ static struct radix_tree_node *
 radix_tree_node_alloc(gfp_t gfp_mask, struct radix_tree_node *parent,
                        struct radix_tree_root *root,
                        unsigned int shift, unsigned int offset,
-                       unsigned int count, unsigned int exceptional)
+                       unsigned int count, unsigned int nr_values)
 {
        struct radix_tree_node *ret = NULL;
 
@@ -425,14 +302,14 @@ out:
                ret->shift = shift;
                ret->offset = offset;
                ret->count = count;
-               ret->exceptional = exceptional;
+               ret->nr_values = nr_values;
                ret->parent = parent;
-               ret->root = root;
+               ret->array = root;
        }
        return ret;
 }
 
-static void radix_tree_node_rcu_free(struct rcu_head *head)
+void radix_tree_node_rcu_free(struct rcu_head *head)
 {
        struct radix_tree_node *node =
                        container_of(head, struct radix_tree_node, rcu_head);
@@ -530,77 +407,10 @@ int radix_tree_maybe_preload(gfp_t gfp_mask)
 }
 EXPORT_SYMBOL(radix_tree_maybe_preload);
 
-#ifdef CONFIG_RADIX_TREE_MULTIORDER
-/*
- * Preload with enough objects to ensure that we can split a single entry
- * of order @old_order into many entries of size @new_order
- */
-int radix_tree_split_preload(unsigned int old_order, unsigned int new_order,
-                                                       gfp_t gfp_mask)
-{
-       unsigned top = 1 << (old_order % RADIX_TREE_MAP_SHIFT);
-       unsigned layers = (old_order / RADIX_TREE_MAP_SHIFT) -
-                               (new_order / RADIX_TREE_MAP_SHIFT);
-       unsigned nr = 0;
-
-       WARN_ON_ONCE(!gfpflags_allow_blocking(gfp_mask));
-       BUG_ON(new_order >= old_order);
-
-       while (layers--)
-               nr = nr * RADIX_TREE_MAP_SIZE + 1;
-       return __radix_tree_preload(gfp_mask, top * nr);
-}
-#endif
-
-/*
- * The same as function above, but preload number of nodes required to insert
- * (1 << order) continuous naturally-aligned elements.
- */
-int radix_tree_maybe_preload_order(gfp_t gfp_mask, int order)
-{
-       unsigned long nr_subtrees;
-       int nr_nodes, subtree_height;
-
-       /* Preloading doesn't help anything with this gfp mask, skip it */
-       if (!gfpflags_allow_blocking(gfp_mask)) {
-               preempt_disable();
-               return 0;
-       }
-
-       /*
-        * Calculate number and height of fully populated subtrees it takes to
-        * store (1 << order) elements.
-        */
-       nr_subtrees = 1 << order;
-       for (subtree_height = 0; nr_subtrees > RADIX_TREE_MAP_SIZE;
-                       subtree_height++)
-               nr_subtrees >>= RADIX_TREE_MAP_SHIFT;
-
-       /*
-        * The worst case is zero height tree with a single item at index 0 and
-        * then inserting items starting at ULONG_MAX - (1 << order).
-        *
-        * This requires RADIX_TREE_MAX_PATH nodes to build branch from root to
-        * 0-index item.
-        */
-       nr_nodes = RADIX_TREE_MAX_PATH;
-
-       /* Plus branch to fully populated subtrees. */
-       nr_nodes += RADIX_TREE_MAX_PATH - subtree_height;
-
-       /* Root node is shared. */
-       nr_nodes--;
-
-       /* Plus nodes required to build subtrees. */
-       nr_nodes += nr_subtrees * height_to_maxnodes[subtree_height];
-
-       return __radix_tree_preload(gfp_mask, nr_nodes);
-}
-
 static unsigned radix_tree_load_root(const struct radix_tree_root *root,
                struct radix_tree_node **nodep, unsigned long *maxindex)
 {
-       struct radix_tree_node *node = rcu_dereference_raw(root->rnode);
+       struct radix_tree_node *node = rcu_dereference_raw(root->xa_head);
 
        *nodep = node;
 
@@ -629,7 +439,7 @@ static int radix_tree_extend(struct radix_tree_root *root, gfp_t gfp,
        while (index > shift_maxindex(maxshift))
                maxshift += RADIX_TREE_MAP_SHIFT;
 
-       entry = rcu_dereference_raw(root->rnode);
+       entry = rcu_dereference_raw(root->xa_head);
        if (!entry && (!is_idr(root) || root_tag_get(root, IDR_FREE)))
                goto out;
 
@@ -656,9 +466,9 @@ static int radix_tree_extend(struct radix_tree_root *root, gfp_t gfp,
                BUG_ON(shift > BITS_PER_LONG);
                if (radix_tree_is_internal_node(entry)) {
                        entry_to_node(entry)->parent = node;
-               } else if (radix_tree_exceptional_entry(entry)) {
-                       /* Moving an exceptional root->rnode to a node */
-                       node->exceptional = 1;
+               } else if (xa_is_value(entry)) {
+                       /* Moving a value entry root->xa_head to a node */
+                       node->nr_values = 1;
                }
                /*
                 * entry was already in the radix tree, so we do not need
@@ -666,7 +476,7 @@ static int radix_tree_extend(struct radix_tree_root *root, gfp_t gfp,
                 */
                node->slots[0] = (void __rcu *)entry;
                entry = node_to_entry(node);
-               rcu_assign_pointer(root->rnode, entry);
+               rcu_assign_pointer(root->xa_head, entry);
                shift += RADIX_TREE_MAP_SHIFT;
        } while (shift <= maxshift);
 out:
@@ -677,13 +487,12 @@ out:
  *     radix_tree_shrink    -    shrink radix tree to minimum height
  *     @root           radix tree root
  */
-static inline bool radix_tree_shrink(struct radix_tree_root *root,
-                                    radix_tree_update_node_t update_node)
+static inline bool radix_tree_shrink(struct radix_tree_root *root)
 {
        bool shrunk = false;
 
        for (;;) {
-               struct radix_tree_node *node = rcu_dereference_raw(root->rnode);
+               struct radix_tree_node *node = rcu_dereference_raw(root->xa_head);
                struct radix_tree_node *child;
 
                if (!radix_tree_is_internal_node(node))
@@ -692,15 +501,20 @@ static inline bool radix_tree_shrink(struct radix_tree_root *root,
 
                /*
                 * The candidate node has more than one child, or its child
-                * is not at the leftmost slot, or the child is a multiorder
-                * entry, we cannot shrink.
+                * is not at the leftmost slot, we cannot shrink.
                 */
                if (node->count != 1)
                        break;
                child = rcu_dereference_raw(node->slots[0]);
                if (!child)
                        break;
-               if (!radix_tree_is_internal_node(child) && node->shift)
+
+               /*
+                * For an IDR, we must not shrink entry 0 into the root in
+                * case somebody calls idr_replace() with a pointer that
+                * appears to be an internal entry
+                */
+               if (!node->shift && is_idr(root))
                        break;
 
                if (radix_tree_is_internal_node(child))
@@ -711,9 +525,9 @@ static inline bool radix_tree_shrink(struct radix_tree_root *root,
                 * moving the node from one part of the tree to another: if it
                 * was safe to dereference the old pointer to it
                 * (node->slots[0]), it will be safe to dereference the new
-                * one (root->rnode) as far as dependent read barriers go.
+                * one (root->xa_head) as far as dependent read barriers go.
                 */
-               root->rnode = (void __rcu *)child;
+               root->xa_head = (void __rcu *)child;
                if (is_idr(root) && !tag_get(node, IDR_FREE, 0))
                        root_tag_clear(root, IDR_FREE);
 
@@ -738,8 +552,6 @@ static inline bool radix_tree_shrink(struct radix_tree_root *root,
                node->count = 0;
                if (!radix_tree_is_internal_node(child)) {
                        node->slots[0] = (void __rcu *)RADIX_TREE_RETRY;
-                       if (update_node)
-                               update_node(node);
                }
 
                WARN_ON_ONCE(!list_empty(&node->private_list));
@@ -751,8 +563,7 @@ static inline bool radix_tree_shrink(struct radix_tree_root *root,
 }
 
 static bool delete_node(struct radix_tree_root *root,
-                       struct radix_tree_node *node,
-                       radix_tree_update_node_t update_node)
+                       struct radix_tree_node *node)
 {
        bool deleted = false;
 
@@ -761,9 +572,8 @@ static bool delete_node(struct radix_tree_root *root,
 
                if (node->count) {
                        if (node_to_entry(node) ==
-                                       rcu_dereference_raw(root->rnode))
-                               deleted |= radix_tree_shrink(root,
-                                                               update_node);
+                                       rcu_dereference_raw(root->xa_head))
+                               deleted |= radix_tree_shrink(root);
                        return deleted;
                }
 
@@ -778,7 +588,7 @@ static bool delete_node(struct radix_tree_root *root,
                         */
                        if (!is_idr(root))
                                root_tag_clear_all(root);
-                       root->rnode = NULL;
+                       root->xa_head = NULL;
                }
 
                WARN_ON_ONCE(!list_empty(&node->private_list));
@@ -795,7 +605,6 @@ static bool delete_node(struct radix_tree_root *root,
  *     __radix_tree_create     -       create a slot in a radix tree
  *     @root:          radix tree root
  *     @index:         index key
- *     @order:         index occupies 2^order aligned slots
  *     @nodep:         returns node
  *     @slotp:         returns slot
  *
@@ -803,36 +612,34 @@ static bool delete_node(struct radix_tree_root *root,
  *     at position @index in the radix tree @root.
  *
  *     Until there is more than one item in the tree, no nodes are
- *     allocated and @root->rnode is used as a direct slot instead of
+ *     allocated and @root->xa_head is used as a direct slot instead of
  *     pointing to a node, in which case *@nodep will be NULL.
  *
  *     Returns -ENOMEM, or 0 for success.
  */
-int __radix_tree_create(struct radix_tree_root *root, unsigned long index,
-                       unsigned order, struct radix_tree_node **nodep,
-                       void __rcu ***slotp)
+static int __radix_tree_create(struct radix_tree_root *root,
+               unsigned long index, struct radix_tree_node **nodep,
+               void __rcu ***slotp)
 {
        struct radix_tree_node *node = NULL, *child;
-       void __rcu **slot = (void __rcu **)&root->rnode;
+       void __rcu **slot = (void __rcu **)&root->xa_head;
        unsigned long maxindex;
        unsigned int shift, offset = 0;
-       unsigned long max = index | ((1UL << order) - 1);
+       unsigned long max = index;
        gfp_t gfp = root_gfp_mask(root);
 
        shift = radix_tree_load_root(root, &child, &maxindex);
 
        /* Make sure the tree is high enough.  */
-       if (order > 0 && max == ((1UL << order) - 1))
-               max++;
        if (max > maxindex) {
                int error = radix_tree_extend(root, gfp, max, shift);
                if (error < 0)
                        return error;
                shift = error;
-               child = rcu_dereference_raw(root->rnode);
+               child = rcu_dereference_raw(root->xa_head);
        }
 
-       while (shift > order) {
+       while (shift > 0) {
                shift -= RADIX_TREE_MAP_SHIFT;
                if (child == NULL) {
                        /* Have to add a child node.  */
@@ -875,8 +682,7 @@ static void radix_tree_free_nodes(struct radix_tree_node *node)
 
        for (;;) {
                void *entry = rcu_dereference_raw(child->slots[offset]);
-               if (radix_tree_is_internal_node(entry) &&
-                                       !is_sibling_entry(child, entry)) {
+               if (xa_is_node(entry) && child->shift) {
                        child = entry_to_node(entry);
                        offset = 0;
                        continue;
@@ -894,96 +700,30 @@ static void radix_tree_free_nodes(struct radix_tree_node *node)
        }
 }
 
-#ifdef CONFIG_RADIX_TREE_MULTIORDER
 static inline int insert_entries(struct radix_tree_node *node,
-               void __rcu **slot, void *item, unsigned order, bool replace)
-{
-       struct radix_tree_node *child;
-       unsigned i, n, tag, offset, tags = 0;
-
-       if (node) {
-               if (order > node->shift)
-                       n = 1 << (order - node->shift);
-               else
-                       n = 1;
-               offset = get_slot_offset(node, slot);
-       } else {
-               n = 1;
-               offset = 0;
-       }
-
-       if (n > 1) {
-               offset = offset & ~(n - 1);
-               slot = &node->slots[offset];
-       }
-       child = node_to_entry(slot);
-
-       for (i = 0; i < n; i++) {
-               if (slot[i]) {
-                       if (replace) {
-                               node->count--;
-                               for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++)
-                                       if (tag_get(node, tag, offset + i))
-                                               tags |= 1 << tag;
-                       } else
-                               return -EEXIST;
-               }
-       }
-
-       for (i = 0; i < n; i++) {
-               struct radix_tree_node *old = rcu_dereference_raw(slot[i]);
-               if (i) {
-                       rcu_assign_pointer(slot[i], child);
-                       for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++)
-                               if (tags & (1 << tag))
-                                       tag_clear(node, tag, offset + i);
-               } else {
-                       rcu_assign_pointer(slot[i], item);
-                       for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++)
-                               if (tags & (1 << tag))
-                                       tag_set(node, tag, offset);
-               }
-               if (radix_tree_is_internal_node(old) &&
-                                       !is_sibling_entry(node, old) &&
-                                       (old != RADIX_TREE_RETRY))
-                       radix_tree_free_nodes(old);
-               if (radix_tree_exceptional_entry(old))
-                       node->exceptional--;
-       }
-       if (node) {
-               node->count += n;
-               if (radix_tree_exceptional_entry(item))
-                       node->exceptional += n;
-       }
-       return n;
-}
-#else
-static inline int insert_entries(struct radix_tree_node *node,
-               void __rcu **slot, void *item, unsigned order, bool replace)
+               void __rcu **slot, void *item, bool replace)
 {
        if (*slot)
                return -EEXIST;
        rcu_assign_pointer(*slot, item);
        if (node) {
                node->count++;
-               if (radix_tree_exceptional_entry(item))
-                       node->exceptional++;
+               if (xa_is_value(item))
+                       node->nr_values++;
        }
        return 1;
 }
-#endif
 
 /**
  *     __radix_tree_insert    -    insert into a radix tree
  *     @root:          radix tree root
  *     @index:         index key
- *     @order:         key covers the 2^order indices around index
  *     @item:          item to insert
  *
  *     Insert an item into the radix tree at position @index.
  */
-int __radix_tree_insert(struct radix_tree_root *root, unsigned long index,
-                       unsigned order, void *item)
+int radix_tree_insert(struct radix_tree_root *root, unsigned long index,
+                       void *item)
 {
        struct radix_tree_node *node;
        void __rcu **slot;
@@ -991,11 +731,11 @@ int __radix_tree_insert(struct radix_tree_root *root, unsigned long index,
 
        BUG_ON(radix_tree_is_internal_node(item));
 
-       error = __radix_tree_create(root, index, order, &node, &slot);
+       error = __radix_tree_create(root, index, &node, &slot);
        if (error)
                return error;
 
-       error = insert_entries(node, slot, item, order, false);
+       error = insert_entries(node, slot, item, false);
        if (error < 0)
                return error;
 
@@ -1010,7 +750,7 @@ int __radix_tree_insert(struct radix_tree_root *root, unsigned long index,
 
        return 0;
 }
-EXPORT_SYMBOL(__radix_tree_insert);
+EXPORT_SYMBOL(radix_tree_insert);
 
 /**
  *     __radix_tree_lookup     -       lookup an item in a radix tree
@@ -1023,7 +763,7 @@ EXPORT_SYMBOL(__radix_tree_insert);
  *     tree @root.
  *
  *     Until there is more than one item in the tree, no nodes are
- *     allocated and @root->rnode is used as a direct slot instead of
+ *     allocated and @root->xa_head is used as a direct slot instead of
  *     pointing to a node, in which case *@nodep will be NULL.
  */
 void *__radix_tree_lookup(const struct radix_tree_root *root,
@@ -1036,7 +776,7 @@ void *__radix_tree_lookup(const struct radix_tree_root *root,
 
  restart:
        parent = NULL;
-       slot = (void __rcu **)&root->rnode;
+       slot = (void __rcu **)&root->xa_head;
        radix_tree_load_root(root, &node, &maxindex);
        if (index > maxindex)
                return NULL;
@@ -1049,6 +789,8 @@ void *__radix_tree_lookup(const struct radix_tree_root *root,
                parent = entry_to_node(node);
                offset = radix_tree_descend(parent, &node, index);
                slot = parent->slots + offset;
+               if (parent->shift == 0)
+                       break;
        }
 
        if (nodep)
@@ -1100,36 +842,12 @@ void *radix_tree_lookup(const struct radix_tree_root *root, unsigned long index)
 }
 EXPORT_SYMBOL(radix_tree_lookup);
 
-static inline void replace_sibling_entries(struct radix_tree_node *node,
-                               void __rcu **slot, int count, int exceptional)
-{
-#ifdef CONFIG_RADIX_TREE_MULTIORDER
-       void *ptr = node_to_entry(slot);
-       unsigned offset = get_slot_offset(node, slot) + 1;
-
-       while (offset < RADIX_TREE_MAP_SIZE) {
-               if (rcu_dereference_raw(node->slots[offset]) != ptr)
-                       break;
-               if (count < 0) {
-                       node->slots[offset] = NULL;
-                       node->count--;
-               }
-               node->exceptional += exceptional;
-               offset++;
-       }
-#endif
-}
-
 static void replace_slot(void __rcu **slot, void *item,
-               struct radix_tree_node *node, int count, int exceptional)
+               struct radix_tree_node *node, int count, int values)
 {
-       if (WARN_ON_ONCE(radix_tree_is_internal_node(item)))
-               return;
-
-       if (node && (count || exceptional)) {
+       if (node && (count || values)) {
                node->count += count;
-               node->exceptional += exceptional;
-               replace_sibling_entries(node, slot, count, exceptional);
+               node->nr_values += values;
        }
 
        rcu_assign_pointer(*slot, item);
@@ -1172,37 +890,31 @@ static int calculate_count(struct radix_tree_root *root,
  * @node:              pointer to tree node
  * @slot:              pointer to slot in @node
  * @item:              new item to store in the slot.
- * @update_node:       callback for changing leaf nodes
  *
  * For use with __radix_tree_lookup().  Caller must hold tree write locked
  * across slot lookup and replacement.
  */
 void __radix_tree_replace(struct radix_tree_root *root,
                          struct radix_tree_node *node,
-                         void __rcu **slot, void *item,
-                         radix_tree_update_node_t update_node)
+                         void __rcu **slot, void *item)
 {
        void *old = rcu_dereference_raw(*slot);
-       int exceptional = !!radix_tree_exceptional_entry(item) -
-                               !!radix_tree_exceptional_entry(old);
+       int values = !!xa_is_value(item) - !!xa_is_value(old);
        int count = calculate_count(root, node, slot, item, old);
 
        /*
-        * This function supports replacing exceptional entries and
+        * This function supports replacing value entries and
         * deleting entries, but that needs accounting against the
-        * node unless the slot is root->rnode.
+        * node unless the slot is root->xa_head.
         */
-       WARN_ON_ONCE(!node && (slot != (void __rcu **)&root->rnode) &&
-                       (count || exceptional));
-       replace_slot(slot, item, node, count, exceptional);
+       WARN_ON_ONCE(!node && (slot != (void __rcu **)&root->xa_head) &&
+                       (count || values));
+       replace_slot(slot, item, node, count, values);
 
        if (!node)
                return;
 
-       if (update_node)
-               update_node(node);
-
-       delete_node(root, node, update_node);
+       delete_node(root, node);
 }
 
 /**
@@ -1211,12 +923,12 @@ void __radix_tree_replace(struct radix_tree_root *root,
  * @slot:      pointer to slot
  * @item:      new item to store in the slot.
  *
- * For use with radix_tree_lookup_slot(), radix_tree_gang_lookup_slot(),
+ * For use with radix_tree_lookup_slot() and
  * radix_tree_gang_lookup_tag_slot().  Caller must hold tree write locked
  * across slot lookup and replacement.
  *
  * NOTE: This cannot be used to switch between non-entries (empty slots),
- * regular entries, and exceptional entries, as that requires accounting
+ * regular entries, and value entries, as that requires accounting
  * inside the radix tree node. When switching from one type of entry or
  * deleting, use __radix_tree_lookup() and __radix_tree_replace() or
  * radix_tree_iter_replace().
@@ -1224,7 +936,7 @@ void __radix_tree_replace(struct radix_tree_root *root,
 void radix_tree_replace_slot(struct radix_tree_root *root,
                             void __rcu **slot, void *item)
 {
-       __radix_tree_replace(root, NULL, slot, item, NULL);
+       __radix_tree_replace(root, NULL, slot, item);
 }
 EXPORT_SYMBOL(radix_tree_replace_slot);
 
@@ -1234,162 +946,16 @@ EXPORT_SYMBOL(radix_tree_replace_slot);
  * @slot:      pointer to slot
  * @item:      new item to store in the slot.
  *
- * For use with radix_tree_split() and radix_tree_for_each_slot().
- * Caller must hold tree write locked across split and replacement.
+ * For use with radix_tree_for_each_slot().
+ * Caller must hold tree write locked.
  */
 void radix_tree_iter_replace(struct radix_tree_root *root,
                                const struct radix_tree_iter *iter,
                                void __rcu **slot, void *item)
 {
-       __radix_tree_replace(root, iter->node, slot, item, NULL);
+       __radix_tree_replace(root, iter->node, slot, item);
 }
 
-#ifdef CONFIG_RADIX_TREE_MULTIORDER
-/**
- * radix_tree_join - replace multiple entries with one multiorder entry
- * @root: radix tree root
- * @index: an index inside the new entry
- * @order: order of the new entry
- * @item: new entry
- *
- * Call this function to replace several entries with one larger entry.
- * The existing entries are presumed to not need freeing as a result of
- * this call.
- *
- * The replacement entry will have all the tags set on it that were set
- * on any of the entries it is replacing.
- */
-int radix_tree_join(struct radix_tree_root *root, unsigned long index,
-                       unsigned order, void *item)
-{
-       struct radix_tree_node *node;
-       void __rcu **slot;
-       int error;
-
-       BUG_ON(radix_tree_is_internal_node(item));
-
-       error = __radix_tree_create(root, index, order, &node, &slot);
-       if (!error)
-               error = insert_entries(node, slot, item, order, true);
-       if (error > 0)
-               error = 0;
-
-       return error;
-}
-
-/**
- * radix_tree_split - Split an entry into smaller entries
- * @root: radix tree root
- * @index: An index within the large entry
- * @order: Order of new entries
- *
- * Call this function as the first step in replacing a multiorder entry
- * with several entries of lower order.  After this function returns,
- * loop over the relevant portion of the tree using radix_tree_for_each_slot()
- * and call radix_tree_iter_replace() to set up each new entry.
- *
- * The tags from this entry are replicated to all the new entries.
- *
- * The radix tree should be locked against modification during the entire
- * replacement operation.  Lock-free lookups will see RADIX_TREE_RETRY which
- * should prompt RCU walkers to restart the lookup from the root.
- */
-int radix_tree_split(struct radix_tree_root *root, unsigned long index,
-                               unsigned order)
-{
-       struct radix_tree_node *parent, *node, *child;
-       void __rcu **slot;
-       unsigned int offset, end;
-       unsigned n, tag, tags = 0;
-       gfp_t gfp = root_gfp_mask(root);
-
-       if (!__radix_tree_lookup(root, index, &parent, &slot))
-               return -ENOENT;
-       if (!parent)
-               return -ENOENT;
-
-       offset = get_slot_offset(parent, slot);
-
-       for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++)
-               if (tag_get(parent, tag, offset))
-                       tags |= 1 << tag;
-
-       for (end = offset + 1; end < RADIX_TREE_MAP_SIZE; end++) {
-               if (!is_sibling_entry(parent,
-                               rcu_dereference_raw(parent->slots[end])))
-                       break;
-               for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++)
-                       if (tags & (1 << tag))
-                               tag_set(parent, tag, end);
-               /* rcu_assign_pointer ensures tags are set before RETRY */
-               rcu_assign_pointer(parent->slots[end], RADIX_TREE_RETRY);
-       }
-       rcu_assign_pointer(parent->slots[offset], RADIX_TREE_RETRY);
-       parent->exceptional -= (end - offset);
-
-       if (order == parent->shift)
-               return 0;
-       if (order > parent->shift) {
-               while (offset < end)
-                       offset += insert_entries(parent, &parent->slots[offset],
-                                       RADIX_TREE_RETRY, order, true);
-               return 0;
-       }
-
-       node = parent;
-
-       for (;;) {
-               if (node->shift > order) {
-                       child = radix_tree_node_alloc(gfp, node, root,
-                                       node->shift - RADIX_TREE_MAP_SHIFT,
-                                       offset, 0, 0);
-                       if (!child)
-                               goto nomem;
-                       if (node != parent) {
-                               node->count++;
-                               rcu_assign_pointer(node->slots[offset],
-                                                       node_to_entry(child));
-                               for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++)
-                                       if (tags & (1 << tag))
-                                               tag_set(node, tag, offset);
-                       }
-
-                       node = child;
-                       offset = 0;
-                       continue;
-               }
-
-               n = insert_entries(node, &node->slots[offset],
-                                       RADIX_TREE_RETRY, order, false);
-               BUG_ON(n > RADIX_TREE_MAP_SIZE);
-
-               for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++)
-                       if (tags & (1 << tag))
-                               tag_set(node, tag, offset);
-               offset += n;
-
-               while (offset == RADIX_TREE_MAP_SIZE) {
-                       if (node == parent)
-                               break;
-                       offset = node->offset;
-                       child = node;
-                       node = node->parent;
-                       rcu_assign_pointer(node->slots[offset],
-                                               node_to_entry(child));
-                       offset++;
-               }
-               if ((node == parent) && (offset == end))
-                       return 0;
-       }
-
- nomem:
-       /* Shouldn't happen; did user forget to preload? */
-       /* TODO: free all the allocated nodes */
-       WARN_ON(1);
-       return -ENOMEM;
-}
-#endif
-
 static void node_tag_set(struct radix_tree_root *root,
                                struct radix_tree_node *node,
                                unsigned int tag, unsigned int offset)
@@ -1447,18 +1013,6 @@ void *radix_tree_tag_set(struct radix_tree_root *root,
 }
 EXPORT_SYMBOL(radix_tree_tag_set);
 
-/**
- * radix_tree_iter_tag_set - set a tag on the current iterator entry
- * @root:      radix tree root
- * @iter:      iterator state
- * @tag:       tag to set
- */
-void radix_tree_iter_tag_set(struct radix_tree_root *root,
-                       const struct radix_tree_iter *iter, unsigned int tag)
-{
-       node_tag_set(root, iter->node, tag, iter_offset(iter));
-}
-
 static void node_tag_clear(struct radix_tree_root *root,
                                struct radix_tree_node *node,
                                unsigned int tag, unsigned int offset)
@@ -1574,14 +1128,6 @@ int radix_tree_tag_get(const struct radix_tree_root *root,
 }
 EXPORT_SYMBOL(radix_tree_tag_get);
 
-static inline void __set_iter_shift(struct radix_tree_iter *iter,
-                                       unsigned int shift)
-{
-#ifdef CONFIG_RADIX_TREE_MULTIORDER
-       iter->shift = shift;
-#endif
-}
-
 /* Construct iter->tags bit-mask from node->tags[tag] array */
 static void set_iter_tags(struct radix_tree_iter *iter,
                                struct radix_tree_node *node, unsigned offset,
@@ -1608,92 +1154,11 @@ static void set_iter_tags(struct radix_tree_iter *iter,
        }
 }
 
-#ifdef CONFIG_RADIX_TREE_MULTIORDER
-static void __rcu **skip_siblings(struct radix_tree_node **nodep,
-                       void __rcu **slot, struct radix_tree_iter *iter)
-{
-       while (iter->index < iter->next_index) {
-               *nodep = rcu_dereference_raw(*slot);
-               if (*nodep && !is_sibling_entry(iter->node, *nodep))
-                       return slot;
-               slot++;
-               iter->index = __radix_tree_iter_add(iter, 1);
-               iter->tags >>= 1;
-       }
-
-       *nodep = NULL;
-       return NULL;
-}
-
-void __rcu **__radix_tree_next_slot(void __rcu **slot,
-                               struct radix_tree_iter *iter, unsigned flags)
-{
-       unsigned tag = flags & RADIX_TREE_ITER_TAG_MASK;
-       struct radix_tree_node *node;
-
-       slot = skip_siblings(&node, slot, iter);
-
-       while (radix_tree_is_internal_node(node)) {
-               unsigned offset;
-               unsigned long next_index;
-
-               if (node == RADIX_TREE_RETRY)
-                       return slot;
-               node = entry_to_node(node);
-               iter->node = node;
-               iter->shift = node->shift;
-
-               if (flags & RADIX_TREE_ITER_TAGGED) {
-                       offset = radix_tree_find_next_bit(node, tag, 0);
-                       if (offset == RADIX_TREE_MAP_SIZE)
-                               return NULL;
-                       slot = &node->slots[offset];
-                       iter->index = __radix_tree_iter_add(iter, offset);
-                       set_iter_tags(iter, node, offset, tag);
-                       node = rcu_dereference_raw(*slot);
-               } else {
-                       offset = 0;
-                       slot = &node->slots[0];
-                       for (;;) {
-                               node = rcu_dereference_raw(*slot);
-                               if (node)
-                                       break;
-                               slot++;
-                               offset++;
-                               if (offset == RADIX_TREE_MAP_SIZE)
-                                       return NULL;
-                       }
-                       iter->index = __radix_tree_iter_add(iter, offset);
-               }
-               if ((flags & RADIX_TREE_ITER_CONTIG) && (offset > 0))
-                       goto none;
-               next_index = (iter->index | shift_maxindex(iter->shift)) + 1;
-               if (next_index < iter->next_index)
-                       iter->next_index = next_index;
-       }
-
-       return slot;
- none:
-       iter->next_index = 0;
-       return NULL;
-}
-EXPORT_SYMBOL(__radix_tree_next_slot);
-#else
-static void __rcu **skip_siblings(struct radix_tree_node **nodep,
-                       void __rcu **slot, struct radix_tree_iter *iter)
-{
-       return slot;
-}
-#endif
-
 void __rcu **radix_tree_iter_resume(void __rcu **slot,
                                        struct radix_tree_iter *iter)
 {
-       struct radix_tree_node *node;
-
        slot++;
        iter->index = __radix_tree_iter_add(iter, 1);
-       skip_siblings(&node, slot, iter);
        iter->next_index = iter->index;
        iter->tags = 0;
        return NULL;
@@ -1744,8 +1209,7 @@ void __rcu **radix_tree_next_chunk(const struct radix_tree_root *root,
                iter->next_index = maxindex + 1;
                iter->tags = 1;
                iter->node = NULL;
-               __set_iter_shift(iter, 0);
-               return (void __rcu **)&root->rnode;
+               return (void __rcu **)&root->xa_head;
        }
 
        do {
@@ -1765,8 +1229,6 @@ void __rcu **radix_tree_next_chunk(const struct radix_tree_root *root,
                                while (++offset < RADIX_TREE_MAP_SIZE) {
                                        void *slot = rcu_dereference_raw(
                                                        node->slots[offset]);
-                                       if (is_sibling_entry(node, slot))
-                                               continue;
                                        if (slot)
                                                break;
                                }
@@ -1784,13 +1246,12 @@ void __rcu **radix_tree_next_chunk(const struct radix_tree_root *root,
                        goto restart;
                if (child == RADIX_TREE_RETRY)
                        break;
-       } while (radix_tree_is_internal_node(child));
+       } while (node->shift && radix_tree_is_internal_node(child));
 
        /* Update the iterator state */
-       iter->index = (index &~ node_maxindex(node)) | (offset << node->shift);
+       iter->index = (index &~ node_maxindex(node)) | offset;
        iter->next_index = (index | node_maxindex(node)) + 1;
        iter->node = node;
-       __set_iter_shift(iter, node->shift);
 
        if (flags & RADIX_TREE_ITER_TAGGED)
                set_iter_tags(iter, node, offset, tag);
@@ -1846,48 +1307,6 @@ radix_tree_gang_lookup(const struct radix_tree_root *root, void **results,
 }
 EXPORT_SYMBOL(radix_tree_gang_lookup);
 
-/**
- *     radix_tree_gang_lookup_slot - perform multiple slot lookup on radix tree
- *     @root:          radix tree root
- *     @results:       where the results of the lookup are placed
- *     @indices:       where their indices should be placed (but usually NULL)
- *     @first_index:   start the lookup from this key
- *     @max_items:     place up to this many items at *results
- *
- *     Performs an index-ascending scan of the tree for present items.  Places
- *     their slots at *@results and returns the number of items which were
- *     placed at *@results.
- *
- *     The implementation is naive.
- *
- *     Like radix_tree_gang_lookup as far as RCU and locking goes. Slots must
- *     be dereferenced with radix_tree_deref_slot, and if using only RCU
- *     protection, radix_tree_deref_slot may fail requiring a retry.
- */
-unsigned int
-radix_tree_gang_lookup_slot(const struct radix_tree_root *root,
-                       void __rcu ***results, unsigned long *indices,
-                       unsigned long first_index, unsigned int max_items)
-{
-       struct radix_tree_iter iter;
-       void __rcu **slot;
-       unsigned int ret = 0;
-
-       if (unlikely(!max_items))
-               return 0;
-
-       radix_tree_for_each_slot(slot, root, &iter, first_index) {
-               results[ret] = slot;
-               if (indices)
-                       indices[ret] = iter.index;
-               if (++ret == max_items)
-                       break;
-       }
-
-       return ret;
-}
-EXPORT_SYMBOL(radix_tree_gang_lookup_slot);
-
 /**
  *     radix_tree_gang_lookup_tag - perform multiple lookup on a radix tree
  *                                  based on a tag
@@ -1964,28 +1383,11 @@ radix_tree_gang_lookup_tag_slot(const struct radix_tree_root *root,
 }
 EXPORT_SYMBOL(radix_tree_gang_lookup_tag_slot);
 
-/**
- *     __radix_tree_delete_node    -    try to free node after clearing a slot
- *     @root:          radix tree root
- *     @node:          node containing @index
- *     @update_node:   callback for changing leaf nodes
- *
- *     After clearing the slot at @index in @node from radix tree
- *     rooted at @root, call this function to attempt freeing the
- *     node and shrinking the tree.
- */
-void __radix_tree_delete_node(struct radix_tree_root *root,
-                             struct radix_tree_node *node,
-                             radix_tree_update_node_t update_node)
-{
-       delete_node(root, node, update_node);
-}
-
 static bool __radix_tree_delete(struct radix_tree_root *root,
                                struct radix_tree_node *node, void __rcu **slot)
 {
        void *old = rcu_dereference_raw(*slot);
-       int exceptional = radix_tree_exceptional_entry(old) ? -1 : 0;
+       int values = xa_is_value(old) ? -1 : 0;
        unsigned offset = get_slot_offset(node, slot);
        int tag;
 
@@ -1995,8 +1397,8 @@ static bool __radix_tree_delete(struct radix_tree_root *root,
                for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++)
                        node_tag_clear(root, node, tag, offset);
 
-       replace_slot(slot, NULL, node, -1, exceptional);
-       return node && delete_node(root, node, NULL);
+       replace_slot(slot, NULL, node, -1, values);
+       return node && delete_node(root, node);
 }
 
 /**
@@ -2068,19 +1470,6 @@ void *radix_tree_delete(struct radix_tree_root *root, unsigned long index)
 }
 EXPORT_SYMBOL(radix_tree_delete);
 
-void radix_tree_clear_tags(struct radix_tree_root *root,
-                          struct radix_tree_node *node,
-                          void __rcu **slot)
-{
-       if (node) {
-               unsigned int tag, offset = get_slot_offset(node, slot);
-               for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++)
-                       node_tag_clear(root, node, tag, offset);
-       } else {
-               root_tag_clear_all(root);
-       }
-}
-
 /**
  *     radix_tree_tagged - test whether any items in the tree are tagged
  *     @root:          radix tree root
@@ -2106,33 +1495,12 @@ void idr_preload(gfp_t gfp_mask)
 }
 EXPORT_SYMBOL(idr_preload);
 
-int ida_pre_get(struct ida *ida, gfp_t gfp)
-{
-       /*
-        * The IDA API has no preload_end() equivalent.  Instead,
-        * ida_get_new() can return -EAGAIN, prompting the caller
-        * to return to the ida_pre_get() step.
-        */
-       if (!__radix_tree_preload(gfp, IDA_PRELOAD_SIZE))
-               preempt_enable();
-
-       if (!this_cpu_read(ida_bitmap)) {
-               struct ida_bitmap *bitmap = kzalloc(sizeof(*bitmap), gfp);
-               if (!bitmap)
-                       return 0;
-               if (this_cpu_cmpxchg(ida_bitmap, NULL, bitmap))
-                       kfree(bitmap);
-       }
-
-       return 1;
-}
-
 void __rcu **idr_get_free(struct radix_tree_root *root,
                              struct radix_tree_iter *iter, gfp_t gfp,
                              unsigned long max)
 {
        struct radix_tree_node *node = NULL, *child;
-       void __rcu **slot = (void __rcu **)&root->rnode;
+       void __rcu **slot = (void __rcu **)&root->xa_head;
        unsigned long maxindex, start = iter->next_index;
        unsigned int shift, offset = 0;
 
@@ -2148,8 +1516,10 @@ void __rcu **idr_get_free(struct radix_tree_root *root,
                if (error < 0)
                        return ERR_PTR(error);
                shift = error;
-               child = rcu_dereference_raw(root->rnode);
+               child = rcu_dereference_raw(root->xa_head);
        }
+       if (start == 0 && shift == 0)
+               shift = RADIX_TREE_MAP_SHIFT;
 
        while (shift) {
                shift -= RADIX_TREE_MAP_SHIFT;
@@ -2192,7 +1562,6 @@ void __rcu **idr_get_free(struct radix_tree_root *root,
        else
                iter->next_index = 1;
        iter->node = node;
-       __set_iter_shift(iter, shift);
        set_iter_tags(iter, node, offset, IDR_FREE);
 
        return slot;
@@ -2211,10 +1580,10 @@ void __rcu **idr_get_free(struct radix_tree_root *root,
  */
 void idr_destroy(struct idr *idr)
 {
-       struct radix_tree_node *node = rcu_dereference_raw(idr->idr_rt.rnode);
+       struct radix_tree_node *node = rcu_dereference_raw(idr->idr_rt.xa_head);
        if (radix_tree_is_internal_node(node))
                radix_tree_free_nodes(node);
-       idr->idr_rt.rnode = NULL;
+       idr->idr_rt.xa_head = NULL;
        root_tag_set(&idr->idr_rt, IDR_FREE);
 }
 EXPORT_SYMBOL(idr_destroy);
@@ -2228,31 +1597,6 @@ radix_tree_node_ctor(void *arg)
        INIT_LIST_HEAD(&node->private_list);
 }
 
-static __init unsigned long __maxindex(unsigned int height)
-{
-       unsigned int width = height * RADIX_TREE_MAP_SHIFT;
-       int shift = RADIX_TREE_INDEX_BITS - width;
-
-       if (shift < 0)
-               return ~0UL;
-       if (shift >= BITS_PER_LONG)
-               return 0UL;
-       return ~0UL >> shift;
-}
-
-static __init void radix_tree_init_maxnodes(void)
-{
-       unsigned long height_to_maxindex[RADIX_TREE_MAX_PATH + 1];
-       unsigned int i, j;
-
-       for (i = 0; i < ARRAY_SIZE(height_to_maxindex); i++)
-               height_to_maxindex[i] = __maxindex(i);
-       for (i = 0; i < ARRAY_SIZE(height_to_maxnodes); i++) {
-               for (j = i; j > 0; j--)
-                       height_to_maxnodes[i] += height_to_maxindex[j - 1] + 1;
-       }
-}
-
 static int radix_tree_cpu_dead(unsigned int cpu)
 {
        struct radix_tree_preload *rtp;
@@ -2266,8 +1610,6 @@ static int radix_tree_cpu_dead(unsigned int cpu)
                kmem_cache_free(radix_tree_node_cachep, node);
                rtp->nr--;
        }
-       kfree(per_cpu(ida_bitmap, cpu));
-       per_cpu(ida_bitmap, cpu) = NULL;
        return 0;
 }
 
@@ -2277,11 +1619,11 @@ void __init radix_tree_init(void)
 
        BUILD_BUG_ON(RADIX_TREE_MAX_TAGS + __GFP_BITS_SHIFT > 32);
        BUILD_BUG_ON(ROOT_IS_IDR & ~GFP_ZONEMASK);
+       BUILD_BUG_ON(XA_CHUNK_SIZE > 255);
        radix_tree_node_cachep = kmem_cache_create("radix_tree_node",
                        sizeof(struct radix_tree_node), 0,
                        SLAB_PANIC | SLAB_RECLAIM_ACCOUNT,
                        radix_tree_node_ctor);
-       radix_tree_init_maxnodes();
        ret = cpuhp_setup_state_nocalls(CPUHP_RADIX_DEAD, "lib/radix:dead",
                                        NULL, radix_tree_cpu_dead);
        WARN_ON(ret < 0);