On 14 Aug 2023, at 23:56, Huang, Ying wrote: > Kefeng Wang <wangkefeng.wang@xxxxxxxxxx> writes: > >> On 2023/8/4 10:42, Zi Yan wrote: >>> On 3 Aug 2023, at 21:45, Kefeng Wang wrote: >>> >>>> On 2023/8/3 20:30, Matthew Wilcox wrote: >>>>> On Thu, Aug 03, 2023 at 03:13:21PM +0800, Kefeng Wang wrote: >>>>>> >>>>>> >>>>>> On 2023/8/2 20:21, Matthew Wilcox wrote: >>>>>>> On Wed, Aug 02, 2023 at 05:53:43PM +0800, Kefeng Wang wrote: >>>>>>>> err = -EACCES; >>>>>>>> - if (page_mapcount(page) > 1 && !migrate_all) >>>>>>>> - goto out_putpage; >>>>>>>> + if (folio_estimated_sharers(folio) > 1 && !migrate_all) >>>>>>>> + goto out_putfolio; >>>>>>> >>>>>>> I do not think this is the correct change. Maybe leave this line >>>>>>> alone. >>>>>> >>>>>> Ok, I am aware of the discussion about this in other mail, will not >>>>>> change it(also the next two patch about this function), or wait the >>>>>> new work of David. >>>>>>> >>>>>>>> - if (PageHuge(page)) { >>>>>>>> - if (PageHead(page)) { >>>>>>>> - isolated = isolate_hugetlb(page_folio(page), pagelist); >>>>>>>> + if (folio_test_hugetlb(folio)) { >>>>>>>> + if (folio_test_large(folio)) { >>>>>>> >>>>>>> This makes no sense when you read it. All hugetlb folios are large, >>>>>>> by definition. Think about what this code used to do, and what it >>>>>>> should be changed to. >>>>>> >>>>>> hugetlb folio is self large folio, will drop redundant check >>>>> >>>>> No, that's not the difference. Keep thinking about it. This is not >>>>> a mechanical translation! >>>> >>>> >>>> if (PageHuge(page)) // page must be a hugetlb page >>>> if (PageHead(page)) // page must be a head page, not tail >>>> isolate_hugetlb() // isolate the hugetlb page if head >>>> >>>> After using folio, >>>> >>>> if (folio_test_hugetlb(folio)) // only check folio is hugetlb or not >>>> >>>> I don't check the page is head or not, since the follow_page could >>>> return a sub-page, so the check PageHead need be retained, right? >>> Right. It will prevent the kernel from trying to isolate the same >>> hugetlb page >>> twice when two pages are in the same hugetlb folio. But looking at the >>> code, if you try to isolate an already-isolated hugetlb folio, isolate_hugetlb() >>> would return false, no error would show up. But it changes err value >>> from -EACCES to -EBUSY and user will see a different page status than before. >> >> >> When check man[1], the current -EACCES is not right, -EBUSY is not >> precise but more suitable for this scenario, >> >> -EACCES >> The page is mapped by multiple processes and can be moved >> only if MPOL_MF_MOVE_ALL is specified. >> >> -EBUSY The page is currently busy and cannot be moved. Try again >> later. This occurs if a page is undergoing I/O or another >> kernel subsystem is holding a reference to the page. >> -ENOENT >> The page is not present. >> >>> I wonder why we do not have follow_folio() and returns -ENOENT error >>> pointer >>> when addr points to a non head page. It would make this patch more folio if >>> follow_folio() can be used in place of follow_page(). One caveat is that >>> user will see -ENOENT instead of -EACCES after this change. >>> >> >> -ENOENT is ok, but maybe the man need to be updated too. >> >> >> >> [1] https://man7.org/linux/man-pages/man2/move_pages.2.html >> > > I don't think -ENOENT is appropriate. IIUC, -ENOENT means no need to > migrate. Which isn't the case here apparently. Are you referring to a comment or the man page? The man page says -ENOENT means the page is not present. Or you think it also implies there is no need to migrate? If yes, we probably need to update the man page. -- Best Regards, Yan, Zi
Attachment:
signature.asc
Description: OpenPGP digital signature