Messages in this thread | | | Date | Wed, 30 Aug 2023 17:45:57 +0800 | Subject | Re: [PATCH v2 4/8] mm: migrate: use a folio in migrate_misplaced_page() | From | Kefeng Wang <> |
| |
On 2023/8/29 10:10, Matthew Wilcox wrote: > On Tue, Aug 29, 2023 at 08:49:31AM +0800, Huang, Ying wrote: >> Zi Yan <ziy@nvidia.com> writes: >> >>> On 21 Aug 2023, at 7:56, Kefeng Wang wrote: >>> >>>> Use a folio in migrate_misplaced_page() to save compound_head() calls. >>>> >>>> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> >>>> --- >>>> mm/migrate.c | 23 ++++++++++++----------- >>>> 1 file changed, 12 insertions(+), 11 deletions(-) >>> >>> LGTM. And a comment below. Reveiwed-by: Zi Yan <ziy@nvidia.com> >>> >>>> >>>> diff --git a/mm/migrate.c b/mm/migrate.c >>>> index 281eafdf8e63..fc728f9a383f 100644 >>>> --- a/mm/migrate.c >>>> +++ b/mm/migrate.c >>>> @@ -2521,17 +2521,18 @@ int migrate_misplaced_page(struct page *page, struct vm_area_struct *vma, >>>> int node) >>>> { >>>> pg_data_t *pgdat = NODE_DATA(node); >>>> + struct folio *folio = page_folio(page); >>>> int isolated; >>>> int nr_remaining; >>>> unsigned int nr_succeeded; >>>> LIST_HEAD(migratepages); >>>> - int nr_pages = thp_nr_pages(page); >>>> + int nr_pages = folio_nr_pages(folio); >>>> >>>> /* >>>> * Don't migrate file pages that are mapped in multiple processes >>>> * with execute permissions as they are probably shared libraries. >>>> */ >>>> - if (page_mapcount(page) != 1 && page_is_file_lru(page) && >>>> + if (page_mapcount(page) != 1 && folio_is_file_lru(folio) && >>> >>> page_mapcount() is not converted, since folio_mapcount() is not equivalent >>> to page_mapcount(). It can be converted and this function can be converted >>> to migrate_misplaced_folio() once we have something like folio_num_sharers(). >> >> It seems that we can use folio_estimated_sharers() here. > > So, funny thing, page_mapcount() was always wrong here. We have two > callers, do_huge_pmd_numa_page() and do_numa_page(). do_numa_page() > has a check for PageCompound() (and /* TODO: handle PTE-mapped THP */). > do_huge_pmd_numa_page() returns pfn_to_page(), after it got the pfn > fromm pmd_pfn(pmd).
for PMD-mapped page,do_huge_pmd_numa_page() return head page
unsigned long haddr = vmf->address & HPAGE_PMD_MASK; page = vm_normal_page_pmd(vma, haddr, pmd);
do_numa_page() only handle base page with PageCompound() check, so we could use folio_estimated_sharers(), I am not clear why page_mapcount is wrong here, could you explain more, thank.
> > That makes folio_estimated_sharers() an improvement, possibly even > a bugfix. Also, we should look at removing the PageCompound() check > in do_numa_page().
Yes, for pte-mapped thp and the large folio numa migrate support, we need remove the check, we could do it in another patchset.
> >
| |