lkml.org 
[lkml]   [2018]   [Jun]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v14 25/74] page cache: Convert find_get_entries to XArray
    Date
    Slightly shorter and simpler code.

    Signed-off-by: Matthew Wilcox <willy@infradead.org>
    ---
    mm/filemap.c | 51 +++++++++++++++++++++++----------------------------
    1 file changed, 23 insertions(+), 28 deletions(-)

    diff --git a/mm/filemap.c b/mm/filemap.c
    index 6db3d35ff5f6..b49290131e85 100644
    --- a/mm/filemap.c
    +++ b/mm/filemap.c
    @@ -1578,53 +1578,48 @@ unsigned find_get_entries(struct address_space *mapping,
    pgoff_t start, unsigned int nr_entries,
    struct page **entries, pgoff_t *indices)
    {
    - void **slot;
    + XA_STATE(xas, &mapping->i_pages, start);
    + struct page *page;
    unsigned int ret = 0;
    - struct radix_tree_iter iter;

    if (!nr_entries)
    return 0;

    rcu_read_lock();
    - radix_tree_for_each_slot(slot, &mapping->i_pages, &iter, start) {
    - struct page *head, *page;
    -repeat:
    - page = radix_tree_deref_slot(slot);
    - if (unlikely(!page))
    + xas_for_each(&xas, page, ULONG_MAX) {
    + struct page *head;
    + if (xas_retry(&xas, page))
    continue;
    - if (radix_tree_exception(page)) {
    - if (radix_tree_deref_retry(page)) {
    - slot = radix_tree_iter_retry(&iter);
    - continue;
    - }
    - /*
    - * A shadow entry of a recently evicted page, a swap
    - * entry from shmem/tmpfs or a DAX entry. Return it
    - * without attempting to raise page count.
    - */
    + /*
    + * A shadow entry of a recently evicted page, a swap
    + * entry from shmem/tmpfs or a DAX entry. Return it
    + * without attempting to raise page count.
    + */
    + if (xa_is_value(page))
    goto export;
    - }

    head = compound_head(page);
    if (!page_cache_get_speculative(head))
    - goto repeat;
    + goto retry;

    /* The page was split under us? */
    - if (compound_head(page) != head) {
    - put_page(head);
    - goto repeat;
    - }
    + if (compound_head(page) != head)
    + goto put_page;

    /* Has the page moved? */
    - if (unlikely(page != *slot)) {
    - put_page(head);
    - goto repeat;
    - }
    + if (unlikely(page != xas_reload(&xas)))
    + goto put_page;
    +
    export:
    - indices[ret] = iter.index;
    + indices[ret] = xas.xa_index;
    entries[ret] = page;
    if (++ret == nr_entries)
    break;
    + continue;
    +put_page:
    + put_page(head);
    +retry:
    + xas_reset(&xas);
    }
    rcu_read_unlock();
    return ret;
    --
    2.17.1
    \
     
     \ /
      Last update: 2018-06-17 04:18    [W:4.059 / U:0.160 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site