diff options
author | Matthew Wilcox <willy@linux.intel.com> | 2016-05-20 20:03:27 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-20 20:58:30 -0400 |
commit | 4dd6c0987ca43d6544f4f0a3f86f6ea3bfc60fc1 (patch) | |
tree | eae410dd9f1b23d16b2cd646065f93653bb48b5e /lib | |
parent | a4db4dcea1b3990e8c5dc8a03d11f36a3c0c6d8b (diff) |
radix-tree: rename indirect_to_ptr() to entry_to_node()
Mirrors the earlier commit introducing node_to_entry().
Also change the type returned to be a struct radix_tree_node pointer.
That lets us simplify a couple of places in the radix tree shrink &
extend paths where we could convert an entry into a pointer, modify the
node, then convert the pointer back into an entry.
Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
Cc: Konstantin Khlebnikov <koct9i@gmail.com>
Cc: Kirill Shutemov <kirill.shutemov@linux.intel.com>
Cc: Jan Kara <jack@suse.com>
Cc: Neil Brown <neilb@suse.de>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/radix-tree.c | 48 |
1 files changed, 21 insertions, 27 deletions
diff --git a/lib/radix-tree.c b/lib/radix-tree.c index f66bb3932452..3c3fdd9c5bb3 100644 --- a/lib/radix-tree.c +++ b/lib/radix-tree.c | |||
@@ -230,13 +230,13 @@ static void dump_node(struct radix_tree_node *node, unsigned long index) | |||
230 | if (is_sibling_entry(node, entry)) { | 230 | if (is_sibling_entry(node, entry)) { |
231 | pr_debug("radix sblng %p offset %ld val %p indices %ld-%ld\n", | 231 | pr_debug("radix sblng %p offset %ld val %p indices %ld-%ld\n", |
232 | entry, i, | 232 | entry, i, |
233 | *(void **)indirect_to_ptr(entry), | 233 | *(void **)entry_to_node(entry), |
234 | first, last); | 234 | first, last); |
235 | } else if (!radix_tree_is_indirect_ptr(entry)) { | 235 | } else if (!radix_tree_is_indirect_ptr(entry)) { |
236 | pr_debug("radix entry %p offset %ld indices %ld-%ld\n", | 236 | pr_debug("radix entry %p offset %ld indices %ld-%ld\n", |
237 | entry, i, first, last); | 237 | entry, i, first, last); |
238 | } else { | 238 | } else { |
239 | dump_node(indirect_to_ptr(entry), first); | 239 | dump_node(entry_to_node(entry), first); |
240 | } | 240 | } |
241 | } | 241 | } |
242 | } | 242 | } |
@@ -249,7 +249,7 @@ static void radix_tree_dump(struct radix_tree_root *root) | |||
249 | root->gfp_mask >> __GFP_BITS_SHIFT); | 249 | root->gfp_mask >> __GFP_BITS_SHIFT); |
250 | if (!radix_tree_is_indirect_ptr(root->rnode)) | 250 | if (!radix_tree_is_indirect_ptr(root->rnode)) |
251 | return; | 251 | return; |
252 | dump_node(indirect_to_ptr(root->rnode), 0); | 252 | dump_node(entry_to_node(root->rnode), 0); |
253 | } | 253 | } |
254 | #endif | 254 | #endif |
255 | 255 | ||
@@ -422,7 +422,7 @@ static unsigned radix_tree_load_root(struct radix_tree_root *root, | |||
422 | *nodep = node; | 422 | *nodep = node; |
423 | 423 | ||
424 | if (likely(radix_tree_is_indirect_ptr(node))) { | 424 | if (likely(radix_tree_is_indirect_ptr(node))) { |
425 | node = indirect_to_ptr(node); | 425 | node = entry_to_node(node); |
426 | *maxindex = node_maxindex(node); | 426 | *maxindex = node_maxindex(node); |
427 | return node->shift + RADIX_TREE_MAP_SHIFT; | 427 | return node->shift + RADIX_TREE_MAP_SHIFT; |
428 | } | 428 | } |
@@ -467,11 +467,8 @@ static int radix_tree_extend(struct radix_tree_root *root, | |||
467 | node->offset = 0; | 467 | node->offset = 0; |
468 | node->count = 1; | 468 | node->count = 1; |
469 | node->parent = NULL; | 469 | node->parent = NULL; |
470 | if (radix_tree_is_indirect_ptr(slot)) { | 470 | if (radix_tree_is_indirect_ptr(slot)) |
471 | slot = indirect_to_ptr(slot); | 471 | entry_to_node(slot)->parent = node; |
472 | slot->parent = node; | ||
473 | slot = node_to_entry(slot); | ||
474 | } | ||
475 | node->slots[0] = slot; | 472 | node->slots[0] = slot; |
476 | slot = node_to_entry(node); | 473 | slot = node_to_entry(node); |
477 | rcu_assign_pointer(root->rnode, slot); | 474 | rcu_assign_pointer(root->rnode, slot); |
@@ -542,7 +539,7 @@ int __radix_tree_create(struct radix_tree_root *root, unsigned long index, | |||
542 | break; | 539 | break; |
543 | 540 | ||
544 | /* Go a level down */ | 541 | /* Go a level down */ |
545 | node = indirect_to_ptr(slot); | 542 | node = entry_to_node(slot); |
546 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; | 543 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; |
547 | offset = radix_tree_descend(node, &slot, offset); | 544 | offset = radix_tree_descend(node, &slot, offset); |
548 | } | 545 | } |
@@ -645,7 +642,7 @@ void *__radix_tree_lookup(struct radix_tree_root *root, unsigned long index, | |||
645 | 642 | ||
646 | if (node == RADIX_TREE_RETRY) | 643 | if (node == RADIX_TREE_RETRY) |
647 | goto restart; | 644 | goto restart; |
648 | parent = indirect_to_ptr(node); | 645 | parent = entry_to_node(node); |
649 | shift -= RADIX_TREE_MAP_SHIFT; | 646 | shift -= RADIX_TREE_MAP_SHIFT; |
650 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; | 647 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; |
651 | offset = radix_tree_descend(parent, &node, offset); | 648 | offset = radix_tree_descend(parent, &node, offset); |
@@ -729,7 +726,7 @@ void *radix_tree_tag_set(struct radix_tree_root *root, | |||
729 | shift -= RADIX_TREE_MAP_SHIFT; | 726 | shift -= RADIX_TREE_MAP_SHIFT; |
730 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; | 727 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; |
731 | 728 | ||
732 | parent = indirect_to_ptr(node); | 729 | parent = entry_to_node(node); |
733 | offset = radix_tree_descend(parent, &node, offset); | 730 | offset = radix_tree_descend(parent, &node, offset); |
734 | BUG_ON(!node); | 731 | BUG_ON(!node); |
735 | 732 | ||
@@ -777,7 +774,7 @@ void *radix_tree_tag_clear(struct radix_tree_root *root, | |||
777 | shift -= RADIX_TREE_MAP_SHIFT; | 774 | shift -= RADIX_TREE_MAP_SHIFT; |
778 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; | 775 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; |
779 | 776 | ||
780 | parent = indirect_to_ptr(node); | 777 | parent = entry_to_node(node); |
781 | offset = radix_tree_descend(parent, &node, offset); | 778 | offset = radix_tree_descend(parent, &node, offset); |
782 | } | 779 | } |
783 | 780 | ||
@@ -844,7 +841,7 @@ int radix_tree_tag_get(struct radix_tree_root *root, | |||
844 | shift -= RADIX_TREE_MAP_SHIFT; | 841 | shift -= RADIX_TREE_MAP_SHIFT; |
845 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; | 842 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; |
846 | 843 | ||
847 | parent = indirect_to_ptr(node); | 844 | parent = entry_to_node(node); |
848 | offset = radix_tree_descend(parent, &node, offset); | 845 | offset = radix_tree_descend(parent, &node, offset); |
849 | 846 | ||
850 | if (!node) | 847 | if (!node) |
@@ -904,7 +901,7 @@ void **radix_tree_next_chunk(struct radix_tree_root *root, | |||
904 | return NULL; | 901 | return NULL; |
905 | 902 | ||
906 | if (radix_tree_is_indirect_ptr(rnode)) { | 903 | if (radix_tree_is_indirect_ptr(rnode)) { |
907 | rnode = indirect_to_ptr(rnode); | 904 | rnode = entry_to_node(rnode); |
908 | } else if (rnode) { | 905 | } else if (rnode) { |
909 | /* Single-slot tree */ | 906 | /* Single-slot tree */ |
910 | iter->index = index; | 907 | iter->index = index; |
@@ -963,7 +960,7 @@ void **radix_tree_next_chunk(struct radix_tree_root *root, | |||
963 | if (!radix_tree_is_indirect_ptr(slot)) | 960 | if (!radix_tree_is_indirect_ptr(slot)) |
964 | break; | 961 | break; |
965 | 962 | ||
966 | node = indirect_to_ptr(slot); | 963 | node = entry_to_node(slot); |
967 | shift -= RADIX_TREE_MAP_SHIFT; | 964 | shift -= RADIX_TREE_MAP_SHIFT; |
968 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; | 965 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; |
969 | } | 966 | } |
@@ -1048,7 +1045,7 @@ unsigned long radix_tree_range_tag_if_tagged(struct radix_tree_root *root, | |||
1048 | return 1; | 1045 | return 1; |
1049 | } | 1046 | } |
1050 | 1047 | ||
1051 | node = indirect_to_ptr(slot); | 1048 | node = entry_to_node(slot); |
1052 | shift -= RADIX_TREE_MAP_SHIFT; | 1049 | shift -= RADIX_TREE_MAP_SHIFT; |
1053 | 1050 | ||
1054 | for (;;) { | 1051 | for (;;) { |
@@ -1063,7 +1060,7 @@ unsigned long radix_tree_range_tag_if_tagged(struct radix_tree_root *root, | |||
1063 | goto next; | 1060 | goto next; |
1064 | /* Sibling slots never have tags set on them */ | 1061 | /* Sibling slots never have tags set on them */ |
1065 | if (radix_tree_is_indirect_ptr(slot)) { | 1062 | if (radix_tree_is_indirect_ptr(slot)) { |
1066 | node = indirect_to_ptr(slot); | 1063 | node = entry_to_node(slot); |
1067 | shift -= RADIX_TREE_MAP_SHIFT; | 1064 | shift -= RADIX_TREE_MAP_SHIFT; |
1068 | continue; | 1065 | continue; |
1069 | } | 1066 | } |
@@ -1322,7 +1319,7 @@ static unsigned long __locate(struct radix_tree_node *slot, void *item, | |||
1322 | } | 1319 | } |
1323 | continue; | 1320 | continue; |
1324 | } | 1321 | } |
1325 | node = indirect_to_ptr(node); | 1322 | node = entry_to_node(node); |
1326 | if (is_sibling_entry(slot, node)) | 1323 | if (is_sibling_entry(slot, node)) |
1327 | continue; | 1324 | continue; |
1328 | slot = node; | 1325 | slot = node; |
@@ -1367,7 +1364,7 @@ unsigned long radix_tree_locate_item(struct radix_tree_root *root, void *item) | |||
1367 | break; | 1364 | break; |
1368 | } | 1365 | } |
1369 | 1366 | ||
1370 | node = indirect_to_ptr(node); | 1367 | node = entry_to_node(node); |
1371 | 1368 | ||
1372 | max_index = node_maxindex(node); | 1369 | max_index = node_maxindex(node); |
1373 | if (cur_index > max_index) { | 1370 | if (cur_index > max_index) { |
@@ -1403,7 +1400,7 @@ static inline bool radix_tree_shrink(struct radix_tree_root *root) | |||
1403 | 1400 | ||
1404 | if (!radix_tree_is_indirect_ptr(to_free)) | 1401 | if (!radix_tree_is_indirect_ptr(to_free)) |
1405 | break; | 1402 | break; |
1406 | to_free = indirect_to_ptr(to_free); | 1403 | to_free = entry_to_node(to_free); |
1407 | 1404 | ||
1408 | /* | 1405 | /* |
1409 | * The candidate node has more than one child, or its child | 1406 | * The candidate node has more than one child, or its child |
@@ -1418,11 +1415,8 @@ static inline bool radix_tree_shrink(struct radix_tree_root *root) | |||
1418 | if (!radix_tree_is_indirect_ptr(slot) && to_free->shift) | 1415 | if (!radix_tree_is_indirect_ptr(slot) && to_free->shift) |
1419 | break; | 1416 | break; |
1420 | 1417 | ||
1421 | if (radix_tree_is_indirect_ptr(slot)) { | 1418 | if (radix_tree_is_indirect_ptr(slot)) |
1422 | slot = indirect_to_ptr(slot); | 1419 | entry_to_node(slot)->parent = NULL; |
1423 | slot->parent = NULL; | ||
1424 | slot = node_to_entry(slot); | ||
1425 | } | ||
1426 | 1420 | ||
1427 | /* | 1421 | /* |
1428 | * We don't need rcu_assign_pointer(), since we are simply | 1422 | * We don't need rcu_assign_pointer(), since we are simply |
@@ -1481,7 +1475,7 @@ bool __radix_tree_delete_node(struct radix_tree_root *root, | |||
1481 | struct radix_tree_node *parent; | 1475 | struct radix_tree_node *parent; |
1482 | 1476 | ||
1483 | if (node->count) { | 1477 | if (node->count) { |
1484 | if (node == indirect_to_ptr(root->rnode)) | 1478 | if (node == entry_to_node(root->rnode)) |
1485 | deleted |= radix_tree_shrink(root); | 1479 | deleted |= radix_tree_shrink(root); |
1486 | return deleted; | 1480 | return deleted; |
1487 | } | 1481 | } |