-----"Christoph Hellwig" <hch@xxxxxx> wrote: ----- >To: "Jason Gunthorpe" <jgg@xxxxxxxx> >From: "Christoph Hellwig" <hch@xxxxxx> >Date: 11/04/2020 03:02PM >Cc: "Christoph Hellwig" <hch@xxxxxx>, "Bjorn Helgaas" ><bhelgaas@xxxxxxxxxx>, "Logan Gunthorpe" <logang@xxxxxxxxxxxx>, >linux-rdma@xxxxxxxxxxxxxxx, linux-pci@xxxxxxxxxxxxxxx, >iommu@xxxxxxxxxxxxxxxxxxxxxxxxxx >Subject: [EXTERNAL] Re: [PATCH 2/5] RDMA/core: remove use of >dma_virt_ops > >On Wed, Nov 04, 2020 at 09:42:41AM -0400, Jason Gunthorpe wrote: >> On Wed, Nov 04, 2020 at 10:50:49AM +0100, Christoph Hellwig wrote: >> >> > +int ib_dma_virt_map_sg(struct ib_device *dev, struct scatterlist >*sg, int nents) >> > +{ >> > + struct scatterlist *s; >> > + int i; >> > + >> > + for_each_sg(sg, s, nents, i) { >> > + sg_dma_address(s) = (uintptr_t)sg_virt(s); >> > + sg_dma_len(s) = s->length; >> >> Hmm.. There is nothing ensuring the page is mapped here for this >> sg_virt(). Before maybe some of the kconfig stuff prevented highmem >> systems indirectly, I wonder if we should add something more direct >to >> exclude highmem for these drivers? > >I had actually noticed this earlier as well and then completely >forgot >about it.. > >rdmavt depends on X86_64, so it can't be used with highmem, but for >rxe and siw there weren't any such dependencies so I think we were >just >lucky. Let me send a fix to add explicit depencies and then respin >this >series on top of that.. > >> Sigh. I think the proper fix is to replace addr/length with a >> scatterlist pointer in the struct ib_sge, then have SW drivers >> directly use the page pointer properly. > >The proper fix is to move the DMA mapping into the RDMA core, yes. >And as you said it will be hard. But I don't think scatterlists >are the right interface. IMHO we can keep re-use the existing >struct ib_sge: > >struct ib_ge { > u64 addr; > u32 length; > u32 lkey; >}; > >with the difference that if lkey is not a MR, addr is the physical >address of the memory, not a dma_addr_t or virtual address. > lkey of zero to pass a physical buffer, only allowed for kernel applications? Very nice idea I think. btw. It would even get the vain blessing of the old IETF RDMA verbs draft ;) https://tools.ietf.org/html/draft-hilland-rddp-verbs-00#page-90 (section '7.2.1 STag of zero' - read lkey for STag)