Thread (87 messages) 87 messages, 8 authors, 2021-10-05

Re: [PATCH v3 19/20] PCI/P2PDMA: introduce pci_mmap_p2pmem()

flat view

From: Logan Gunthorpe <logang@deltatee.com>
Date: 2021-09-29 23:49:57
Also in: linux-iommu, linux-mm, linux-nvme, linux-pci, lkml


On 2021-09-29 5:35 p.m., Jason Gunthorpe wrote:
On Wed, Sep 29, 2021 at 05:27:22PM -0600, Logan Gunthorpe wrote:
quoted
quoted
finish_fault() should set the pte_devmap - eg by passing the
PFN_DEV|PFN_MAP somehow through the vma->vm_page_prot to mk_pte() or
otherwise signaling do_set_pte() that it should set those PTE bits
when it creates the entry.

(or there should be a vmf_* helper for this special case, but using
the vmf->page seems righter to me)
I'm not opposed to this. Though I'm not sure what's best here.
quoted
quoted
If we don't set pte_devmap(), then every single page that GUP
processes needs to check if it's a ZONE_DEVICE page and also if it's
a P2PDMA page (thus dereferencing pgmap) in order to satisfy the
requirements of FOLL_PCI_P2PDMA.
Definately not suggesting not to set pte_devmap(), only that
VM_MIXEDMAP should not be set on VMAs that only contain struct
pages. That is an abuse of what it is intended for.

At the very least there should be a big comment above the usage
explaining that this is just working around a limitation in
finish_fault() where it cannot set the PFN_DEV|PFN_MAP bits today.
Is it? Documentation on vmf_insert_mixed() and VM_MIXEDMAP is not good
and the intention is not clear. I got the impression that mm people
wanted those interfaces used for users of pte_devmap().
I thought VM_MIXEDMAP was quite clear:

#define VM_MIXEDMAP	0x10000000	/* Can contain "struct page" and pure PFN pages */

This VMA does not include PFN pages, so it should not be tagged
VM_MIXEDMAP.

Aside from enabling the special vmf_ API, it only controls some
special behavior in vm_normal_page:

 * VM_MIXEDMAP mappings can likewise contain memory with or without "struct
 * page" backing, however the difference is that _all_ pages with a struct
 * page (that is, those where pfn_valid is true) are refcounted and considered
 * normal pages by the VM. The disadvantage is that pages are refcounted
 * (which can be slower and simply not an option for some PFNMAP users). The
 * advantage is that we don't have to follow the strict linearity rule of
 * PFNMAP mappings in order to support COWable mappings.

Which again does not describe this case.
Some of this seems out of date. Pretty sure the pages are not refcounted
with vmf_insert_mixed() and vmf_insert_mixed() is currently the only way
to use VM_MIXEDMAP mappings.
quoted
device-dax uses these interfaces and as far as I can see it also only
contains struct pages (or at least  dev_dax_huge_fault() calls
pfn_to_page() on every page when VM_FAULT_NOPAGE happens).
hacky hacky :)

I think DAX probably did it that way for the same reason you are
doing it that way - no other choice without changing something
Sure but if you look at other vmf_insert_mixed() (of which there are
few) you see similar patterns. Seems more like it was documented with
one thing in mind but then used in a completely different manner. Which
is why I suggested the documentation was not so good.

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