Alistair Popple wrote: > DAX was the only thing that created pmd_devmap and pud_devmap entries > however it no longer does as DAX pages are now refcounted normally and > pXd_trans_huge() returns true for those. Therefore checking both pXd_devmap > and pXd_trans_huge() is redundant and the former can be removed without > changing behaviour as it will always be false. > > Signed-off-by: Alistair Popple <apop...@nvidia.com> [..] > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 8d9d706..31b4110 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -1398,10 +1398,7 @@ static int insert_pfn_pmd(struct vm_area_struct *vma, > unsigned long addr, > } > > entry = pmd_mkhuge(pfn_t_pmd(pfn, prot)); > - if (pfn_t_devmap(pfn)) > - entry = pmd_mkdevmap(entry); > - else > - entry = pmd_mkspecial(entry); > + entry = pmd_mkspecial(entry); > if (write) { > entry = pmd_mkyoung(pmd_mkdirty(entry)); > entry = maybe_pmd_mkwrite(entry, vma); > @@ -1535,10 +1530,7 @@ static void insert_pfn_pud(struct vm_area_struct *vma, > unsigned long addr, > } > > entry = pud_mkhuge(pfn_t_pud(pfn, prot)); > - if (pfn_t_devmap(pfn)) > - entry = pud_mkdevmap(entry); > - else > - entry = pud_mkspecial(entry); > + entry = pud_mkspecial(entry);
Wait, why are my gup tests passing? If all dax pages are special, then vm_normal_page() should never find them and gup should fail. ...oh, but vm_normal_page_p[mu]d() is not used in the gup path, and 'special' is not set in the pte path. Yuck, that feels subtle. I think for any p[mu]d where p[mu]d_page() is ok to use should never set 'special', right?