Message ID | 20240129070934.3717659-4-wangkefeng.wang@huawei.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm: migrate: support poison recover from migrate folio | expand |
On Mon, Jan 29, 2024 at 03:09:28PM +0800, Kefeng Wang wrote: > Convert migrate_folio_extra() to __migrate_folio() which will be used > by migrate_folio() and filemap_migrate_folio(), also directly call > folio_migrate_mapping() in __migrate_device_pages() to simplify code. This feels like two patches? First convert __migrate_device_pages() then do the other thing? > Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> > --- > include/linux/migrate.h | 2 -- > mm/migrate.c | 32 +++++++++++--------------------- > mm/migrate_device.c | 13 +++++++------ > 3 files changed, 18 insertions(+), 29 deletions(-) > > diff --git a/include/linux/migrate.h b/include/linux/migrate.h > index 2ce13e8a309b..517f70b70620 100644 > --- a/include/linux/migrate.h > +++ b/include/linux/migrate.h > @@ -63,8 +63,6 @@ extern const char *migrate_reason_names[MR_TYPES]; > #ifdef CONFIG_MIGRATION > > void putback_movable_pages(struct list_head *l); > -int migrate_folio_extra(struct address_space *mapping, struct folio *dst, > - struct folio *src, enum migrate_mode mode, int extra_count); > int migrate_folio(struct address_space *mapping, struct folio *dst, > struct folio *src, enum migrate_mode mode); > int migrate_pages(struct list_head *l, new_folio_t new, free_folio_t free, > diff --git a/mm/migrate.c b/mm/migrate.c > index cdae25b7105f..a51ceebbe3b1 100644 > --- a/mm/migrate.c > +++ b/mm/migrate.c > @@ -655,22 +655,24 @@ EXPORT_SYMBOL(folio_migrate_copy); > * Migration functions > ***********************************************************/ > > -int migrate_folio_extra(struct address_space *mapping, struct folio *dst, > - struct folio *src, enum migrate_mode mode, int extra_count) > +static int __migrate_folio(struct address_space *mapping, struct folio *dst, > + struct folio *src, enum migrate_mode mode, > + void *src_private) > { > int rc; > > - BUG_ON(folio_test_writeback(src)); /* Writeback must be complete */ > - > - rc = folio_migrate_mapping(mapping, dst, src, extra_count); > - > + rc = folio_migrate_mapping(mapping, dst, src, 0); > if (rc != MIGRATEPAGE_SUCCESS) > return rc; > > + if (src_private) > + folio_attach_private(dst, folio_detach_private(src)); > + > if (mode != MIGRATE_SYNC_NO_COPY) > folio_migrate_copy(dst, src); > else > folio_migrate_flags(dst, src); > + > return MIGRATEPAGE_SUCCESS; > } > > @@ -689,7 +691,8 @@ int migrate_folio_extra(struct address_space *mapping, struct folio *dst, > int migrate_folio(struct address_space *mapping, struct folio *dst, > struct folio *src, enum migrate_mode mode) > { > - return migrate_folio_extra(mapping, dst, src, mode, 0); > + BUG_ON(folio_test_writeback(src)); /* Writeback must be complete */ > + return __migrate_folio(mapping, dst, src, mode, NULL); > } > EXPORT_SYMBOL(migrate_folio); > > @@ -843,20 +846,7 @@ EXPORT_SYMBOL_GPL(buffer_migrate_folio_norefs); > int filemap_migrate_folio(struct address_space *mapping, > struct folio *dst, struct folio *src, enum migrate_mode mode) > { > - int ret; > - > - ret = folio_migrate_mapping(mapping, dst, src, 0); > - if (ret != MIGRATEPAGE_SUCCESS) > - return ret; > - > - if (folio_get_private(src)) > - folio_attach_private(dst, folio_detach_private(src)); > - > - if (mode != MIGRATE_SYNC_NO_COPY) > - folio_migrate_copy(dst, src); > - else > - folio_migrate_flags(dst, src); > - return MIGRATEPAGE_SUCCESS; > + return __migrate_folio(mapping, dst, src, mode, folio_get_private(src)); > } > EXPORT_SYMBOL_GPL(filemap_migrate_folio); > > diff --git a/mm/migrate_device.c b/mm/migrate_device.c > index d49a48d87d72..bea71d69295a 100644 > --- a/mm/migrate_device.c > +++ b/mm/migrate_device.c > @@ -695,7 +695,7 @@ static void __migrate_device_pages(unsigned long *src_pfns, > struct page *page = migrate_pfn_to_page(src_pfns[i]); > struct address_space *mapping; > struct folio *newfolio, *folio; > - int r; > + int r, extra_cnt = 0; > > if (!newpage) { > src_pfns[i] &= ~MIGRATE_PFN_MIGRATE; > @@ -757,14 +757,15 @@ static void __migrate_device_pages(unsigned long *src_pfns, > continue; > } > > + BUG_ON(folio_test_writeback(folio)); > + > if (migrate && migrate->fault_page == page) > - r = migrate_folio_extra(mapping, newfolio, folio, > - MIGRATE_SYNC_NO_COPY, 1); > - else > - r = migrate_folio(mapping, newfolio, folio, > - MIGRATE_SYNC_NO_COPY); > + extra_cnt = 1; > + r = folio_migrate_mapping(mapping, newfolio, folio, extra_cnt); > if (r != MIGRATEPAGE_SUCCESS) > src_pfns[i] &= ~MIGRATE_PFN_MIGRATE; > + else > + folio_migrate_flags(newfolio, folio); > } > > if (notified) > -- > 2.27.0 >
On 2024/2/2 4:09, Matthew Wilcox wrote: > On Mon, Jan 29, 2024 at 03:09:28PM +0800, Kefeng Wang wrote: >> Convert migrate_folio_extra() to __migrate_folio() which will be used >> by migrate_folio() and filemap_migrate_folio(), also directly call >> folio_migrate_mapping() in __migrate_device_pages() to simplify code. > > This feels like two patches? First convert __migrate_device_pages() > then do the other thing? That will be better, will split it, thanks > >> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> >> --- >> include/linux/migrate.h | 2 -- >> mm/migrate.c | 32 +++++++++++--------------------- >> mm/migrate_device.c | 13 +++++++------ >> 3 files changed, 18 insertions(+), 29 deletions(-) >> >> diff --git a/include/linux/migrate.h b/include/linux/migrate.h >> index 2ce13e8a309b..517f70b70620 100644 >> --- a/include/linux/migrate.h >> +++ b/include/linux/migrate.h >> @@ -63,8 +63,6 @@ extern const char *migrate_reason_names[MR_TYPES]; >> #ifdef CONFIG_MIGRATION >> >> void putback_movable_pages(struct list_head *l); >> -int migrate_folio_extra(struct address_space *mapping, struct folio *dst, >> - struct folio *src, enum migrate_mode mode, int extra_count); >> int migrate_folio(struct address_space *mapping, struct folio *dst, >> struct folio *src, enum migrate_mode mode); >> int migrate_pages(struct list_head *l, new_folio_t new, free_folio_t free, >> diff --git a/mm/migrate.c b/mm/migrate.c >> index cdae25b7105f..a51ceebbe3b1 100644 >> --- a/mm/migrate.c >> +++ b/mm/migrate.c >> @@ -655,22 +655,24 @@ EXPORT_SYMBOL(folio_migrate_copy); >> * Migration functions >> ***********************************************************/ >> >> -int migrate_folio_extra(struct address_space *mapping, struct folio *dst, >> - struct folio *src, enum migrate_mode mode, int extra_count) >> +static int __migrate_folio(struct address_space *mapping, struct folio *dst, >> + struct folio *src, enum migrate_mode mode, >> + void *src_private) >> { >> int rc; >> >> - BUG_ON(folio_test_writeback(src)); /* Writeback must be complete */ >> - >> - rc = folio_migrate_mapping(mapping, dst, src, extra_count); >> - >> + rc = folio_migrate_mapping(mapping, dst, src, 0); >> if (rc != MIGRATEPAGE_SUCCESS) >> return rc; >> >> + if (src_private) >> + folio_attach_private(dst, folio_detach_private(src)); >> + >> if (mode != MIGRATE_SYNC_NO_COPY) >> folio_migrate_copy(dst, src); >> else >> folio_migrate_flags(dst, src); >> + >> return MIGRATEPAGE_SUCCESS; >> } >> >> @@ -689,7 +691,8 @@ int migrate_folio_extra(struct address_space *mapping, struct folio *dst, >> int migrate_folio(struct address_space *mapping, struct folio *dst, >> struct folio *src, enum migrate_mode mode) >> { >> - return migrate_folio_extra(mapping, dst, src, mode, 0); >> + BUG_ON(folio_test_writeback(src)); /* Writeback must be complete */ >> + return __migrate_folio(mapping, dst, src, mode, NULL); >> } >> EXPORT_SYMBOL(migrate_folio); >> >> @@ -843,20 +846,7 @@ EXPORT_SYMBOL_GPL(buffer_migrate_folio_norefs); >> int filemap_migrate_folio(struct address_space *mapping, >> struct folio *dst, struct folio *src, enum migrate_mode mode) >> { >> - int ret; >> - >> - ret = folio_migrate_mapping(mapping, dst, src, 0); >> - if (ret != MIGRATEPAGE_SUCCESS) >> - return ret; >> - >> - if (folio_get_private(src)) >> - folio_attach_private(dst, folio_detach_private(src)); >> - >> - if (mode != MIGRATE_SYNC_NO_COPY) >> - folio_migrate_copy(dst, src); >> - else >> - folio_migrate_flags(dst, src); >> - return MIGRATEPAGE_SUCCESS; >> + return __migrate_folio(mapping, dst, src, mode, folio_get_private(src)); >> } >> EXPORT_SYMBOL_GPL(filemap_migrate_folio); >> >> diff --git a/mm/migrate_device.c b/mm/migrate_device.c >> index d49a48d87d72..bea71d69295a 100644 >> --- a/mm/migrate_device.c >> +++ b/mm/migrate_device.c >> @@ -695,7 +695,7 @@ static void __migrate_device_pages(unsigned long *src_pfns, >> struct page *page = migrate_pfn_to_page(src_pfns[i]); >> struct address_space *mapping; >> struct folio *newfolio, *folio; >> - int r; >> + int r, extra_cnt = 0; >> >> if (!newpage) { >> src_pfns[i] &= ~MIGRATE_PFN_MIGRATE; >> @@ -757,14 +757,15 @@ static void __migrate_device_pages(unsigned long *src_pfns, >> continue; >> } >> >> + BUG_ON(folio_test_writeback(folio)); >> + >> if (migrate && migrate->fault_page == page) >> - r = migrate_folio_extra(mapping, newfolio, folio, >> - MIGRATE_SYNC_NO_COPY, 1); >> - else >> - r = migrate_folio(mapping, newfolio, folio, >> - MIGRATE_SYNC_NO_COPY); >> + extra_cnt = 1; >> + r = folio_migrate_mapping(mapping, newfolio, folio, extra_cnt); >> if (r != MIGRATEPAGE_SUCCESS) >> src_pfns[i] &= ~MIGRATE_PFN_MIGRATE; >> + else >> + folio_migrate_flags(newfolio, folio); >> } >> >> if (notified) >> -- >> 2.27.0 >>
diff --git a/include/linux/migrate.h b/include/linux/migrate.h index 2ce13e8a309b..517f70b70620 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h @@ -63,8 +63,6 @@ extern const char *migrate_reason_names[MR_TYPES]; #ifdef CONFIG_MIGRATION void putback_movable_pages(struct list_head *l); -int migrate_folio_extra(struct address_space *mapping, struct folio *dst, - struct folio *src, enum migrate_mode mode, int extra_count); int migrate_folio(struct address_space *mapping, struct folio *dst, struct folio *src, enum migrate_mode mode); int migrate_pages(struct list_head *l, new_folio_t new, free_folio_t free, diff --git a/mm/migrate.c b/mm/migrate.c index cdae25b7105f..a51ceebbe3b1 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -655,22 +655,24 @@ EXPORT_SYMBOL(folio_migrate_copy); * Migration functions ***********************************************************/ -int migrate_folio_extra(struct address_space *mapping, struct folio *dst, - struct folio *src, enum migrate_mode mode, int extra_count) +static int __migrate_folio(struct address_space *mapping, struct folio *dst, + struct folio *src, enum migrate_mode mode, + void *src_private) { int rc; - BUG_ON(folio_test_writeback(src)); /* Writeback must be complete */ - - rc = folio_migrate_mapping(mapping, dst, src, extra_count); - + rc = folio_migrate_mapping(mapping, dst, src, 0); if (rc != MIGRATEPAGE_SUCCESS) return rc; + if (src_private) + folio_attach_private(dst, folio_detach_private(src)); + if (mode != MIGRATE_SYNC_NO_COPY) folio_migrate_copy(dst, src); else folio_migrate_flags(dst, src); + return MIGRATEPAGE_SUCCESS; } @@ -689,7 +691,8 @@ int migrate_folio_extra(struct address_space *mapping, struct folio *dst, int migrate_folio(struct address_space *mapping, struct folio *dst, struct folio *src, enum migrate_mode mode) { - return migrate_folio_extra(mapping, dst, src, mode, 0); + BUG_ON(folio_test_writeback(src)); /* Writeback must be complete */ + return __migrate_folio(mapping, dst, src, mode, NULL); } EXPORT_SYMBOL(migrate_folio); @@ -843,20 +846,7 @@ EXPORT_SYMBOL_GPL(buffer_migrate_folio_norefs); int filemap_migrate_folio(struct address_space *mapping, struct folio *dst, struct folio *src, enum migrate_mode mode) { - int ret; - - ret = folio_migrate_mapping(mapping, dst, src, 0); - if (ret != MIGRATEPAGE_SUCCESS) - return ret; - - if (folio_get_private(src)) - folio_attach_private(dst, folio_detach_private(src)); - - if (mode != MIGRATE_SYNC_NO_COPY) - folio_migrate_copy(dst, src); - else - folio_migrate_flags(dst, src); - return MIGRATEPAGE_SUCCESS; + return __migrate_folio(mapping, dst, src, mode, folio_get_private(src)); } EXPORT_SYMBOL_GPL(filemap_migrate_folio); diff --git a/mm/migrate_device.c b/mm/migrate_device.c index d49a48d87d72..bea71d69295a 100644 --- a/mm/migrate_device.c +++ b/mm/migrate_device.c @@ -695,7 +695,7 @@ static void __migrate_device_pages(unsigned long *src_pfns, struct page *page = migrate_pfn_to_page(src_pfns[i]); struct address_space *mapping; struct folio *newfolio, *folio; - int r; + int r, extra_cnt = 0; if (!newpage) { src_pfns[i] &= ~MIGRATE_PFN_MIGRATE; @@ -757,14 +757,15 @@ static void __migrate_device_pages(unsigned long *src_pfns, continue; } + BUG_ON(folio_test_writeback(folio)); + if (migrate && migrate->fault_page == page) - r = migrate_folio_extra(mapping, newfolio, folio, - MIGRATE_SYNC_NO_COPY, 1); - else - r = migrate_folio(mapping, newfolio, folio, - MIGRATE_SYNC_NO_COPY); + extra_cnt = 1; + r = folio_migrate_mapping(mapping, newfolio, folio, extra_cnt); if (r != MIGRATEPAGE_SUCCESS) src_pfns[i] &= ~MIGRATE_PFN_MIGRATE; + else + folio_migrate_flags(newfolio, folio); } if (notified)
Convert migrate_folio_extra() to __migrate_folio() which will be used by migrate_folio() and filemap_migrate_folio(), also directly call folio_migrate_mapping() in __migrate_device_pages() to simplify code. Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> --- include/linux/migrate.h | 2 -- mm/migrate.c | 32 +++++++++++--------------------- mm/migrate_device.c | 13 +++++++------ 3 files changed, 18 insertions(+), 29 deletions(-)