[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <DD640D43-3101-4291-9882-57A89C74866E@nvidia.com>
Date: Tue, 11 May 2021 18:04:21 -0400
From: "Zi Yan" <ziy@...dia.com>
To: "Matthew Wilcox (Oracle)" <willy@...radead.org>
Cc: linux-mm@...ck.org, linux-kernel@...r.kernel.org
Subject: Re: [RFC PATCH 1/3] mm/migrate: Add folio_migrate_mapping
On 10 May 2021, at 19:23, Matthew Wilcox (Oracle) wrote:
> Reimplement migrate_page_move_mapping() as a wrapper around
> folio_migrate_mapping(). Saves 193 bytes of kernel text.
>
> Signed-off-by: Matthew Wilcox (Oracle) <willy@...radead.org>
> ---
> include/linux/migrate.h | 2 +
> mm/folio-compat.c | 11 ++++++
> mm/migrate.c | 85 +++++++++++++++++++++--------------------
> 3 files changed, 57 insertions(+), 41 deletions(-)
>
> diff --git a/include/linux/migrate.h b/include/linux/migrate.h
> index 4bb4e519e3f5..a4ff65e9c1e3 100644
> --- a/include/linux/migrate.h
> +++ b/include/linux/migrate.h
> @@ -51,6 +51,8 @@ extern int migrate_huge_page_move_mapping(struct address_space *mapping,
> struct page *newpage, struct page *page);
> extern int migrate_page_move_mapping(struct address_space *mapping,
> struct page *newpage, struct page *page, int extra_count);
> +int folio_migrate_mapping(struct address_space *mapping,
> + struct folio *newfolio, struct folio *folio, int extra_count);
> #else
>
> static inline void putback_movable_pages(struct list_head *l) {}
> diff --git a/mm/folio-compat.c b/mm/folio-compat.c
> index d229b979b00d..25c2269655f4 100644
> --- a/mm/folio-compat.c
> +++ b/mm/folio-compat.c
> @@ -4,6 +4,7 @@
> * eventually.
> */
>
> +#include <linux/migrate.h>
> #include <linux/pagemap.h>
> #include <linux/swap.h>
>
> @@ -60,3 +61,13 @@ void mem_cgroup_uncharge(struct page *page)
> folio_uncharge_cgroup(page_folio(page));
> }
> #endif
> +
> +#ifdef CONFIG_MIGRATION
> +int migrate_page_move_mapping(struct address_space *mapping,
> + struct page *newpage, struct page *page, int extra_count)
> +{
> + return folio_migrate_mapping(mapping, page_folio(newpage),
> + page_folio(page), extra_count);
> +}
> +EXPORT_SYMBOL(migrate_page_move_mapping);
> +#endif
> diff --git a/mm/migrate.c b/mm/migrate.c
> index fff63e139767..b668970acd11 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -355,7 +355,7 @@ static int expected_page_refs(struct address_space *mapping, struct page *page)
> */
> expected_count += is_device_private_page(page);
> if (mapping)
> - expected_count += thp_nr_pages(page) + page_has_private(page);
> + expected_count += compound_nr(page) + page_has_private(page);
Why this change? Is it because you are passing folio->page to expected_page_refs() below
and the nr_pages for the folio should be checked with folio_nr_pages() which just returns
compound_nr()?
The change seems to imply that folio can be compound page and migrated even when THP is
disabled. Is it the case or something else?
>
> return expected_count;
> }
> @@ -368,74 +368,75 @@ static int expected_page_refs(struct address_space *mapping, struct page *page)
> * 2 for pages with a mapping
> * 3 for pages with a mapping and PagePrivate/PagePrivate2 set.
> */
> -int migrate_page_move_mapping(struct address_space *mapping,
> - struct page *newpage, struct page *page, int extra_count)
> +int folio_migrate_mapping(struct address_space *mapping,
> + struct folio *newfolio, struct folio *folio, int extra_count)
> {
> - XA_STATE(xas, &mapping->i_pages, page_index(page));
> + XA_STATE(xas, &mapping->i_pages, folio_index(folio));
> struct zone *oldzone, *newzone;
> int dirty;
> - int expected_count = expected_page_refs(mapping, page) + extra_count;
> - int nr = thp_nr_pages(page);
> + int expected_count = expected_page_refs(mapping, &folio->page) + extra_count;
> + int nr = folio_nr_pages(folio);
—
Best Regards,
Yan Zi
Download attachment "signature.asc" of type "application/pgp-signature" (855 bytes)
Powered by blists - more mailing lists