Thread (59 messages) 59 messages, 8 authors, 2025-06-12

Re: [PATCH 07/12] mm: Remove redundant pXd_devmap calls

From: David Hildenbrand <hidden>
Date: 2025-06-05 17:04:54
Also in: dri-devel, linux-arm-kernel, linux-cxl, linux-ext4, linux-fsdevel, linux-mm, linux-riscv, linux-xfs, lkml, loongarch, nvdimm

On 05.06.25 18:30, Dan Williams wrote:
David Hildenbrand wrote:
quoted
On 05.06.25 14:09, Jason Gunthorpe wrote:
quoted
On Wed, Jun 04, 2025 at 07:35:24PM -0700, Dan Williams wrote:
quoted
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?
quoted
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.
quoted
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.
quoted
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().
The thing is, in vm_normal_page() if we have CONFIG_ARCH_HAS_PTE_SPECIAL 
-- which loongarch sets -- if we don't see pte_special(), we will assume 
that it is refcounted.

	if (likely(!pte_special(pte))
		goto check_pfn;

So if pte_mkdevmap() does not set pte_special(), then ... 
vm_normal_page() would detect it as normal, although it isn't normal?

But maybe I am missing something important.

-- 
Cheers,

David / dhildenb

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help