From a6340a55eaa82a045edb652298173f989bb7a5df Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Tue, 8 Mar 2016 16:12:46 -0900 Subject: mm: Refactor find_get_pages() & friends Collapse redundant implementations of various gang pagecache lookup - this is also prep work for pagecache iterators, in the next patch. This gives us a single common interface (__find_get_pages()) that the pagecache iterator will make use of. Signed-off-by: Kent Overstreet Cc: Al Viro --- include/linux/radix-tree.h | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) (limited to 'include/linux/radix-tree.h') diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h index eca6f626c16e..a83a42770f41 100644 --- a/include/linux/radix-tree.h +++ b/include/linux/radix-tree.h @@ -354,6 +354,8 @@ static inline unsigned int iter_shift(struct radix_tree_iter *iter) #define RADIX_TREE_ITER_TAG_MASK 0x00FF /* tag index in lower byte */ #define RADIX_TREE_ITER_TAGGED 0x0100 /* lookup tagged slots */ #define RADIX_TREE_ITER_CONTIG 0x0200 /* stop at first hole */ +#define RADIX_TREE_ITER_EXCEPTIONAL 0x0400 /* include exceptional entries */ + /* used by __find_get_pages() */ /** * radix_tree_iter_init - initialize radix tree iterator @@ -520,6 +522,11 @@ radix_tree_next_slot(void **slot, struct radix_tree_iter *iter, unsigned flags) return NULL; } +#define __radix_tree_for_each_slot(slot, root, iter, start, flags) \ + for (slot = radix_tree_iter_init(iter, start) ; \ + slot || (slot = radix_tree_next_chunk(root, iter, flags)); \ + slot = radix_tree_next_slot(slot, iter, flags)) + /** * radix_tree_for_each_slot - iterate over non-empty slots * @@ -531,9 +538,7 @@ radix_tree_next_slot(void **slot, struct radix_tree_iter *iter, unsigned flags) * @slot points to radix tree slot, @iter->index contains its index. */ #define radix_tree_for_each_slot(slot, root, iter, start) \ - for (slot = radix_tree_iter_init(iter, start) ; \ - slot || (slot = radix_tree_next_chunk(root, iter, 0)) ; \ - slot = radix_tree_next_slot(slot, iter, 0)) + __radix_tree_for_each_slot(slot, root, iter, start, 0) /** * radix_tree_for_each_contig - iterate over contiguous slots @@ -546,11 +551,8 @@ radix_tree_next_slot(void **slot, struct radix_tree_iter *iter, unsigned flags) * @slot points to radix tree slot, @iter->index contains its index. */ #define radix_tree_for_each_contig(slot, root, iter, start) \ - for (slot = radix_tree_iter_init(iter, start) ; \ - slot || (slot = radix_tree_next_chunk(root, iter, \ - RADIX_TREE_ITER_CONTIG)) ; \ - slot = radix_tree_next_slot(slot, iter, \ - RADIX_TREE_ITER_CONTIG)) + __radix_tree_for_each_slot(slot, root, iter, start, \ + RADIX_TREE_ITER_CONTIG) /** * radix_tree_for_each_tagged - iterate over tagged slots @@ -564,10 +566,7 @@ radix_tree_next_slot(void **slot, struct radix_tree_iter *iter, unsigned flags) * @slot points to radix tree slot, @iter->index contains its index. */ #define radix_tree_for_each_tagged(slot, root, iter, start, tag) \ - for (slot = radix_tree_iter_init(iter, start) ; \ - slot || (slot = radix_tree_next_chunk(root, iter, \ - RADIX_TREE_ITER_TAGGED | tag)) ; \ - slot = radix_tree_next_slot(slot, iter, \ - RADIX_TREE_ITER_TAGGED)) + __radix_tree_for_each_slot(slot, root, iter, start, \ + RADIX_TREE_ITER_TAGGED|tag) #endif /* _LINUX_RADIX_TREE_H */ -- cgit v1.2.3