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

Re: [PATCH v3 4/20] PCI/P2PDMA: introduce helpers for dma_map_sg implementations

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



On 2021-09-28 4:05 p.m., Jason Gunthorpe wrote:
On Thu, Sep 16, 2021 at 05:40:44PM -0600, Logan Gunthorpe wrote:
quoted
+enum pci_p2pdma_map_type
+pci_p2pdma_map_segment(struct pci_p2pdma_map_state *state, struct device *dev,
+		       struct scatterlist *sg)
+{
+	if (state->pgmap != sg_page(sg)->pgmap) {
+		state->pgmap = sg_page(sg)->pgmap;
This has built into it an assumption that every page in the sg element
has the same pgmap, but AFAIK nothing enforces this rule? There is no
requirement that the HW has pfn gaps between the pgmaps linux decides
to create over it.
No, that's not a correct reading of the code. Every time there is a new
pagemap, this code calculates the mapping type and bus offset. If a page
comes along with a different page map,f it recalculates. This just
reduces the overhead so that the calculation is done only every time a
page with a different pgmap comes along and not doing it for every
single page.
At least sg_alloc_append_table_from_pages() and probably something in
the block world should be updated to not combine struct pages with
different pgmaps, and this should be documented in scatterlist.*
someplace.
There's no sane place to do this check. The code is designed to support
mappings with different pgmaps.

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