On 2020-01-14 at 17:25 Michal Hocko wrote: >On Sat 11-01-20 10:18:05, Li Xinhai wrote: >> When check_pte, pfn of normal, hugetlbfs and THP page need be compared. >> The current implementation apply comparison as >> - normal 4K page: page_pfn <= pfn < page_pfn + 1 >> - hugetlbfs page: page_pfn <= pfn < page_pfn + HPAGE_PMD_NR >> - THP page: page_pfn <= pfn < page_pfn + HPAGE_PMD_NR >> in pfn_in_hpage. For hugetlbfs page, it should be >> page_pfn == pfn >> >> Now, change pfn_in_hpage to pfn_is_match to highlight that comparison >> is not only for THP and explicitly compare for these cases. > >Why is this important to do. I have asked and Mike had the same feeling >that the patch is missing any real justification. Why do we need this >change? It is great that you have dropped VM_BUG_ON btw. > I think it is important to make the code clear, as said, comparing hugetlbfs page in range page_pfn <= pfn < page_pfn + HPAGE_PMD_NR is confusion. >> Signed-off-by: Li Xinhai <lixinhai.lxh@xxxxxxxxx> >> Cc: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> >> Cc: Mike Kravetz <mike.kravetz@xxxxxxxxxx> >> Cc: Michal Hocko <mhocko@xxxxxxxxxx> >> Acked-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> >> --- >> mm/page_vma_mapped.c | 12 ++++++++---- >> 1 file changed, 8 insertions(+), 4 deletions(-) >> >> diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c >> index eff4b45..719c352 100644 >> --- a/mm/page_vma_mapped.c >> +++ b/mm/page_vma_mapped.c >> @@ -52,12 +52,16 @@ static bool map_pte(struct page_vma_mapped_walk *pvmw) >> return true; >> } >> >> -static inline bool pfn_in_hpage(struct page *hpage, unsigned long pfn) >> +static inline bool pfn_is_match(struct page *page, unsigned long pfn) >> { >> - unsigned long hpage_pfn = page_to_pfn(hpage); >> + unsigned long page_pfn = page_to_pfn(page); >> + >> + /* normal page and hugetlbfs page */ >> + if (!PageTransCompound(page) || PageHuge(page)) >> + return page_pfn == pfn; >> >> /* THP can be referenced by any subpage */ >> - return pfn >= hpage_pfn && pfn - hpage_pfn < hpage_nr_pages(hpage); >> + return pfn >= page_pfn && pfn - page_pfn < hpage_nr_pages(page); >> } >> >> /** >> @@ -108,7 +112,7 @@ static bool check_pte(struct page_vma_mapped_walk *pvmw) >> pfn = pte_pfn(*pvmw->pte); >> } >> >> - return pfn_in_hpage(pvmw->page, pfn); >> + return pfn_is_match(pvmw->page, pfn); >> } >> >> /** >> -- >> 1.8.3.1 > >-- >Michal Hocko >SUSE Labs