lkml.org 
[lkml]   [2018]   [Jun]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v13 23/72] page cache: Convert find_get_entry to XArray
    Date
    From: Matthew Wilcox <mawilcox@microsoft.com>

    Slightly shorter and simpler code.

    Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
    ---
    mm/filemap.c | 63 +++++++++++++++++++++++-----------------------------
    1 file changed, 28 insertions(+), 35 deletions(-)

    diff --git a/mm/filemap.c b/mm/filemap.c
    index 7cdb1d4b8117..6db3d35ff5f6 100644
    --- a/mm/filemap.c
    +++ b/mm/filemap.c
    @@ -1382,47 +1382,40 @@ EXPORT_SYMBOL(page_cache_prev_gap);
    */
    struct page *find_get_entry(struct address_space *mapping, pgoff_t offset)
    {
    - void **pagep;
    + XA_STATE(xas, &mapping->i_pages, offset);
    struct page *head, *page;

    rcu_read_lock();
    repeat:
    - page = NULL;
    - pagep = radix_tree_lookup_slot(&mapping->i_pages, offset);
    - if (pagep) {
    - page = radix_tree_deref_slot(pagep);
    - if (unlikely(!page))
    - goto out;
    - if (radix_tree_exception(page)) {
    - if (radix_tree_deref_retry(page))
    - goto repeat;
    - /*
    - * A shadow entry of a recently evicted page,
    - * or a swap entry from shmem/tmpfs. Return
    - * it without attempting to raise page count.
    - */
    - goto out;
    - }
    + xas_reset(&xas);
    + page = xas_load(&xas);
    + if (xas_retry(&xas, page))
    + goto repeat;
    + /*
    + * A shadow entry of a recently evicted page, or a swap entry from
    + * shmem/tmpfs. Return it without attempting to raise page count.
    + */
    + if (!page || xa_is_value(page))
    + goto out;

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

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

    - /*
    - * Has the page moved?
    - * This is part of the lockless pagecache protocol. See
    - * include/linux/pagemap.h for details.
    - */
    - if (unlikely(page != *pagep)) {
    - put_page(head);
    - goto repeat;
    - }
    + /*
    + * Has the page moved?
    + * This is part of the lockless pagecache protocol. See
    + * include/linux/pagemap.h for details.
    + */
    + if (unlikely(page != xas_reload(&xas))) {
    + put_page(head);
    + goto repeat;
    }
    out:
    rcu_read_unlock();
    @@ -1453,7 +1446,7 @@ struct page *find_lock_entry(struct address_space *mapping, pgoff_t offset)

    repeat:
    page = find_get_entry(mapping, offset);
    - if (page && !radix_tree_exception(page)) {
    + if (page && !xa_is_value(page)) {
    lock_page(page);
    /* Has the page been truncated? */
    if (unlikely(page_mapping(page) != mapping)) {
    --
    2.17.1
    \
     
     \ /
      Last update: 2018-06-11 16:21    [W:4.104 / U:0.240 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site