Message ID | 20240306104147.193052-4-peterx@redhat.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm/treewide: Remove pXd_huge() API | expand |
On Wed, Mar 06, 2024 at 06:41:37PM +0800, peterx@redhat.com wrote: > From: Peter Xu <peterx@redhat.com> > > Currently there should have no p4d swap entries so it may not matter much, > however this may help us to rule out swap entries in pXd_huge() API, which > will include p4d_huge(). The p4d_present() checks make it 100% clear that > we won't rely on p4d_huge() for swap entries. > > Signed-off-by: Peter Xu <peterx@redhat.com> > --- > mm/gup.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > p4dp = p4d_offset(pgdp, address); > p4d = READ_ONCE(*p4dp); > - if (p4d_none(p4d)) > + if (p4d_none(p4d) || !p4d_present(p4d)) > return no_page_table(vma, flags); Like the other place I think this makes more sense as if (!p4_present(p4d)) return no_page_table(vma, flags); Since none can never be present. IOW if the following code doesn't decode swap entries then it should be guarded with a chceck on present not none.. Jason
diff --git a/mm/gup.c b/mm/gup.c index 69a777f4fc5c..f87a7d90f2ae 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -776,7 +776,7 @@ static struct page *follow_p4d_mask(struct vm_area_struct *vma, p4dp = p4d_offset(pgdp, address); p4d = READ_ONCE(*p4dp); - if (p4d_none(p4d)) + if (p4d_none(p4d) || !p4d_present(p4d)) return no_page_table(vma, flags); BUILD_BUG_ON(p4d_huge(p4d)); if (unlikely(p4d_bad(p4d))) @@ -3069,7 +3069,7 @@ static int gup_p4d_range(pgd_t *pgdp, pgd_t pgd, unsigned long addr, unsigned lo p4d_t p4d = READ_ONCE(*p4dp); next = p4d_addr_end(addr, end); - if (p4d_none(p4d)) + if (p4d_none(p4d) || !p4d_present(p4d)) return 0; BUILD_BUG_ON(p4d_huge(p4d)); if (unlikely(is_hugepd(__hugepd(p4d_val(p4d))))) {