Hi Hugh,
On 02/04/2013 10:01 AM, Hugh Dickins wrote:
On Fri, 1 Feb 2013, Johannes Weiner wrote:

In shmem_find_get_pages_and_swap, use the faster radix tree iterator
construct from 78c1d78 "radix-tree: introduce bit-optimized iterator".

Signed-off-by: Johannes Weiner <han...@cmpxchg.org>
Yes, that looks fine, and is testing out fine, thanks.
Acked-by: Hugh Dickins <hu...@google.com>

Could you share your testcase with me? It seems that you always can test shmem patches.


---
  mm/shmem.c | 25 ++++++++++++-------------
  1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/mm/shmem.c b/mm/shmem.c
index a368a1c..c5dc8ae 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -336,19 +336,19 @@ static unsigned shmem_find_get_pages_and_swap(struct 
address_space *mapping,
                                        pgoff_t start, unsigned int nr_pages,
                                        struct page **pages, pgoff_t *indices)
  {
-       unsigned int i;
-       unsigned int ret;
-       unsigned int nr_found;
+       void **slot;
+       unsigned int ret = 0;
+       struct radix_tree_iter iter;
+
+       if (!nr_pages)
+               return 0;
rcu_read_lock();
  restart:
-       nr_found = radix_tree_gang_lookup_slot(&mapping->page_tree,
-                               (void ***)pages, indices, start, nr_pages);
-       ret = 0;
-       for (i = 0; i < nr_found; i++) {
+       radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, start) {
                struct page *page;
  repeat:
-               page = radix_tree_deref_slot((void **)pages[i]);
+               page = radix_tree_deref_slot(slot);
                if (unlikely(!page))
                        continue;
                if (radix_tree_exception(page)) {
@@ -365,17 +365,16 @@ static unsigned shmem_find_get_pages_and_swap(struct 
address_space *mapping,
                        goto repeat;
/* Has the page moved? */
-               if (unlikely(page != *((void **)pages[i]))) {
+               if (unlikely(page != *slot)) {
                        page_cache_release(page);
                        goto repeat;
                }
  export:
-               indices[ret] = indices[i];
+               indices[ret] = iter.index;
                pages[ret] = page;
-               ret++;
+               if (++ret == nr_pages)
+                       break;
        }
-       if (unlikely(!ret && nr_found))
-               goto restart;
        rcu_read_unlock();
        return ret;
  }
--
1.7.11.7
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majord...@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"d...@kvack.org";> em...@kvack.org </a>

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to