David Hildenbrand wrote: > On 05.06.25 14:09, Jason Gunthorpe wrote: > > On Wed, Jun 04, 2025 at 07:35:24PM -0700, Dan Williams wrote: > > > >> 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. > > > > That seems really suboptimal?? Why would pmd and pte be different? > > > >> I think for any p[mu]d where p[mu]d_page() is ok to use should never set > >> 'special', right? > > > > There should be dedicated functions for installing pages and PFNs, > > only the PFN one would set the special bit. > > > > And certainly your tests *should* be failing as special entries should > > never ever be converted to struct page. > > Worth reviewing [1] where I clean that up and describe the current > impact. ;)
Will do. > What's even worse about this pte_devmap()/pmd_devmap()/... shit (sorry! > but it's absolute shit) is that some pte_mkdev() set the pte special, > while others ... don't. As the person who started the turd rolling into this pile that Alistair is heroically cleaning up, I approve this characterization. > E.g., loongarch > > static inline pte_t pte_mkdevmap(pte_t pte) { pte_val(pte) |= > _PAGE_DEVMAP; return pte; } > > I don't even know how it can (could) survive vm_normal_page(). Presently "can" because dax switched away from vmf_insert_mixed() to vmf_insert_page(), "could" in the past was the devmap hack to avoid treating VM_MIXEDMAP as !vm_normal_page().