在 2020/2/22 13:23, Qian Cai 写道: > > >> On Feb 21, 2020, at 10:34 PM, Longpeng(Mike) <longpeng2@xxxxxxxxxx> wrote: >> >> diff --git a/mm/hugetlb.c b/mm/hugetlb.c >> index dd8737a..90daf37 100644 >> --- a/mm/hugetlb.c >> +++ b/mm/hugetlb.c >> @@ -4910,28 +4910,30 @@ pte_t *huge_pte_offset(struct mm_struct *mm, >> { >> pgd_t *pgd; >> p4d_t *p4d; >> - pud_t *pud; >> - pmd_t *pmd; >> + pud_t *pud, pud_entry; >> + pmd_t *pmd, pmd_entry; >> >> pgd = pgd_offset(mm, addr); >> - if (!pgd_present(*pgd)) >> + if (!pgd_present(READ_ONCE(*pgd))) >> return NULL; >> p4d = p4d_offset(pgd, addr); >> - if (!p4d_present(*p4d)) >> + if (!p4d_present(READ_ONCE(*p4d))) >> return NULL; > > What’s the point of READ_ONCE() on those two places? > As explained in the commit messages, it's for safe(e.g. avoid the compilier mischief). You can also find the same usage in the ARM64's huge_pte_offset() in arch/arm64/mm/hugetlbpage.c -- Regards, Longpeng(Mike)