|
@@ -124,7 +124,7 @@ static unsigned int radix_tree_descend(const struct radix_tree_node *parent,
|
|
|
|
|
|
static inline gfp_t root_gfp_mask(const struct radix_tree_root *root)
|
|
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,
|
|
static inline void tag_set(struct radix_tree_node *node, unsigned int tag,
|
|
@@ -147,32 +147,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)
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
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);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -291,12 +291,12 @@ static void dump_node(struct radix_tree_node *node, unsigned long index)
|
|
/* For debug */
|
|
/* For debug */
|
|
static void radix_tree_dump(struct radix_tree_root *root)
|
|
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))
|
|
|
|
|
|
+ pr_debug("radix root: %p xa_head %p tags %x\n",
|
|
|
|
+ root, root->xa_head,
|
|
|
|
+ root->xa_flags >> ROOT_TAG_SHIFT);
|
|
|
|
+ if (!radix_tree_is_internal_node(root->xa_head))
|
|
return;
|
|
return;
|
|
- dump_node(entry_to_node(root->rnode), 0);
|
|
|
|
|
|
+ dump_node(entry_to_node(root->xa_head), 0);
|
|
}
|
|
}
|
|
|
|
|
|
static void dump_ida_node(void *entry, unsigned long index)
|
|
static void dump_ida_node(void *entry, unsigned long index)
|
|
@@ -340,9 +340,9 @@ static void dump_ida_node(void *entry, unsigned long index)
|
|
static void ida_dump(struct ida *ida)
|
|
static void ida_dump(struct ida *ida)
|
|
{
|
|
{
|
|
struct radix_tree_root *root = &ida->ida_rt;
|
|
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);
|
|
|
|
|
|
+ pr_debug("ida: %p node %p free %d\n", ida, root->xa_head,
|
|
|
|
+ root->xa_flags >> ROOT_TAG_SHIFT);
|
|
|
|
+ dump_ida_node(root->xa_head, 0);
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
@@ -576,7 +576,7 @@ int radix_tree_maybe_preload_order(gfp_t gfp_mask, int order)
|
|
static unsigned radix_tree_load_root(const struct radix_tree_root *root,
|
|
static unsigned radix_tree_load_root(const struct radix_tree_root *root,
|
|
struct radix_tree_node **nodep, unsigned long *maxindex)
|
|
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;
|
|
*nodep = node;
|
|
|
|
|
|
@@ -605,7 +605,7 @@ static int radix_tree_extend(struct radix_tree_root *root, gfp_t gfp,
|
|
while (index > shift_maxindex(maxshift))
|
|
while (index > shift_maxindex(maxshift))
|
|
maxshift += RADIX_TREE_MAP_SHIFT;
|
|
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)))
|
|
if (!entry && (!is_idr(root) || root_tag_get(root, IDR_FREE)))
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
@@ -633,7 +633,7 @@ static int radix_tree_extend(struct radix_tree_root *root, gfp_t gfp,
|
|
if (radix_tree_is_internal_node(entry)) {
|
|
if (radix_tree_is_internal_node(entry)) {
|
|
entry_to_node(entry)->parent = node;
|
|
entry_to_node(entry)->parent = node;
|
|
} else if (xa_is_value(entry)) {
|
|
} else if (xa_is_value(entry)) {
|
|
- /* Moving an exceptional root->rnode to a node */
|
|
|
|
|
|
+ /* Moving an exceptional root->xa_head to a node */
|
|
node->exceptional = 1;
|
|
node->exceptional = 1;
|
|
}
|
|
}
|
|
/*
|
|
/*
|
|
@@ -642,7 +642,7 @@ static int radix_tree_extend(struct radix_tree_root *root, gfp_t gfp,
|
|
*/
|
|
*/
|
|
node->slots[0] = (void __rcu *)entry;
|
|
node->slots[0] = (void __rcu *)entry;
|
|
entry = node_to_entry(node);
|
|
entry = node_to_entry(node);
|
|
- rcu_assign_pointer(root->rnode, entry);
|
|
|
|
|
|
+ rcu_assign_pointer(root->xa_head, entry);
|
|
shift += RADIX_TREE_MAP_SHIFT;
|
|
shift += RADIX_TREE_MAP_SHIFT;
|
|
} while (shift <= maxshift);
|
|
} while (shift <= maxshift);
|
|
out:
|
|
out:
|
|
@@ -659,7 +659,7 @@ static inline bool radix_tree_shrink(struct radix_tree_root *root,
|
|
bool shrunk = false;
|
|
bool shrunk = false;
|
|
|
|
|
|
for (;;) {
|
|
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;
|
|
struct radix_tree_node *child;
|
|
|
|
|
|
if (!radix_tree_is_internal_node(node))
|
|
if (!radix_tree_is_internal_node(node))
|
|
@@ -695,9 +695,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
|
|
* moving the node from one part of the tree to another: if it
|
|
* was safe to dereference the old pointer to it
|
|
* was safe to dereference the old pointer to it
|
|
* (node->slots[0]), it will be safe to dereference the new
|
|
* (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))
|
|
if (is_idr(root) && !tag_get(node, IDR_FREE, 0))
|
|
root_tag_clear(root, IDR_FREE);
|
|
root_tag_clear(root, IDR_FREE);
|
|
|
|
|
|
@@ -745,9 +745,8 @@ static bool delete_node(struct radix_tree_root *root,
|
|
|
|
|
|
if (node->count) {
|
|
if (node->count) {
|
|
if (node_to_entry(node) ==
|
|
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, update_node);
|
|
return deleted;
|
|
return deleted;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -762,7 +761,7 @@ static bool delete_node(struct radix_tree_root *root,
|
|
*/
|
|
*/
|
|
if (!is_idr(root))
|
|
if (!is_idr(root))
|
|
root_tag_clear_all(root);
|
|
root_tag_clear_all(root);
|
|
- root->rnode = NULL;
|
|
|
|
|
|
+ root->xa_head = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
WARN_ON_ONCE(!list_empty(&node->private_list));
|
|
WARN_ON_ONCE(!list_empty(&node->private_list));
|
|
@@ -787,7 +786,7 @@ static bool delete_node(struct radix_tree_root *root,
|
|
* at position @index in the radix tree @root.
|
|
* at position @index in the radix tree @root.
|
|
*
|
|
*
|
|
* Until there is more than one item in the tree, no nodes are
|
|
* 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.
|
|
* pointing to a node, in which case *@nodep will be NULL.
|
|
*
|
|
*
|
|
* Returns -ENOMEM, or 0 for success.
|
|
* Returns -ENOMEM, or 0 for success.
|
|
@@ -797,7 +796,7 @@ int __radix_tree_create(struct radix_tree_root *root, unsigned long index,
|
|
void __rcu ***slotp)
|
|
void __rcu ***slotp)
|
|
{
|
|
{
|
|
struct radix_tree_node *node = NULL, *child;
|
|
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 long maxindex;
|
|
unsigned int shift, offset = 0;
|
|
unsigned int shift, offset = 0;
|
|
unsigned long max = index | ((1UL << order) - 1);
|
|
unsigned long max = index | ((1UL << order) - 1);
|
|
@@ -813,7 +812,7 @@ int __radix_tree_create(struct radix_tree_root *root, unsigned long index,
|
|
if (error < 0)
|
|
if (error < 0)
|
|
return error;
|
|
return error;
|
|
shift = error;
|
|
shift = error;
|
|
- child = rcu_dereference_raw(root->rnode);
|
|
|
|
|
|
+ child = rcu_dereference_raw(root->xa_head);
|
|
}
|
|
}
|
|
|
|
|
|
while (shift > order) {
|
|
while (shift > order) {
|
|
@@ -1004,7 +1003,7 @@ EXPORT_SYMBOL(__radix_tree_insert);
|
|
* tree @root.
|
|
* tree @root.
|
|
*
|
|
*
|
|
* Until there is more than one item in the tree, no nodes are
|
|
* 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.
|
|
* pointing to a node, in which case *@nodep will be NULL.
|
|
*/
|
|
*/
|
|
void *__radix_tree_lookup(const struct radix_tree_root *root,
|
|
void *__radix_tree_lookup(const struct radix_tree_root *root,
|
|
@@ -1017,7 +1016,7 @@ void *__radix_tree_lookup(const struct radix_tree_root *root,
|
|
|
|
|
|
restart:
|
|
restart:
|
|
parent = NULL;
|
|
parent = NULL;
|
|
- slot = (void __rcu **)&root->rnode;
|
|
|
|
|
|
+ slot = (void __rcu **)&root->xa_head;
|
|
radix_tree_load_root(root, &node, &maxindex);
|
|
radix_tree_load_root(root, &node, &maxindex);
|
|
if (index > maxindex)
|
|
if (index > maxindex)
|
|
return NULL;
|
|
return NULL;
|
|
@@ -1168,9 +1167,9 @@ void __radix_tree_replace(struct radix_tree_root *root,
|
|
/*
|
|
/*
|
|
* This function supports replacing exceptional entries and
|
|
* This function supports replacing exceptional entries and
|
|
* deleting entries, but that needs accounting against the
|
|
* 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) &&
|
|
|
|
|
|
+ WARN_ON_ONCE(!node && (slot != (void __rcu **)&root->xa_head) &&
|
|
(count || exceptional));
|
|
(count || exceptional));
|
|
replace_slot(slot, item, node, count, exceptional);
|
|
replace_slot(slot, item, node, count, exceptional);
|
|
|
|
|
|
@@ -1722,7 +1721,7 @@ void __rcu **radix_tree_next_chunk(const struct radix_tree_root *root,
|
|
iter->tags = 1;
|
|
iter->tags = 1;
|
|
iter->node = NULL;
|
|
iter->node = NULL;
|
|
__set_iter_shift(iter, 0);
|
|
__set_iter_shift(iter, 0);
|
|
- return (void __rcu **)&root->rnode;
|
|
|
|
|
|
+ return (void __rcu **)&root->xa_head;
|
|
}
|
|
}
|
|
|
|
|
|
do {
|
|
do {
|
|
@@ -2109,7 +2108,7 @@ void __rcu **idr_get_free(struct radix_tree_root *root,
|
|
unsigned long max)
|
|
unsigned long max)
|
|
{
|
|
{
|
|
struct radix_tree_node *node = NULL, *child;
|
|
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 long maxindex, start = iter->next_index;
|
|
unsigned int shift, offset = 0;
|
|
unsigned int shift, offset = 0;
|
|
|
|
|
|
@@ -2125,7 +2124,7 @@ void __rcu **idr_get_free(struct radix_tree_root *root,
|
|
if (error < 0)
|
|
if (error < 0)
|
|
return ERR_PTR(error);
|
|
return ERR_PTR(error);
|
|
shift = error;
|
|
shift = error;
|
|
- child = rcu_dereference_raw(root->rnode);
|
|
|
|
|
|
+ child = rcu_dereference_raw(root->xa_head);
|
|
}
|
|
}
|
|
if (start == 0 && shift == 0)
|
|
if (start == 0 && shift == 0)
|
|
shift = RADIX_TREE_MAP_SHIFT;
|
|
shift = RADIX_TREE_MAP_SHIFT;
|
|
@@ -2190,10 +2189,10 @@ void __rcu **idr_get_free(struct radix_tree_root *root,
|
|
*/
|
|
*/
|
|
void idr_destroy(struct idr *idr)
|
|
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))
|
|
if (radix_tree_is_internal_node(node))
|
|
radix_tree_free_nodes(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);
|
|
root_tag_set(&idr->idr_rt, IDR_FREE);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(idr_destroy);
|
|
EXPORT_SYMBOL(idr_destroy);
|