lkml.org 
[lkml]   [2022]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 16/19] hugetlb: Convert to migrate_folio
    Date
    This involves converting migrate_huge_page_move_mapping().  We also need a
    folio variant of hugetlb_set_page_subpool(), but that's for a later patch.

    Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    ---
    fs/hugetlbfs/inode.c | 23 ++++++++++++++---------
    include/linux/migrate.h | 6 +++---
    mm/migrate.c | 18 +++++++++---------
    3 files changed, 26 insertions(+), 21 deletions(-)

    diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
    index 14d33f725e05..eca1d0fabd7e 100644
    --- a/fs/hugetlbfs/inode.c
    +++ b/fs/hugetlbfs/inode.c
    @@ -954,28 +954,33 @@ static int hugetlbfs_symlink(struct user_namespace *mnt_userns,
    return error;
    }

    -static int hugetlbfs_migrate_page(struct address_space *mapping,
    - struct page *newpage, struct page *page,
    +#ifdef CONFIG_MIGRATION
    +static int hugetlbfs_migrate_folio(struct address_space *mapping,
    + struct folio *dst, struct folio *src,
    enum migrate_mode mode)
    {
    int rc;

    - rc = migrate_huge_page_move_mapping(mapping, newpage, page);
    + rc = migrate_huge_page_move_mapping(mapping, dst, src);
    if (rc != MIGRATEPAGE_SUCCESS)
    return rc;

    - if (hugetlb_page_subpool(page)) {
    - hugetlb_set_page_subpool(newpage, hugetlb_page_subpool(page));
    - hugetlb_set_page_subpool(page, NULL);
    + if (hugetlb_page_subpool(&src->page)) {
    + hugetlb_set_page_subpool(&dst->page,
    + hugetlb_page_subpool(&src->page));
    + hugetlb_set_page_subpool(&src->page, NULL);
    }

    if (mode != MIGRATE_SYNC_NO_COPY)
    - migrate_page_copy(newpage, page);
    + folio_migrate_copy(dst, src);
    else
    - migrate_page_states(newpage, page);
    + folio_migrate_flags(dst, src);

    return MIGRATEPAGE_SUCCESS;
    }
    +#else
    +#define hugetlbfs_migrate_folio NULL
    +#endif

    static int hugetlbfs_error_remove_page(struct address_space *mapping,
    struct page *page)
    @@ -1142,7 +1147,7 @@ static const struct address_space_operations hugetlbfs_aops = {
    .write_begin = hugetlbfs_write_begin,
    .write_end = hugetlbfs_write_end,
    .dirty_folio = noop_dirty_folio,
    - .migratepage = hugetlbfs_migrate_page,
    + .migrate_folio = hugetlbfs_migrate_folio,
    .error_remove_page = hugetlbfs_error_remove_page,
    };

    diff --git a/include/linux/migrate.h b/include/linux/migrate.h
    index 82f00ad69a54..59d64a1e6b4b 100644
    --- a/include/linux/migrate.h
    +++ b/include/linux/migrate.h
    @@ -42,8 +42,8 @@ extern int isolate_movable_page(struct page *page, isolate_mode_t mode);

    extern void migrate_page_states(struct page *newpage, struct page *page);
    extern void migrate_page_copy(struct page *newpage, struct page *page);
    -extern int migrate_huge_page_move_mapping(struct address_space *mapping,
    - struct page *newpage, struct page *page);
    +int migrate_huge_page_move_mapping(struct address_space *mapping,
    + struct folio *dst, struct folio *src);
    extern int migrate_page_move_mapping(struct address_space *mapping,
    struct page *newpage, struct page *page, int extra_count);
    void migration_entry_wait_on_locked(swp_entry_t entry, pte_t *ptep,
    @@ -74,7 +74,7 @@ static inline void migrate_page_copy(struct page *newpage,
    struct page *page) {}

    static inline int migrate_huge_page_move_mapping(struct address_space *mapping,
    - struct page *newpage, struct page *page)
    + struct folio *dst, struct folio *src)
    {
    return -ENOSYS;
    }
    diff --git a/mm/migrate.c b/mm/migrate.c
    index 4d8115ca93bb..bed0de86f3ae 100644
    --- a/mm/migrate.c
    +++ b/mm/migrate.c
    @@ -474,26 +474,26 @@ EXPORT_SYMBOL(folio_migrate_mapping);
    * of folio_migrate_mapping().
    */
    int migrate_huge_page_move_mapping(struct address_space *mapping,
    - struct page *newpage, struct page *page)
    + struct folio *dst, struct folio *src)
    {
    - XA_STATE(xas, &mapping->i_pages, page_index(page));
    + XA_STATE(xas, &mapping->i_pages, folio_index(src));
    int expected_count;

    xas_lock_irq(&xas);
    - expected_count = 2 + page_has_private(page);
    - if (!page_ref_freeze(page, expected_count)) {
    + expected_count = 2 + folio_has_private(src);
    + if (!folio_ref_freeze(src, expected_count)) {
    xas_unlock_irq(&xas);
    return -EAGAIN;
    }

    - newpage->index = page->index;
    - newpage->mapping = page->mapping;
    + dst->index = src->index;
    + dst->mapping = src->mapping;

    - get_page(newpage);
    + folio_get(dst);

    - xas_store(&xas, newpage);
    + xas_store(&xas, dst);

    - page_ref_unfreeze(page, expected_count - 1);
    + folio_ref_unfreeze(src, expected_count - 1);

    xas_unlock_irq(&xas);

    --
    2.35.1
    \
     
     \ /
      Last update: 2022-06-08 17:17    [W:4.122 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site