aboutsummaryrefslogtreecommitdiffstats
path: root/lib/radix-tree.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2016-02-04 08:57:44 +0100
committerIngo Molnar <mingo@kernel.org>2016-02-04 08:57:44 +0100
commitb83ea91f08f648460b08e8980560abdf96060a19 (patch)
tree1a6db205770ed7103afe0aa1234dec0b1227f380 /lib/radix-tree.c
parentMerge tag 'perf-core-for-mingo-3' of git://git.kernel.org/pub/scm/linux/kerne... (diff)
parentMerge tag 'perf-urgent-for-mingo-2' of git://git.kernel.org/pub/scm/linux/ker... (diff)
downloadlinux-b83ea91f08f648460b08e8980560abdf96060a19.tar.gz
linux-b83ea91f08f648460b08e8980560abdf96060a19.zip
Merge branch 'perf/urgent' into perf/core, to pick up fixes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'lib/radix-tree.c')
-rw-r--r--lib/radix-tree.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/radix-tree.c b/lib/radix-tree.c
index fcf5d98574ce..6b79e9026e24 100644
--- a/lib/radix-tree.c
+++ b/lib/radix-tree.c
@@ -1019,9 +1019,13 @@ radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
return 0;
radix_tree_for_each_slot(slot, root, &iter, first_index) {
- results[ret] = indirect_to_ptr(rcu_dereference_raw(*slot));
+ results[ret] = rcu_dereference_raw(*slot);
if (!results[ret])
continue;
+ if (radix_tree_is_indirect_ptr(results[ret])) {
+ slot = radix_tree_iter_retry(&iter);
+ continue;
+ }
if (++ret == max_items)
break;
}
@@ -1098,9 +1102,13 @@ radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results,
return 0;
radix_tree_for_each_tagged(slot, root, &iter, first_index, tag) {
- results[ret] = indirect_to_ptr(rcu_dereference_raw(*slot));
+ results[ret] = rcu_dereference_raw(*slot);
if (!results[ret])
continue;
+ if (radix_tree_is_indirect_ptr(results[ret])) {
+ slot = radix_tree_iter_retry(&iter);
+ continue;
+ }
if (++ret == max_items)
break;
}